ANTLR中复杂的AST重写规则

时间:2012-12-20 16:43:37

标签: antlr antlrworks

AST rewrite rule with " * +" in antlr处使用devide组技术解决AST重写规则的问题。

我在ANTLR中生成AST时出现问题,再次:)。这是我的antlr代码:

start   :   noun1+=n (prep noun2+=n (COMMA noun3+=n)*)*
        ->  ^(NOUN $noun1) (^(PREP prep) ^(NOUN $noun2) ^(NOUN $noun3)*)*
    ;
n       :    'noun1'|'noun2'|'noun3'|'noun4'|'noun5';
prep    :    'and'|'in';
COMMA   :     ',';

现在,输入:“noun1和noun2,noun3 in noun4,noun5”,我得到了意想不到的AST:

enter image description here

与ANLRwork中的“Parse Tree”比较:

enter image description here

我认为 $ noun3 变量包含“COMMA noun3 + = n”中所有“n”的列表。因此,AST解析器^(NOUN $ noun3)*将绘制所有“n”,而不是“n”实际上属于“准备”的。

有没有办法可以在 中进行分离(^(PREP prep)^(NOUN $ noun2)^(NOUN $ noun3) 即可。我想要做的就是AST必须在没有令牌COMMA的情况下使用ANTLRwork中的“Parse Tree”进行精确绘制。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

如果您分解start规则,那么获得所需的分隔是最简单的。这是一个例子(没有将COMMA写入AST):

start   :   prepphrase             //one prepphrase is required.
            (COMMA! prepphrase)*   //"COMMA!" means "match a COMMA but don't write it to the AST"
        ;

prepphrase: noun1=n                //You can use "noun1=n" instead of "noun1+=n" when you're only using it to store one value
            (prep noun2=n)? 
            -> ^(NOUN $noun1) ^(PREP prep)? ^(NOUN $noun2)?
        ;

prepphrase是一个名词,后面跟着另一个名词的介词。 start规则查找逗号分隔的prepphrase

输出显示为解析树图像,但没有逗号。


如果您希望使用->明确写出AST,或者如果您不喜欢COMMA!之类的语法,则可以编写start这样的规则。两种不同的形式在功能上是等同的。

start   :   prepphrase             //one prepphrase is required.
            (COMMA prepphrase)*
            -> prepphrase+         //write each prepphrase, which doesn't include commas
        ;