ANTLR中复杂的AST重写规则

ANTLR中复杂的AST重写规则,antlr,antlrworks,Antlr,Antlrworks,在使用Device group技术解决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'|'nou

在使用Device group技术解决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   :     ',';
现在,通过输入:“名词1和名词2,名词4中的名词3,名词5”,我得到了以下意想不到的结果:

与AnlWork中的“解析树”进行比较:

我认为,$noun3变量包含“逗号noun3+=n”中所有“n”的列表。因此,AST解析器^(NOUN$noun3)*将绘制所有“n”,而不指定哪个“n”实际上属于“prep”s

是否有任何方法可以在“”(^(PREP-PREP)^(NOUN$noun2)^(NOUN$noun3))中进行分离“。我想做的就是AST必须在AntlWork中使用“Parse Tree”准确地绘制,不带标记逗号


谢谢你的帮助

如果您打破
start
规则,则最容易获得您想要的分离。下面是一个示例(不向AST写入
COMMA
s):

一个
前置词组
是一个名词,后面可以跟一个介词和另一个名词。
start
规则查找逗号分隔的
prepPhase
s

输出看起来像解析树图像,但没有逗号


如果您喜欢使用
->
显式写出AST,或者如果您不喜欢
逗号之类的语法
,您可以这样编写
开始
规则。这两种不同的形式在功能上是等价的

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

非常感谢!这真的很健康
start   :   prepphrase             //one prepphrase is required.
            (COMMA prepphrase)*
            -> prepphrase+         //write each prepphrase, which doesn't include commas
        ;