繁体   English   中英

antlr4第2行:0输入不匹配'if'期待{'if',OTHER}

[英]antlr4 line 2:0 mismatched input 'if' expecting {'if', OTHER}

我的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
 : . 
 ;

当我尝试从antlr -gui树时,它显示我这个错误:

line 2:3 missing OPERATOR at 'a'

此错误是从以下代码示例中给出的:

begin
let a be true
if a is true
print a
end

基本上它不能识别if语句以IF'if'开头,并且它显示了我正在进行分配的树。

树

我怎样才能解决这个问题?

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

谢谢

至少有一个问题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM