visitante / ouvinte para antlr4 circuito

votos
0

Eu sei que meu título não é tão bom, por favor, editá-lo, se quiser. Assim que nos foi dado um projeto em um dos meus cursos, que é fazer com que o compilador / intérprete. No entanto, nós só temos discutido Design Língua o semestre inteiro por isso não estou muito bem informados sobre o lado técnico. Assim, com o pouco tempo que temos, decidimos usar antlr para nos ajudar. I foi encarregado de fazer as voltas em nossa língua. Há uma série de documentos relacionados com a criação do lexer e analisador mas não tanto sobre como implementar os ouvintes / visitantes, especialmente em loops.

Eu li a pergunta sobre o loop while em antlr4 mas eu estava esperando as pessoas poderiam me ajudar especificamente para a implementação loop.

Então aqui está como minha gramática parece:

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

Atualmente estou usando ouvintes, mas se os visitantes seria uma escolha mais adequada, então eu não me importo de comutação.

Eu estou apenas procurando algo que pudesse me orientar na implementação de loops (especialmente para circular), ele não tem que ser uma resposta se em linha reta, qualquer coisa que possa me apontar para a direção certa seria muito apreciada! (Contanto que não assume que eu sei tudo o que há para saber sobre a parte de implementação)

Obrigado pelo seu tempo!

Publicado 19/03/2018 em 15:38
fonte usuário
Em outras línguas...                            


1 respostas

visitante / ouvinte para antlr4 circuito

votos
0

Eu sei que meu título não é tão bom, por favor, editá-lo, se quiser. Assim que nos foi dado um projeto em um dos meus cursos, que é fazer com que o compilador / intérprete. No entanto, nós só temos discutido Design Língua o semestre inteiro por isso não estou muito bem informados sobre o lado técnico. Assim, com o pouco tempo que temos, decidimos usar antlr para nos ajudar. I foi encarregado de fazer as voltas em nossa língua. Há uma série de documentos relacionados com a criação do lexer e analisador mas não tanto sobre como implementar os ouvintes / visitantes, especialmente em loops.

Eu li a pergunta sobre o loop while em antlr4 mas eu estava esperando as pessoas poderiam me ajudar especificamente para a implementação loop.

Então aqui está como minha gramática parece:

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

Atualmente estou usando ouvintes, mas se os visitantes seria uma escolha mais adequada, então eu não me importo de comutação.

Eu estou apenas procurando algo que pudesse me orientar na implementação de loops (especialmente para circular), ele não tem que ser uma resposta se em linha reta, qualquer coisa que possa me apontar para a direção certa seria muito apreciada! (Contanto que não assume que eu sei tudo o que há para saber sobre a parte de implementação)

Obrigado pelo seu tempo!

Respondeu 19/03/2018 em 15:38
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more