2

在 antlr 中使用“* +”的AST rewrite rule with devide group 技术的 AST rewrite rule 问题之后。

我在 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”,我得到了以下意想不到的AST:

在此处输入图像描述

与 ANLRwork 中的“解析树”比较:

在此处输入图像描述

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

有什么方法可以在"(^(PREP prep) ^(NOUN $noun2) ^(NOUN $noun3) ) "中进行分离。我想要做的就是 AST 必须在 ANTLRwork 中使用“解析树”准确地绘制,没有标记 COMMA。

感谢帮助 !

4

1 回答 1

2

如果你打破start规则,得到你想要的分离是最容易的。这是一个示例(没有将COMMAs 写入 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)?
        ;

Aprepphrase是一个名词,后面可以跟一个介词和另一个名词。该start规则查找逗号分隔prepphrase的 s。

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


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

start   :   prepphrase             //one prepphrase is required.
            (COMMA prepphrase)*
            -> prepphrase+         //write each prepphrase, which doesn't include commas
        ;
于 2012-12-20T18:18:26.983 回答