Advertisement
Guest User

Untitled

a guest
Nov 24th, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.81 KB | None | 0 0
  1. /* Secao das declaracoes */
  2. %option noyywrap
  3. /* Sera copiado no .c final */
  4.  
  5. #include <stdlib.h>
  6. #include <string.h>
  7. /* este include eh importante... */
  8. #include "tokens.h"
  9. #include "stack.h"
  10.  
  11.  
  12. /* Definicoes regulares */
  13. LETRA ([a-z]|[A-Z])
  14. DIGITO ([0-9])
  15.  
  16.  
  17. %%
  18.  
  19. /* Secao das Regras de traducao */
  20. /* O que consta aqui eh puramente ilustrativo...
  21. * Ver tambem "tokens.h" para a definicao de DIG e OPCMP
  22. */
  23. (INT|integer) {return (INT);}
  24. DOUBLE {return (DOUBLE);}
  25. FLOAT {return (FLOAT);}
  26. CHAR {return (CHAR);}
  27.  
  28. "*" {return (SIMBOLO_ASTERISCO);}
  29. "+" {return (SIMBOLO_MAIS);}
  30. "-" {return (SIMBOLO_MENOS);}
  31. "/" {return (SIMBOLO_BARRA);}
  32. "," {return (VIRGULA);}
  33. ";" {return (PONTOEVIRGULA);}
  34. "'" {return (QUOTE);}
  35. "\"" {return (DQUOTE);}
  36. "(" {return (ABRE_PARENTESES);}
  37. ")" {return (FECHA_PARENTESES);}
  38. "[" {return (ABRE_COLCHETE);}
  39. "]" {return (FECHA_COLCHETE);}
  40. "{" {return (ABRE_CHAVES);}
  41. "}" {return (FECHA_CHAVES);}
  42. "<" {return (SINAL_MENOR);}
  43. ">" {return (SINAL_MAIOR);}
  44. "=" {return (SINAL_ATRIBUICAO);}
  45. "<=" {return (LE);}
  46. ">=" {return (GE);}
  47. "==" {return (EQ);}
  48. "!" {return (EXCLAMACAO);}
  49. "!=" {return (NE);}
  50. "&&" {return (AND);}
  51. "||" {return (OR);}
  52. "%" {return (MOD);}
  53. "&" {return (ECOMERCIAL);}
  54. " " {return (BRANCO);}
  55. "\n" {return (QUEBRALINHA);}
  56. IF {return (IF);}
  57. THEN {return (THEN);}
  58. ELSE {return (ELSE);}
  59. WHILE {return (WHILE);}
  60. {DIGITO}*[\.]{DIGITO}+([eE][+-]{DIGITO}+)? {return (F_LIT);}
  61. {DIGITO}+ {return (INT_LIT);}
  62. ({LETRA})+({LETRA}|{DIGITO}|[_])* { return (IDF);}
  63.  
  64. [ \t\n]* { printf("BRANCO\n");}
  65. . { printf("Erro lexical - caractere nao reconhecido: %c.\n", yytext[0]);
  66. exit(-1);}
  67.  
  68.  
  69. %%
  70. /* Secao dos Procedimentos auxiliares */
  71. /* Para redefinir a entrada padrao do LEX. */
  72. extern FILE *yyin;
  73. int main(int argc, char* argv[])
  74. {
  75. /*
  76. Criamos constantes para podermos usar ponteiros para os valores
  77. */
  78. const int E = -1;
  79. const int X = -2;
  80. const int START = E;
  81. const int TABRE_PARENTESES = ABRE_PARENTESES;
  82. const int TFECHA_PARENTESES = FECHA_PARENTESES;
  83. const int TSIMBOLO_ASTERISCO = SIMBOLO_ASTERISCO;
  84. const int TSIMBOLO_MAIS = SIMBOLO_MAIS;
  85. const int TSIMBOLO_MENOS = SIMBOLO_MENOS;
  86. const int TSIMBOLO_BARRA = SIMBOLO_BARRA;
  87. const int TF_LIT = F_LIT;
  88. const int TIDF = IDF;
  89. const int TINT_LIT = INT_LIT;
  90. const int TVAZIO = BRANCO;
  91. int* simbolo = NULL;
  92. /*
  93. A tabela de parse LL1 foi codificada como um array bidimensional
  94. */
  95. int tabela[2][9] = {{0, 0, 0, 0, 0, 2, 1, 3, 0},{8, 4, 5, 6, 7, 0, 0, 0, 8}};
  96. stack pilha;
  97. int token, producao;
  98. if (argc != 2) {
  99. printf("uso: %s <input_file>. Tente Novamente!\n", argv[0]);
  100. exit(-1);
  101. }
  102. yyin = fopen(argv[1], "r");
  103. if (!yyin)
  104. {
  105. printf("Uso: %s <input_file>. Could not find %s. Try again!\n",
  106. argv[0], argv[1]);
  107. exit(-1);
  108. }
  109.  
  110. while (token=yylex()) {
  111. printf("Meu analisador lexical reconheceu o token %d\n", token);
  112. }
  113. //printf("Iniciando dados.\n");
  114. init_stack(&pilha);
  115. //printf("Push.\n");
  116. push(&pilha, (void *) &START);
  117. //printf("Le o primeiro token.\n");
  118. token = yylex();
  119. //printf("Token %d\n",token);
  120. if(token)
  121. {
  122. printf("Passei aqui 1 if");
  123. while(!empty(pilha))
  124. {
  125. printf("Passei aqui while da pilha vazia");
  126. simbolo = (int *) pop(&pilha);
  127. //printf("Desempilhando: %i\n", *simbolo);
  128. /* Caso seja um simbolo nao terminal */
  129. if(*simbolo == E || *simbolo == X)
  130. {
  131. printf("Passei aqui 2 if");
  132. /*
  133. Mapeamos o valor do simbolo e do token para enderecos no array
  134. e buscamos a producao que tambem eh codificada com um inteiro
  135. */
  136. producao = tabela[(abs(*simbolo) - 1)][(token - 1)];
  137. //printf("tabela[%i][%i] = %i\n", (abs(*simbolo) - 1), (token - 1), producao);
  138. if(producao)
  139. {
  140. printf("Passei aqui 3 if");
  141. //printf("Empilha producao %i\n", producao);
  142. /* empilha cada elemento da producao */
  143. switch(producao)
  144. {
  145. case 1:
  146. //) E -> ’IDF’ X
  147. push(&pilha, (void *) &X);
  148. push(&pilha, (void *) &TIDF);
  149. break;
  150. case 2:
  151. //) E -> 'INT_LIT' X
  152. push(&pilha, (void *) &X);
  153. push(&pilha, (void *) &TINT_LIT);
  154. break;
  155. case 3:
  156. //) E -> ’(’ E ’)’ X
  157. push(&pilha, (void *) &X);
  158. push(&pilha, (void *) &TFECHA_PARENTESES);
  159. push(&pilha, (void *) &E);
  160. push(&pilha, (void *) &TABRE_PARENTESES);
  161. break;
  162. case 4:
  163. //) E -> ’+’ E X
  164. push(&pilha, (void *) &X);
  165. push(&pilha, (void *) &E);
  166. push(&pilha, (void *) &TSIMBOLO_MAIS);
  167. break;
  168. case 5:
  169. //) X -> ’-’ E X
  170. push(&pilha, (void *) &X);
  171. push(&pilha, (void *) &E);
  172. push(&pilha, (void *) &TSIMBOLO_MENOS);
  173. break;
  174. case 6:
  175. //) X -> ’*’ E X
  176. push(&pilha, (void *) &X);
  177. push(&pilha, (void *) &E);
  178. push(&pilha, (void *) &TSIMBOLO_ASTERISCO);
  179. break;
  180. case 7:
  181. //) X -> ’/’ E X
  182. push(&pilha, (void *) &X);
  183. push(&pilha, (void *) &E);
  184. push(&pilha, (void *) &TSIMBOLO_BARRA);
  185. break;
  186. case 8:
  187. //) X -> &
  188. push(&pilha, (void *) &TVAZIO);
  189. break;
  190. }
  191. }
  192. else
  193. {
  194. printf("ERROR 1");
  195. exit(-1);
  196. }
  197. }
  198. else
  199. {
  200. /* Quando o simbolo da pilha foi lido da entrada avancamos a leitura */
  201. if(*simbolo == token)
  202. {
  203. printf("Passei aqui 4 if");
  204. token = yylex();
  205. if(!token)
  206. {
  207. /* Sinaliza o fim do arquivo quando o yylex nao encontrar nada */
  208. token = CIF;
  209. }
  210. }
  211. else
  212. {
  213. printf("ERROR 2");
  214. exit(-1);
  215. }
  216. }
  217. }
  218. }
  219. else
  220. {
  221. printf("ERROR 3\n");
  222. exit(-1);
  223. }
  224. if(!yylex())
  225. {
  226. printf("OKAY\n");
  227. }
  228.  
  229. return(0);
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement