私は経験豊富な yacc/bison 虐待者です。私は自分のツリーを構築し、それらをトラバースすることに慣れています。そこで、ANTLR3 に切り替えます (なぜ 3 なのですか? 4 は Python をサポートしていないためです!)... 構文は次のとおりです。
symbol : ID fields -> ^(NAME ID fields);
fields : (DOT ID)* -> ^(FIELD ID*);
そして、私のツリー文法フラグメントは次のとおりです。
names: ^(NAME id=. fields) ;
fields: ^(FIELD .*) ;
「let z = abc」の結果のツリーは次のとおりです。
(LETS (LET z (NAME a (FIELD b c))))
そしてウォーカーはこう言います。
行 1:10 からのノードが一致しない入力 u'b' が期待されます
* の代わりに + を導入しようとするさまざまな試みは、別の意味で失敗しました。ツリー ウォーカーが * と + に対してどのように機能するかについてのドキュメントがあるかもしれませんが、私はそれを見つけられませんでした (一部の人々や冷蔵庫のように?)。