有人可以帮我吗,我陷入了困境:
primaryExprList ('|'^ primaryExprList)*
我想用它来代替“|”使用 bool 值
沃伊斯拉夫·斯托伊科维奇的评论:
我已经尝试过了,但是当我使用 a|b|c 时它无法正常工作,应该是这样的
BOOLEANOR
| \
BOOLEANOR c
| |
a b
你的灵魂是这样的:
BOOLEANOR
/ | \
a b c
这是不正确的。
最佳答案
我真的不认为有必要。如果您定义 BOOLEANOR
标记(词法分析器规则):
parse : primaryExprList ('|'^ primaryExprList)*;
// or: primaryExprList (BOOLEANOR^ primaryExprList)*
BOOLEANOR : '|';
那么根的类型为BOOLEANOR
,其内部文本为"|"
。
但是,要回答您的问题(或提出解决方案),真正更改根的方法是使用如下重写规则:
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:
关于compiler-construction - 重写 ANTLR PrimaryExprList 中的规则 (OR^ PrimaryExprList)*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9536571/