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

时间:2017-09-14 10:50:27

标签: 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: " + $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'if'开头,它会像我正在进行分配一样显示树。

tree

我该如何解决这个问题?

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

由于

1 个答案:

答案 0 :(得分:3)

至少有一个问题:

ID     : [a-z]+ ;

...

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

...

NOT : 'not';

由于ID位于TRUE .. NOT之前,因为ID优先于ID,所以永远不会创建这些令牌(ID匹配这些令牌令牌也是如此)。

首先在NOT令牌下移动while($objResult = mysql_fetch_array($objQuery)):?> <table> <tr> <td><?= $objResult['text'];?></td> <td> <a href="#" class="open" data-id="<?=$objResult['id'];?>"> <?=$objResult['cat'];?> </a> </td> <tr> </table> <?php endwhile;