在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:
与ANLRwork中的“Parse Tree”比较:
我认为 $ noun3 变量包含“COMMA noun3 + = n”中所有“n”的列表。因此,AST解析器^(NOUN $ noun3)*将绘制所有“n”,而不是“n”实际上属于“准备”的。
有没有办法可以在 中进行分离(^(PREP prep)^(NOUN $ noun2)^(NOUN $ noun3))“ 即可。我想要做的就是AST必须在没有令牌COMMA的情况下使用ANTLRwork中的“Parse Tree”进行精确绘制。
感谢您的帮助!
答案 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
;