Как реализовать правильное утверждение If Then Else в грамматике Antlr? - PullRequest
0 голосов
/ 28 марта 2019

Я работаю над расширением оператора над грамматикой .g4 (с именем Simple.g4) в ANTLR, я пытаюсь реализовать оператор «if then else», включающий новую инструкцию с именем ifStatement в операторе section, но я У меня проблема с кодом, который я сгенерировал.

Это правильная форма для реализации оператора if?

Вот код, с которым я работаю, используя Eclipse IDE + ANTLR Plugin:

grammar Simple;


//PARSER RULES


block       : '{' statement* '}';




statement   : assignment    ';' 
            | deletion      ';' 
            | print         ';'
            | varDec        ';' 
            | ifStatement   ';' 
            | funDec        ';' 
            | block;




assignment  : ID '=' exp;


deletion    : 'delete' ID;                                  

print       : 'print' exp;

exp   : '(' exp ')'                             #baseExp
        | '-' exp                               #negExp     
        | left=exp op=('*' | '/') right=exp     #binExp
        | left=exp op=('+' | '-') right=exp     #binExp
        | ID                                    #varExp     
        | INT                                   #valExp     
        | BOOL                                  #valExp     
        | expression cmp='>' expression         #boolExp    
        | expression cmp='<' expression         #boolExp    /
        | expression cmp='==' expression        #boolExp
        | expression cmp='!=' expression        #boolExp
        | expression cmp='>=' expression        #boolExp
        | expression cmp='<=' expression        #boolExp                                            



// If-Then-Else

 ifStatement : 'if' '(' exp ')' 'then' exp 'else' exp               



// LEXER RULES


TRUE   : 'true' ;
FALSE  : 'false';
IF     : 'if'   ;
THEN   : 'then' ;
ELSE   : 'else' ;
VAR    : 'var'  ;  
INT    : 'int'  ;
BOOL   : 'bool' ;

//IDs

fragment CHAR   : 'a'..'z' |'A'..'Z' ;
ID              : CHAR (CHAR | DIGIT)* ;

fragment DIGIT  : '0'..'9'; 
INT             : DIGIT+;

//Boolean   
BOOL            : 'true' | 'false';

//Escape Sequence
WS              : (' '|'\t'|'\n'|'\r')-> skip;
LINECOMMENTS    : '//' (~('\n'|'\r'))* -> skip;
BLOCKCOMMENTS    : '/*'( ~('/'|'*')|'/'~'*'|'*'~'/'|BLOCKCOMMENTS)* '*/' -> skip;
...