循环antlr4的访客/监听器

时间:2018-03-19 15:38:45

标签: java antlr4

我知道我的标题不是那么好,如果你愿意,请编辑它。因此我们在我的一门课程中获得了一个项目,即编译/翻译。但是,我们只讨论了整个学期的语言设计,所以我对技术方面知之甚少。因此,在我们拥有的时间很短的情况下,我们决定使用antlr来帮助我们。我的任务是用我们的语言制作循环。有很多文档与创建词法分析器和解析器有关,但与如何实现侦听器/访问者有关,尤其是在循环上。

我已经阅读了关于antlr4中while循环的问题,但我希望人们能够专门帮助我进行循环实现。

所以我的语法是这样的:

grammar Iteration;
/*
 * PARSER RULES : ITERATION
 */
program    : (statement | forg | whileg | dowhile | foreach)+; 

statement  : declaration | assign | expression | print | standalone ;

declaration: 'int' ID ('=' expression)* ';' WS*;
assign     : ID '=' expression ';' WS* ;
forInit    : ID '=' expression WS* ;
print      : type=('print'| 'printLine') (NUMBER | ID) ';' WS*;

expression :  expression op=('*'|'/') expression #Mult
            | expression op=('+'|'-') expression #Add
            | NUMBER #Lit
            | ID #Var
            | '(' expression ')' #Paren
            ;

relational :  relational op=('==' | '!=') relational #Equal
            | relational op=('>=' | '<=') relational #Greatere 
            | relational op=('>' | '<') relational #Greater 
            | NUMBER #LitLoop
            | ID #VarLoop
            ;

standalone : ID op=('++'|'--' | '-') ';' WS* ;
varChange  : ID op=('++'|'--' | '-') WS* ;

forg       : FOR LPAREN forInit* ';' relational ';' varChange RPAREN LCURL 
statement* RCURL WS* ;
whileg     : WHILE LPAREN relational RPAREN LCURL statement* RCURL WS* ; 
dowhile    : DO LCURL statement* RCURL WHILE LPAREN relational RPAREN ';' WS* ;
foreach    : FOREACH LPAREN ID IN ID RPAREN LCURL statement RCURL WS* ;

/*
 * LEXER RULES : ITERATION
 */

FOR        : 'for' ;
WHILE      : 'while' ;
DO         : 'do' ;
FOREACH    : 'foreach' ;
IN         : 'in' ;

LPAREN     : '(' ;
RPAREN     : ')' ;
LCURL      : '{' ;
RCURL      : '}' ;

EQUAL      : '==' ;
NEQUAL     : '!=' ;
GREATER    : '>' ;
LESS       : '<' ;
GREATERE   : '>=' ;
LESSE      : '<=' ;

ID         : [a-zA-Z]+ ;
NUMBER     : [0-9]+ ;
WS         : [ \n\t\r]+ -> skip ;
ADD_OP     : '+' ;
SUB_OP     : '-' ;
MULT_OP    : '*' ;
DIV_OP     : '/' ;

我目前正在使用听众,但如果访客是更合适的选择,那么我不介意转换。

我只是寻找可以指导我实现循环的东西(尤其是循环),它不一定是一个直接的答案,任何可以指向正确方向的东西都是非常感激! (只要它不假设我知道有关实现部分的所有信息)

感谢您的时间!

0 个答案:

没有答案