我的语法包含以下内容:
assignment
: ID ASSIGN expr
;
expr
: MINUS expr #unaryMinusExpr
| NOT expr #notExpr
| expr MULT expr #multExpr
| expr DIV expr #divExpr
| expr PLUS expr #plusExpr
| expr MINUS expr #minusExpr
| expr LTEQ expr #lteqExpr
| expr GTEQ expr #gteqExpr
| expr LT expr #ltExpr
| expr GT expr #gtExpr
| expr NEQ expr #neqExpr
| expr EQ expr #eqExpr
| expr AND expr #andExpr
| expr OR expr #orExpr
| function #functionExpr
| atom #atomExpr
;
function
: ID OPAR (parameter (',' parameter)*)? CPAR
;
parameter
: STRING #stringParameter
| expr #exprParameter
;
atom
: OPAR expr CPAR #parExpr
| (INT | FLOAT) #numberAtom
| (TRUE | FALSE) #booleanAtom
| ID #idAtom
;
OR : '||';
AND : '&&';
EQ : '==';
NEQ : '!=';
GT : '>';
LT : '<';
GTEQ : '>=';
LTEQ : '<=';
PLUS : '+';
MINUS : '-';
MULT : '*';
DIV : '/';
NOT : '!';
OPAR : '(';
CPAR : ')';
OBRACE : '{';
CBRACE : '}';
ASSIGN : '=';
TRUE : 'true';
FALSE : 'false';
IF : 'if';
ELSE : 'else';
ID
: [a-zA-Z_] [a-zA-Z_0-9]*
;
SPACE
: [ trn] -> skip
;
问题是ID还需要能够包含减号,加号等。这意味着我将无法分辨我只有一个ID (This -isandid)还是ID (This) - ID (isandid)。
我们想做的是不跳过expr中操作符周围的空格,而是跳过所有其他规则的空格。有办法做到吗?也就是说,我们强迫用户在操作符周围加上空格,当它们真正意味着一个表达式,而不是一个包含例如MINUS.
的ID时。。
a-b是ID
a - b为负exp
a- b, a- b是错误的
或者是否有另一种方法允许例如在ID中减去,并且能够区分ID和minusExpr之间的区别?
您可以通过修改词法分析器中的ID
规则来避免在解析器规则中有条件地考虑空白。允许-
出现在ID
中,前提是它不在标识符的开头或结尾。
ID
: [a-zA-Z_]
( '-'? [a-zA-Z_0-9]
)*
;
这可以通过使用词法分析器模式来完成。有一种模式(或默认模式)会跳过空格,而另一种模式则不会跳过空格。