【问题标题】:Generating AST from ANTLR grammar从 ANTLR 语法生成 AST
【发布时间】:2012-03-02 16:52:23
【问题描述】:

对于question 和@BartKiers 建议的语法(谢谢!),我添加了options 块以指定输出为

options{
language=Java;
output=AST;
ASTLabelType=CommonTree;
}

但是,我无法弄清楚如何访问输出,即AST。我需要遍历树并处理输入中指定的每个操作。


使用您的示例here,我正在尝试实现返回值的规则。但是,我遇到了以下错误:

relational    returns [String val]                   
        :  STRINGVALUE ((operator)^ term)?
            {val = $STRINGVALUE.text + $operator.text + $term.text; }
                                    ;

term returns [String rhsOperand]                    
        :  QUOTEDSTRINGVALUE  {rhsOperand = $QUOTEDSTRINGVALUE.text;}
                                    |  NUMBERVALUE               {rhsOperand = $NUMBERVALUE.text; }
                                    | '(' condition ')'
                                     ;

编译错误:

Checking Grammar RuleGrammarParser.g...
\output\RuleGrammarParser.java:495: cannot find symbol
symbol  : variable val
location: class RuleGrammarParser
            val = (STRINGVALUE7!=null?STRINGVALUE7.getText():null) + (operator8!=null?input.toString(operator8.start,operator8.stop):null) + (term9!=null?input.toString(term9.start,term9.stop):null); 
            ^
\output\RuleGrammarParser.java:612: cannot find symbol
symbol  : variable rhsOperand
location: class RuleGrammarParser
                    rhsOperand = (QUOTEDSTRINGVALUE10!=null?QUOTEDSTRINGVALUE10.getText():null);
                    ^
\output\RuleGrammarParser.java:632: cannot find symbol
symbol  : variable rhsOperand
location: class RuleGrammarParser
                    rhsOperand = (NUMBERVALUE11!=null?NUMBERVALUE11.getText():null); 
                    ^
3 errors

你能帮我理解为什么编译失败吗?


添加了 pastebin:http://pastebin.com/u1Bv3L0A

【问题讨论】:

    标签: antlr antlr3 antlrworks


    【解决方案1】:

    通过简单地将output=AST 添加到options 部分,您不会创建一个AST,而是一个平面的一维令牌列表。要将某些令牌标记为根(或子),您需要做一些工作。

    签出this answer,它解释了如何创建正确的AST访问解析器随后生成的树(我提到的答案的main方法中的CommonTree tree)。

    请注意,您可以安全地删除 language=Java;:默认情况下,目标语言是 Java(尽管将其留在那里没有害处)。

    【讨论】:

    • 太棒了!为@BartKiers 欢呼三声!! (和押韵的:))
    • 你能帮我解决上面的问题吗?我已经更新了问题。
    • 巴特,找到了解决办法。也许您必须更新您的示例以包含规则中定义的所有变量的$
    • @darkie15,是的,在 ANTLR 3 的早期版本中,您可以放心地省略 $,它现在在 ANTLR 3.4(也许 3.3 也是)中是强制性的。请注意,在本教程中,我提供了 ANTLR 3.2,它适用于本教程中发布的所有代码,所以我认为我不会有太大的改变:我可能会意外破坏某些东西。当然,很高兴听到您解决了问题。
    • 我又被卡住了:(。我在我的帖子中附加了 pastebin 链接。基本上,一旦解析器验证了输入,我就会尝试将条件作为返回值。所以对于输入比如condition1,其中condition1可能是NAME = "BATMAN",我会得到返回值,但是对于像NAME = "BATMAN" AND SSN = 0000这样的多个条件,返回值只是第一个条件而不是第二个。你能帮帮我吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多