将 AST 操作转换重写为 ANTLR4



我有一个用antlr2语法编写的语法文件,需要帮助了解如何用antlr4语法重写一些解析器规则。 我知道 antlr4 消除了构建 AST 的需要,所以我不确定如何处理AST 操作翻译的规则。ANTLR树结构解释了一些语法以及如何使用#结构,但我仍然不确定如何阅读此规则并重写它们。

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);
};

你不能操作生成的解析树(至少不能用语法代码),所以只需删除所有树重写的东西(你可能不得不调整消费者代码,如果它依赖于特定的树结构)。同时删除感叹号(表示不应出现在 AST 中的标记)。惊喜是c:FOO部分。不记得见过这个。但从下面的操作代码来看,我想这是一个 var 赋值,应该重写为c = FOO.

最新更新