我知道我的标题不是那么好,如果你愿意,请编辑它。因此我们在我的一门课程中获得了一个项目,即编译/翻译。但是,我们只讨论了整个学期的语言设计,所以我对技术方面知之甚少。因此,在我们拥有的时间很短的情况下,我们决定使用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 : '/' ;
我目前正在使用听众,但如果访客是更合适的选择,那么我不介意转换。
我只是寻找可以指导我实现循环的东西(尤其是循环),它不一定是一个直接的答案,任何可以指向正确方向的东西都是非常感激! (只要它不假设我知道有关实现部分的所有信息)
感谢您的时间!