Klevin Delimeta
Klevin Delimeta

Reputation: 168

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

I am having a bit of difficulty in my g4 file. Below is my grammar:

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

When i try to -gui tree from antlr it shows me this error:

line 2:3 missing OPERATOR at 'a'

This error is given from this code example:

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

Basically it does not recognizes the ifstatement beggining with IF 'if' and it shows the tree like i am making an assignment.

tree

How can i fix this?

P.S. I also tried to reposition my statements. Also tried to remove all statements and leave only ifstatement, and same thing happens.

Thanks

Upvotes: 1

Views: 1095

Answers (1)

Bart Kiers
Bart Kiers

Reputation: 170178

There is at least one issue:

ID     : [a-z]+ ;

...

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

...

NOT : 'not';

Since ID is placed before TRUE .. NOT, those tokens will never be created since ID has precedence over them (and ID matches these tokens as well).

Start by moving ID beneath the NOT token.

Upvotes: 3

Related Questions