123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- grammar ivprog;
- @parser::header
- {
- import {ASA, NoGlobal} from '../js/asa';
- }
- @parser::members
- {
- this.criarTrechoCodigoFonte = function(tokenAntlr)
- {
- if (tokenAntlr != null)
- {
- const linha = tokenAntlr.getLine();
- const coluna = tokenAntlr.getCharPositionInLine();
- const tamanhoTexto = tokenAntlr.getText().length();
-
- return {linha: linha, coluna: coluna, tamanhoTexto: tamanhoTexto};
- }
-
- return null;
- }
- }
- PR_PROGRAMA : 'programa' ;
- PR_REAL : 'real' ;
- PR_VAZIO : 'vazio' ;
- PR_LOGICO : 'logico' ;
- PR_CADEIA : 'cadeia' ;
- PR_INTEIRO : 'inteiro' ;
- PR_CARACTER : 'caracter' ;
- PR_ESCOLHA : 'escolha' ;
- PR_CASO : 'caso' ;
- PR_CONTRARIO : 'contrario' ;
- PR_CONST : 'const' ;
- PR_FUNCAO : 'funcao' ;
- PR_RETORNE : 'retorne' ;
- PR_PARA : 'para' ;
- PR_PARE : 'pare' ;
- PR_FACA : 'faca' ;
- PR_ENQUANTO : 'enquanto' ;
- PR_SE : 'se' ;
- PR_SENAO : 'senao' ;
- GAMBIARRA : '.' |'á'| 'à'| 'ã'|'â'|'é'|'ê'|'í'|'ó'|'ô'|'õ'|'ú'|'ü'|'ç'|'Ä'|'À'|'Ã'|'Â'|'É'|'Ê'|'Ë'|'Ó'|'Ô'|'Õ'|'Ú'|'Ü'|'Ç'|'#'|'$'|'"'|'§'|'?'|'¹'|'²'|'³'|'£'|'¢'|'¬'|'ª'|'º'|'~'|'\''|'`'|'\\'|'@';
-
- fragment PR_FALSO : 'falso' ;
- fragment PR_VERDADEIRO : 'verdadeiro' ;
- OPERADOR_NAO : 'nao' ;
- LOGICO : PR_VERDADEIRO | PR_FALSO ;
- ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
- ID_BIBLIOTECA : ID '.' ID;
- INTEIRO : '0'..'9'+ | ('0x'|'0X')(DIGIT_HEX)+ | ('0b'|'0B')('0'|'1')+;
- REAL : ('0'..'9')+ '.' ('0'..'9')+ ;
-
- CADEIA : '"' ( SEQ_ESC | ~('\\'|'"') )* '"' ;
- CARACTER : '\'' ( SEQ_ESC | ~('\''|'\\') ) '\'' ;
- ESPACO : ( ' ' | '\t' | '\r' | '\n') -> skip ;
- fragment DIGIT_HEX : ('0'..'9'|'a'..'f'|'A'..'F') ;
- fragment SEQ_ESC : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') | ESC_UNICODE | ESC_OCTAL ;
- fragment ESC_OCTAL : '\\' ('0'..'3') ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ;
- fragment ESC_UNICODE : '\\' 'u' DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX ;
- COMENTARIO :
- ('//' ~('\n'|'\r')* '\r'? '\n' |
-
- '/*' ( options {greedy=false;} : . )* '*/') -> skip
- ;
- parse returns [asa]:
- prog = programa EOF
- {
- $asa = $prog.asa;
- }
- ;
- programa returns [asa] :
- PR_PROGRAMA
- '{'
- {
- $asa = new ASA();
- }
- (declaracoesGlobais[$asa])*
- '}'
- ;
- declaracoesGlobais [asa]:
- vList = listaDeclaracoes
- {
- if ($asa != null) {
- this.globais = new NoGlobal();
- $vList.lista.forEach( v => this.globais.addDeclaracao(v));
- $asa.nos.push($vList.lista);
- }
- }
- ;
- listaDeclaracoes returns [lista]
- @init{
- $lista = [];
- }:
- (tokenConst = PR_CONST)? informacaoTipoDado = declaracaoTipoDado
- ( vDeclaracao = declaracao[$tokenConst, $informacaoTipoDado.informacaoTipoDado]
- {
- if($ctx.vDeclaracao) {
- $lista.push($vDeclaracao.rDeclaracao);
- }
- $ctx.vDeclaracao = null;
- }
- )
- ( ',' vDeclaracao = declaracao[$tokenConst, $informacaoTipoDado.informacaoTipoDado]
- {
- if($ctx.vDeclaracao) {
- $lista.push($vDeclaracao.rDeclaracao);
- }
- $ctx.vDeclaracao = null;
- }
- )*
- ;
- declaracao [tokenConst, informacaoTipoDado] returns[rDeclaracao]:
- (ID (tk1 = '[' (ind1 = expressao)? ']' (tk2 = '[' (ind2 = expressao)? ']')?)? ('=' inicializacao = expressao)?)
- {
- const constante = ($tokenConst != null);
- const tipoDado = ($informacaoTipoDado != null)? $informacaoTipoDado.tipoDado : null;
- const nome = ($ID != null)? $ID.text : null;
-
- if (($tk1 == null) && ($tk2 == null))
- $rDeclaracao = new NoDeclaracaoVariavel(nome, tipoDado, constante);
- else
-
- if (($tk1 != null) && ($tk2 == null))
- $rDeclaracao = new NoDeclaracaoVetor(nome, tipoDado, $ind1.text, constante);
-
- else
-
- if (($tk1 != null) && ($tk2 != null))
- $rDeclaracao = new NoDeclaracaoMatriz(nome, tipoDado, $ind1.text, $ind2.text, constante);
-
- $rDeclaracao.setInicializacao(inicializacao);
- $rDeclaracao.setTrechoCodigoFonteNome(criarTrechoCodigoFonte($ID));
- $rDeclaracao.setTrechoCodigoFonteTipoDado(($informacaoTipoDado != null)? $informacaoTipoDado.getTrechoCodigoFonte(): null);
- }
- ;
- declaracaoTipoDado returns[informacaoTipoDado]:
- (tokenTipoDado = PR_INTEIRO | tokenTipoDado = PR_REAL | tokenTipoDado = PR_CARACTER | tokenTipoDado = PR_CADEIA | tokenTipoDado = PR_LOGICO)
- {
- $informacaoTipoDado = new InformacaoTipoDado();
- $informacaoTipoDado.setTipoDado($tokenTipoDado);
- $informacaoTipoDado.setTrechoCodigoFonte(criarTrechoCodigoFonte($tokenTipoDado));
- }
- ;
- expressao:
- INTEIRO
- | CADEIA
- ;
|