Compiler construction 在ANTLR primaryExprList(或^primaryExprList)中重写规则*
有人能帮帮我吗,我陷入了困境:Compiler construction 在ANTLR primaryExprList(或^primaryExprList)中重写规则*,compiler-construction,antlr,Compiler Construction,Antlr,有人能帮帮我吗,我陷入了困境: primaryExprList ('|'^ primaryExprList)* 我想用BOOLEANOR来代替“|” 对沃伊斯拉夫·斯托伊科维奇的评论: 我已经试过了,但当我使用a | b | c时,它不会正常工作。应该是这样的 BOOLEANOR | \ BOOLEANOR c | | a b 你的灵魂是这样的: BOOLEANOR / | \
primaryExprList ('|'^ primaryExprList)*
我想用BOOLEANOR来代替“|”
对沃伊斯拉夫·斯托伊科维奇的评论:
我已经试过了,但当我使用a | b | c时,它不会正常工作。应该是这样的
BOOLEANOR
| \
BOOLEANOR c
| |
a b
你的灵魂是这样的:
BOOLEANOR
/ | \
a b c
grammar T;
options {
output=AST;
}
tokens {
OTHER;
}
parse
: expr EOF!
;
expr
: (e1=primaryExprList -> $e1) ('|' e2=primaryExprList -> ^(OTHER $expr $e2))*
;
// other rules
哪个是不正确的。这有帮助吗
primaryExprList ('|' primaryExprList)* -> ^(BOOLEANOR primaryExprList+)
还是我误解了你的问题?我真的觉得没有必要。如果定义
布尔型或标记(lexer规则):
然后,根的类型为BOOLEANOR
,其内部文本为“|”
但是,要回答您的问题(或提出解决方案),真正更改根的方法是使用以下重写规则:
BOOLEANOR
/ | \
a b c
grammar T;
options {
output=AST;
}
tokens {
OTHER;
}
parse
: expr EOF!
;
expr
: (e1=primaryExprList -> $e1) ('|' e2=primaryExprList -> ^(OTHER $expr $e2))*
;
// other rules
这将把输入“a | b | c”解析为以下AST:
再次检查我的问题,这里有一条评论供你参考。由于声誉限制,我无法发布答案,在评论中我也无法写下这棵树