2017-09-14 92 views
0

我在我的g4文件中遇到了一些困難。下面是我的語法:antlr4行2:0不匹配的輸入'如果'期待{'if',其他}

// 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 
: . 
; 

當我嘗試-gui樹從ANTLR它表明我這個錯誤:

line 2:3 missing OPERATOR at 'a' 

此錯誤是從該代碼示例給出:

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

基本上它並不認可if語句if'if'開始,它顯示樹就像我正在做一個任務。

tree

我怎樣才能解決這個問題?

P.S.我也嘗試重新定位我的陳述。也試圖刪除所有的陳述,只留下陳述,同樣的事情發生。

感謝

回答

2

至少有一個問題:

ID  : [a-z]+ ; 

... 

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

... 

NOT : 'not'; 

由於ID放在前TRUE .. NOT,這些標記將永遠不會因爲ID創建具有優先於他們(ID匹配這些令牌)。

通過在NOT令牌下移動ID開始。

+1

謝謝你的回答,至少現在它工作,而不是拋出錯誤。我也會糾正其他部分。但我的錯誤消失了:)。 –

相關問題