【问题标题】:rewriting AST Action Translation to ANTLR4将 AST 动作翻译重写为 ANTLR4
【发布时间】:2017-04-14 23:38:38
【问题描述】:

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

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

【问题讨论】:

  • 每个#是否表示节点中应该有“子树”?

标签: antlr4 stringtemplate antlr2


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2015-07-10
    相关资源
    最近更新 更多