2017-11-09 5 views
0

私はANTLR 4.7を用いて、以下に示したものと同様のYAML構文の限定セットのためのパーサを構築しようとしています:Antlr4ハンドリング

name: 
    last: Smith 
    first: John 
    address: 
    street: 123 Main St 
      Suite 100 
    city: Boston 
    state: MA 
    zip: 12345 

私が由来文法を(持っていますPython 3文法)は、 "value"文字列の前後に引用符を入れても正しく動作しますが、それらを削除すると失敗します。新しいブロックの次の "tag:"部分または新しいassign文の "tag:"部分がトリックとなる前に、マッチングが終了するように "value"文字列を定義すると思われます。

このユースケースを処理するアイデアや作業サンプルはありますか?

答えて

0

空ではない線のインデントで、平らなスカラーのマッチングを終了する必要があります。そのインデントが現在のマッピングのインデントよりも大きくない場合、スカラーはそこで終了します。例えば

:それは現在のマッピング(上記mapping:のすなわち値)以上にインデントされていないため、ここで

mapping: 
    key: value with 
     multiple lines 
    key2: 
    other value 

value with multiple linesは、key2:の行で終了します。もちろん、最後の改行文字とインデントのkey2:はスカラーの内容の一部ではありません。 YAML仕様で

が、これは生産私たちのケースでは今

s-indent(n) ::= s-space × n 

によって処理され、あなたのスカラーが

plain-scalar-part (s-indent(3) s-white* plain-scalar-part)* 
のようなものにマッチしたことになるので、内側のマッピングは、 n=2のインデントを持っています

(Antlrの構文はわかりませんが、これらはすべて非端末であると仮定します)。 (おそらく空の)最初の行の後に、親マッピング(これは3つのスペース)以上のインデントに一致すると、空白(コンテンツの一部ではない)が存在する可能性があります。 。簡単にするために、私は空の行を無視しました。

これはインデントがあまりにも少ないため、key2:と一致しません。これは、スカラーのマッチングがどのように終了するかということです。

Antlrでs-indent(n)のようにする方法はわかりませんが、Python文法で正しいポインタが得られるはずです。