我已经这样指定了优先级和关联性:
expr
: LB expr RB
| <assoc=right> (SUB | NOT) expr
| expr op=(MULTI | DIV | MOD | AND) expr
| expr op=(ADD | SUB | OR) expr
| expr comparator expr
| expr op=(ANDTHEN | ORELSE) expr
| INTLIT
;
但它也适用于( 1 and 2 )
。我只想表示整数(即仅适用于+ - * /
)或布尔值(AND
OR
)的表达式。我该怎么办?
答案 0 :(得分:1)
这不是优先级问题,而是类型问题,因此应由类型检查器处理。
您可能会想将语法分为integerExpression
和booleanExpression
之类的规则,当然可以创建以这种方式拒绝1 and 2
的语法。但是这种方法使您的语法不必要地复杂,一旦您的语言变得更加强大,它就会达到极限。例如,当您引入变量时,如果且仅当a and b
和a
都是布尔变量时,您才希望允许b
,但是仅通过查看并不能告诉您表达方式。因此,在这种情况下(以及许多其他情况下),您仍然需要Java(或您使用的任何一种语言)代码来检查类型。
因此,总而言之,您应该保持语法不变,并在类型检查器中拒绝1 and 2
。