Antlr 空格和整型文字/二进制运算符存在问题
我试图写一个语法,考虑到Antlr 空格和整型文字/二进制运算符存在问题,antlr,antlr4,Antlr,Antlr4,我试图写一个语法,考虑到 带符号整数(即带符号或不带符号的整数;3,-2,+5) 一元负号(-) 二进制加减法(+,-) 以下是相关语法: expr: INTLITER | unaryOp expr | expr binaryOp expr | OPEN_PAREN expr CLOSE_PAREN ; unaryOp: MINUS ; // Other operators ommitted for clarity binaryOp: PLUS | MI
- 带符号整数(即带符号或不带符号的整数;
,3
,-2
)+5
- 一元负号(
)-
- 二进制加减法(
,+
)-
expr: INTLITER
| unaryOp expr
| expr binaryOp expr
| OPEN_PAREN expr CLOSE_PAREN
;
unaryOp: MINUS ; // Other operators ommitted for clarity
binaryOp: PLUS | MINUS ;
INTLITER: INTSIGN? DIGIT+ ;
fragment INTSIGN : PLUS | MINUS
WS: [ \r\n\t] -> skip ; // Ignore whitespace
我发现一个关于空格的奇怪问题
考虑表达式(2+1)
;这将提供正确的解析树,如预期的那样:
但是,(2+1)
给出了以下解析树:
既然WS
规则意味着空白被忽略,那么这里的空白如何影响解析树
如何解决此问题?语法的问题是,您试图将带符号的数字表示为lexer中的标记。定义不带“INTSIGN”的整数。语法现在起作用了
grammar arithmetic;
expr: INTLITER
| unaryOp expr
| expr binaryOp expr
| OPEN_PAREN expr CLOSE_PAREN
;
unaryOp: MINUS ; // Other operators ommitted for clarity
binaryOp: PLUS | MINUS ;
INTLITER: DIGIT+ ;
WS: [ \r\n\t] -> skip ; // Ignore whitespace
fragment DIGIT
: ('0' .. '9')+
;
OPEN_PAREN
: '('
;
CLOSE_PAREN
: ')'
;
PLUS
: '+'
;
MINUS
: '-'
;
语法的问题是,您试图在lexer中将有符号的数字表示为一个标记。定义不带“INTSIGN”的整数。语法现在起作用了
grammar arithmetic;
expr: INTLITER
| unaryOp expr
| expr binaryOp expr
| OPEN_PAREN expr CLOSE_PAREN
;
unaryOp: MINUS ; // Other operators ommitted for clarity
binaryOp: PLUS | MINUS ;
INTLITER: DIGIT+ ;
WS: [ \r\n\t] -> skip ; // Ignore whitespace
fragment DIGIT
: ('0' .. '9')+
;
OPEN_PAREN
: '('
;
CLOSE_PAREN
: ')'
;
PLUS
: '+'
;
MINUS
: '-'
;
这个语法定义不清楚。(1) “片段符号:加号|减号”不以“;”结尾。(2) 数字、加、减、开、关均未定义。如果仍然有问题,请修复语法并重新发布。此语法定义不正确。(1) “片段符号:加号|减号”不以“;”结尾。(2) 数字、加、减、开、关均未定义。如果您仍然有问题,请修复您的语法并重新发布。