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

Antlr4 是否有一种方法可以跳过某些规则的空格,而不跳过其他规则的空格?,antlr4,Antlr4,我的语法包含以下内容: assignment : ID ASSIGN expr ; expr : MINUS expr #unaryMinusExpr | NOT expr #notExpr | expr MULT expr #multExpr | expr DIV expr #divExpr | expr PLUS expr #plusExp

我的语法包含以下内容:

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
 : [ \t\r\n] -> skip
 ;
赋值
:ID ASSIGN expr
;
expr
:负表达式#一元最小表达式
|非expr#notExpr
|expr MULT expr#multExpr
|expr DIV expr#divExpr
|expr加expr#plusExpr
|expr减去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和expr#andExpr
|expr或expr#orExpr
|函数#函数表达式
|原子#原子xpr
;
功能
:ID OPAR(参数(','参数)*)?CPAR
;
参数
:STRING#stringParameter
|expr#expr参数
;
原子
:OPAR expr CPAR#parExpr
|(INT | FLOAT)#numberAtom
|(真|假)#布尔原子
|我是汤姆
;
或:“| |”;
及:"&";
等式:'=';
NEQ:“!=”;
GT:“>”;
LT:'=';

LTEQ:“这可以通过使用lexer模式来完成。一种模式(或默认模式)跳过空格,另一种模式不跳过空格。

通过修改lexer中的
ID
规则,您可以避免在解析器规则中有条件地考虑空格。允许
-
出现在
ID
中,前提是它不在标识符的开头或结尾

ID
  : [a-zA-Z_]
    ( '-'? [a-zA-Z_0-9]
    )*
  ;

那么
-
+
ID
中始终是标识符的一部分?输入
a-b
a-b
是清楚的,但是你能编辑你的帖子并解释一下下面的输入应该如何标记:
a-b
a-b
?你不能简单地在ID lexer规则中加上减吗?默认情况下,ANTLR会贪婪地标记,因此它应该做正确的事情。必要的问题是,当破折号用作减号或连字符时,“您”如何识别?例如,如果它必须是负数,因为“this”和“isandid”都是变量,因此只有负数才有意义,那么决策必须等到构建符号表。但是,这是我的猜测。与Antlr语法实现无关,您使用什么标准来决定减号和连字符?对PLUS进行了同样的分析。