ivprog.g4 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. grammar ivprog;
  2. @parser::header
  3. {
  4. import {ASA, NoGlobal} from '../js/asa';
  5. }
  6. @parser::members
  7. {
  8. this.criarTrechoCodigoFonte = function(tokenAntlr)
  9. {
  10. if (tokenAntlr != null)
  11. {
  12. const linha = tokenAntlr.getLine();
  13. const coluna = tokenAntlr.getCharPositionInLine();
  14. const tamanhoTexto = tokenAntlr.getText().length();
  15. return {linha: linha, coluna: coluna, tamanhoTexto: tamanhoTexto};
  16. }
  17. return null;
  18. }
  19. }
  20. PR_PROGRAMA : 'programa' ;
  21. PR_REAL : 'real' ;
  22. PR_VAZIO : 'vazio' ;
  23. PR_LOGICO : 'logico' ;
  24. PR_CADEIA : 'cadeia' ;
  25. PR_INTEIRO : 'inteiro' ;
  26. PR_CARACTER : 'caracter' ;
  27. PR_ESCOLHA : 'escolha' ;
  28. PR_CASO : 'caso' ;
  29. PR_CONTRARIO : 'contrario' ;
  30. PR_CONST : 'const' ;
  31. PR_FUNCAO : 'funcao' ;
  32. PR_RETORNE : 'retorne' ;
  33. PR_PARA : 'para' ;
  34. PR_PARE : 'pare' ;
  35. PR_FACA : 'faca' ;
  36. PR_ENQUANTO : 'enquanto' ;
  37. PR_SE : 'se' ;
  38. PR_SENAO : 'senao' ;
  39. GAMBIARRA : '.' |'á'| 'à'| 'ã'|'â'|'é'|'ê'|'í'|'ó'|'ô'|'õ'|'ú'|'ü'|'ç'|'Ä'|'À'|'Ã'|'Â'|'É'|'Ê'|'Ë'|'Ó'|'Ô'|'Õ'|'Ú'|'Ü'|'Ç'|'#'|'$'|'"'|'§'|'?'|'¹'|'²'|'³'|'£'|'¢'|'¬'|'ª'|'º'|'~'|'\''|'`'|'\\'|'@';
  40. fragment PR_FALSO : 'falso' ;
  41. fragment PR_VERDADEIRO : 'verdadeiro' ;
  42. OPERADOR_NAO : 'nao' ;
  43. LOGICO : PR_VERDADEIRO | PR_FALSO ;
  44. ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
  45. ID_BIBLIOTECA : ID '.' ID;
  46. INTEIRO : '0'..'9'+ | ('0x'|'0X')(DIGIT_HEX)+ | ('0b'|'0B')('0'|'1')+;
  47. REAL : ('0'..'9')+ '.' ('0'..'9')+ ;
  48. CADEIA : '"' ( SEQ_ESC | ~('\\'|'"') )* '"' ;
  49. CARACTER : '\'' ( SEQ_ESC | ~('\''|'\\') ) '\'' ;
  50. ESPACO : ( ' ' | '\t' | '\r' | '\n') -> skip ;
  51. fragment DIGIT_HEX : ('0'..'9'|'a'..'f'|'A'..'F') ;
  52. fragment SEQ_ESC : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') | ESC_UNICODE | ESC_OCTAL ;
  53. fragment ESC_OCTAL : '\\' ('0'..'3') ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ;
  54. fragment ESC_UNICODE : '\\' 'u' DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX ;
  55. COMENTARIO :
  56. ('//' ~('\n'|'\r')* '\r'? '\n' |
  57. '/*' ( options {greedy=false;} : . )* '*/') -> skip
  58. ;
  59. parse returns [asa]:
  60. prog = programa EOF
  61. {
  62. $asa = $prog.asa;
  63. }
  64. ;
  65. programa returns [asa] :
  66. PR_PROGRAMA
  67. '{'
  68. {
  69. $asa = new ASA();
  70. }
  71. (declaracoesGlobais[$asa])*
  72. '}'
  73. ;
  74. declaracoesGlobais [asa]:
  75. vList = listaDeclaracoes
  76. {
  77. if ($asa != null) {
  78. this.globais = new NoGlobal();
  79. $vList.lista.forEach( v => this.globais.addDeclaracao(v));
  80. $asa.nos.push($vList.lista);
  81. }
  82. }
  83. ;
  84. listaDeclaracoes returns [lista]
  85. @init{
  86. $lista = [];
  87. }:
  88. (tokenConst = PR_CONST)? informacaoTipoDado = declaracaoTipoDado
  89. ( vDeclaracao = declaracao[$tokenConst, $informacaoTipoDado.informacaoTipoDado]
  90. {
  91. if($ctx.vDeclaracao) {
  92. $lista.push($vDeclaracao.rDeclaracao);
  93. }
  94. $ctx.vDeclaracao = null;
  95. }
  96. )
  97. ( ',' vDeclaracao = declaracao[$tokenConst, $informacaoTipoDado.informacaoTipoDado]
  98. {
  99. if($ctx.vDeclaracao) {
  100. $lista.push($vDeclaracao.rDeclaracao);
  101. }
  102. $ctx.vDeclaracao = null;
  103. }
  104. )*
  105. ;
  106. declaracao [tokenConst, informacaoTipoDado] returns[rDeclaracao]:
  107. (ID (tk1 = '[' (ind1 = expressao)? ']' (tk2 = '[' (ind2 = expressao)? ']')?)? ('=' inicializacao = expressao)?)
  108. {
  109. const constante = ($tokenConst != null);
  110. const tipoDado = ($informacaoTipoDado != null)? $informacaoTipoDado.tipoDado : null;
  111. const nome = ($ID != null)? $ID.text : null;
  112. if (($tk1 == null) && ($tk2 == null))
  113. $rDeclaracao = new NoDeclaracaoVariavel(nome, tipoDado, constante);
  114. else
  115. if (($tk1 != null) && ($tk2 == null))
  116. $rDeclaracao = new NoDeclaracaoVetor(nome, tipoDado, $ind1.text, constante);
  117. else
  118. if (($tk1 != null) && ($tk2 != null))
  119. $rDeclaracao = new NoDeclaracaoMatriz(nome, tipoDado, $ind1.text, $ind2.text, constante);
  120. $rDeclaracao.setInicializacao(inicializacao);
  121. $rDeclaracao.setTrechoCodigoFonteNome(criarTrechoCodigoFonte($ID));
  122. $rDeclaracao.setTrechoCodigoFonteTipoDado(($informacaoTipoDado != null)? $informacaoTipoDado.getTrechoCodigoFonte(): null);
  123. }
  124. ;
  125. declaracaoTipoDado returns[informacaoTipoDado]:
  126. (tokenTipoDado = PR_INTEIRO | tokenTipoDado = PR_REAL | tokenTipoDado = PR_CARACTER | tokenTipoDado = PR_CADEIA | tokenTipoDado = PR_LOGICO)
  127. {
  128. $informacaoTipoDado = new InformacaoTipoDado();
  129. $informacaoTipoDado.setTipoDado($tokenTipoDado);
  130. $informacaoTipoDado.setTrechoCodigoFonte(criarTrechoCodigoFonte($tokenTipoDado));
  131. }
  132. ;
  133. expressao:
  134. INTEIRO
  135. | CADEIA
  136. ;