我有一个用antlr2语法编写的语法文件,需要帮助我理解如何用antlr4语法重写一些解析器规则。我知道antlr4消除了构建AST的需求,所以我不知道如何处理、AST、动作翻译、等规则。抗Tree树构建解释了一些语法和如何使用#构造,但我仍然不确定如何读取这些规则并重写它们。
temp_root :
temp { #temp_root = #([ROOT, "root"], #temp_root); } EOF;
temp :
c:temp_content
{ #temp = #(#([FUNCTION_CALL, "template"], #template), c);
reparent((MyAST)#temp, MyAST)#c); };
temp_content :
(foo | bar);
foo :
{
StringBuilder result = new StringBuilder("");
}
: (c:FOO! { result.append(c.getText()); } )+
{ #foo = #([TEMPLATE_STRING_LITERAL, result.toString()], #foo); };
bar :
BEGIN_BAR! expr END_BAR!
exception
catch [Exception x] {
bar_AST = handleException(x);
};发布于 2017-04-15 13:23:08
您无法操作生成的解析树(至少不使用语法代码),因此只需删除所有树重写内容(如果依赖于特定的树结构,则可能需要调整使用者代码)。还移除感叹号(表示不应该出现在AST中的令牌)。令人惊讶的是c:FOO部分。我不记得见过这个。但是从下面的操作代码来看,我想这是一个变量赋值,应该重写为c = FOO。
https://stackoverflow.com/questions/43420575
复制相似问题