Parsing antlr4线路2:0输入不匹配';如果';应为{';if';,OTHER}

Parsing antlr4线路2:0输入不匹配';如果';应为{';if';,OTHER},parsing,if-statement,antlr,lexer,Parsing,If Statement,Antlr,Lexer,我的g4文件有点困难。以下是我的语法: // Define a grammar called Hello grammar GYOO; program : 'begin' block+ 'end'; block : statement+ ; statement : assign | print | add | ifstatement | OTHER {System.err.println("unknown char: " + $O

我的g4文件有点困难。以下是我的语法:

// Define a grammar called Hello
grammar GYOO;
program   : 'begin' block+ 'end';

block
    : statement+
    ;

statement 
    : assign
    | print 
    | add
    | ifstatement
    | OTHER {System.err.println("unknown char: " + $OTHER.text);}
    ;


assign    
    : 'let' ID 'be' expression 
    ;

print     
    : 'print' (NUMBER | ID) 
    ;


ifstatement
    : 'if' condition_block (ELSE IF condition_block)* (ELSE stat_block)?
    ;


add       
    : (NUMBER | ID) OPERATOR (NUMBER | ID) ASSIGN ID 
    ;

stat_block
    : OBRACE block CBRACE
    | statement
    ;

condition_block
    : expression stat_block
    ;
expression
    : NOT expression                                    //notExpr
    | expression (MULT | DIV | MOD) expression       //multiplicationExpr
    | expression (PLUS | MINUS) expression           //additiveExpr
    | expression (LTEQ | GTEQ | LT | GT) expression  //relationalExpr
    | expression (EQ | NEQ) expression               //equalityExpr
    | expression AND expression                         //andExpr
    | expression OR expression                          //orExpr
    | atom                                              //atomExpr  
    ;
atom
    : (NUMBER | FLOAT)  //numberAtom
    | (TRUE | FALSE) //booleanAtom
    | ID             //idAtom
    | STRING         //stringAtom
    | NULL           //nullAtom
    ;

ID     : [a-z]+ ;
NUMBER : [0-9]+ ;
OPERATOR : '+' | '-' | '*' | '/';
ASSIGN : '=';
WS : (' ' | '\t' | '\r' | '\n') + -> skip;
OPAR : '(';
CPAR : ')';
OBRACE : '{';
CBRACE : '}';
TRUE : 'true';
FALSE : 'false';
NULL : 'null';
IF : 'if';
ELSE : 'else';

OR : 'or';
AND : 'and';
EQ : 'is';              //'=='
NEQ : 'is not';         //'!='
GT : 'greater';         //'>'
LT : 'lower';           //'<'
GTEQ : 'is greater';    //'>=' 
LTEQ : 'is lower';      //'<='

PLUS : '+';
MINUS : '-';
MULT : '*';
DIV : '/';
MOD : '%';
POW : '^';
NOT : 'not';

FLOAT
 : [0-9]+ '.' [0-9]* 
 | '.' [0-9]+
 ;

STRING
 : '"' (~["\r\n] | '""')* '"'
 ;

COMMENT
    :   '/*' .*? '*/' -> channel(HIDDEN)
    ;

LINE_COMMENT
    :   '//' ~[\r\n]* -> channel(HIDDEN)
    ;
OTHER
 : . 
 ;
此错误由以下代码示例给出:

begin
let a be true
if a is true
print a
end
基本上,它不会识别带有IF‘IF’的ifstatement,它会显示树,就像我在做作业一样

我怎样才能解决这个问题

另外,我还试图重新定位我的陈述。还试图删除所有语句,只留下ifstatement,同样的情况也发生了


谢谢

至少有一个问题:

ID     : [a-z]+ ;

...

TRUE : 'true';
FALSE : 'false';
NULL : 'null';
IF : 'if';
ELSE : 'else';
OR : 'or';

...

NOT : 'not';
因为
ID
放在
TRUE
之前
NOT
,这些令牌将永远不会被创建,因为
ID
优先于它们(并且
ID
也匹配这些令牌)


首先将
ID
移动到
NOT
标记下方。

感谢您的回答,至少现在它正在工作,没有抛出错误。我也会纠正其他部分。但我的错误消失了:)。
ID     : [a-z]+ ;

...

TRUE : 'true';
FALSE : 'false';
NULL : 'null';
IF : 'if';
ELSE : 'else';
OR : 'or';

...

NOT : 'not';