2012-12-20 121 views
2

AST rewrite rule with " * +" in antlr处出现关于使用分组技术的AST重写规则的问题。 。ANTLR中复杂的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,noun3在noun4,noun5”,我得到了以下意外的AST:

enter image description here

与 “解析树” 在ANLRwork比较:

enter image description here

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

还有什么办法,可以使盲分离Blind在“(^(PREP PREP)^(名词$名2)^(名词$ noun3)。我想要做的就是AST必须在ANTLRwork中使用“Parse Tree”精确绘制,而不使用标记COMMA。

感谢您的帮助!

回答

2

如果分解start规则,获得所需的分离最容易。下面是一个例子(不写入COMMA S到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 s。

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


如果你更喜欢明确写出的AST与->,或者如果你不喜欢的语法像COMMA!,你可以写start规则是这样吧。两种不同的形式在功能上是等同的。

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

非常感谢!这真的很健康 –