Parsing antlr4线路2:0输入不匹配';如果';应为{';if';,OTHER}
我的g4文件有点困难。以下是我的语法: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
// 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';