是否有一种方法可以跳过某些规则而不是其他规则的空格?



我的语法包含以下内容:

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]
    )*
  ;

这可以通过使用词法分析器模式来完成。有一种模式(或默认模式)会跳过空格,而另一种模式则不会跳过空格。

相关内容

  • 没有找到相关文章

最新更新