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进行了同样的分析。