我是一个经验丰富的 yacc/野牛滥用者。我习惯于建造自己的树,然后遍历它们。所以,现在,切换到 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' 期待
引入 + 而不是 * 的各种尝试在其他方面都失败了。也许有关于 tree walker 究竟是如何为 * 和 + 工作的文档,但我没有找到它(比如某些人和冰箱?)。