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) 数字、加、减、开、关均未定义。如果您仍然有问题,请修复您的语法并重新发布。