2017-09-14 14 views
0

私のg4ファイルに少し問題があります。以下は私の文法である:antlr4行2:0が一致しない入力 'if' expecting {'if'、OTHER}

// 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 ifat ifement if 'if'を認識せず、割り当てを行っているようにツリーを表示します。

tree

私はこれをどのように修正することができますか?

P.S.私はまた、私の言葉の位置を変えようとしました。また、すべてのステートメントを削除しようとすると、ifステートメントだけを残して、同じことが起こります。

おかげ

答えて

2

少なくとも一つ問題があります:ID以来

ID  : [a-z]+ ; 

... 

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

... 

NOT : 'not'; 

TRUEの前に置かれます。.. NOTIDがそれらに優先(およびIDマッチこれらを持っているので、これらのトークンを作成することはありませんトークンも同様)。

トークンの下にIDを移動することから始めます。

+1

あなたの答えをありがとう、少なくとも今はそれが動作しているとエラーを投げることはありません。私は他の部分も修正します。しかし、私のエラーは消えてしまった。 –

関連する問題