TreeTop Ruby Parser-秩序化された選択を解析できませんでした
質問
以下のようにTreetopを使用して、文字列と番号を解析するための簡単な文法を定義しました。
grammar Simple
rule value
number / string
end
rule string
word space string
/
word
end
rule word
[0-9a-zA-Z]+
end
rule number
[1-9] [0-9]*
end
rule space
' '+
end
end
ルビー:
parser = SimpleParser.new
parser.parse('123abc wer') # => nil
パーサーが戻ってくると思います 文字列ノード しかし、パーサーのように見えます 理解できませんでした 入力。どんなアイデアも感謝しています。
解決
ツリートップ(および一般的にペグ)では、選択オペレーターは 順序付けられました, 、他のほとんどの解析形式とは異なります。
だから、で
rule value
number / string
end
あなたはツリートップにあなたを言っています 好む number
以上 string
.
あなたの入力は始まります 1
, 、一致します 両方とも number
と string
(終えた word
)、しかし、あなたはTreetopにそれを好むように言った number
解釈、それがそれをaとして解析します number
. 。それが来るとき a
入力には、適用するルールがなく、何も返されません(nil
)、TreeTopでは、入力ストリーム全体を消費しないことはエラーだからです。
選択の順序を単純に逆転させると、入力全体が string
aの代わりに number
:
SyntaxNode+String0 offset=0, "123abc wer" (word,space,string):
SyntaxNode offset=0, "123abc":
SyntaxNode offset=0, "1"
SyntaxNode offset=1, "2"
SyntaxNode offset=2, "3"
SyntaxNode offset=3, "a"
SyntaxNode offset=4, "b"
SyntaxNode offset=5, "c"
SyntaxNode offset=6, " ":
SyntaxNode offset=6, " "
SyntaxNode offset=7, "wer":
SyntaxNode offset=7, "w"
SyntaxNode offset=8, "e"
SyntaxNode offset=9, "r"
または、注文をそのまま保持することもできますが、 value
複数回一致するルール。このような新しいトップレベルのルールを挿入するか:
rule values
value+
end
または変更します value
このようなルール:
rule value
(number / string)+
end
これはあなたにこのようなASTを与えます:
SyntaxNode offset=0, "123abc wer":
SyntaxNode+Number0 offset=0, "123":
SyntaxNode offset=0, "1"
SyntaxNode offset=1, "23":
SyntaxNode offset=1, "2"
SyntaxNode offset=2, "3"
SyntaxNode+String0 offset=3, "abc wer" (word,space,string):
SyntaxNode offset=3, "abc":
SyntaxNode offset=3, "a"
SyntaxNode offset=4, "b"
SyntaxNode offset=5, "c"
SyntaxNode offset=6, " ":
SyntaxNode offset=6, " "
SyntaxNode offset=7, "wer":
SyntaxNode offset=7, "w"
SyntaxNode offset=8, "e"
SyntaxNode offset=9, "r"
所属していません StackOverflow