Advertisement
Guest User

Untitled

a guest
Oct 1st, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.69 KB | None | 0 0
  1. /* ESPECIFICACAO LÉXICA LINGUAGEM LUA
  2. VIVIANE PEREIRA E FLORENCIA MALLENCHINI 2016.1 */
  3. %{
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include "arvore.h"
  7. #include <stdarg.h>
  8. #include <string.h>
  9.  
  10. FILE *yyin;
  11. FILE *yyout;
  12. extern int line_num;
  13.  
  14. /* prottipos */
  15. noTipo *opr(int oper, int nops, ...);
  16. noTipo *id(char i[50]);
  17. noTipo *con(int value);
  18. noTipo *naoTerm(int t, int nFilhos, ...) ;
  19.  
  20. void freeNode(noTipo *p);
  21. int ex(noTipo *p);
  22. //int yylex(void);
  23.  
  24. void yyerror(char *s);
  25. int sym[26];
  26. %}
  27.  
  28. %union {
  29. int val;
  30. char string[50];
  31. noTipo *nPtr;
  32. }
  33. /* TOKENS */
  34. %start input
  35. %token T_AND
  36. %token T_DO
  37. %token T_ELSE
  38. %token T_ELSEIF
  39. %token T_END
  40. %token T_FOR
  41. %token T_FUNCTION
  42. %token T_IF
  43. %token T_LOCAL
  44. %token T_NIL
  45. %token T_NOT
  46. %token T_OR
  47. %token T_RETURN
  48. %token T_THEN
  49. %token T_WHILE
  50.  
  51. %token <val> T_NUMBER
  52. %token <string> T_NAME
  53.  
  54. %token T_EQ
  55. %token T_GTEQ
  56. %token T_LTEQ
  57. %token T_NEQ
  58. %token T_MINUS
  59. %token T_PLUS
  60. %token T_TIMES
  61. %token T_DIV
  62. %token T_COMMA
  63. %token T_SEMICOL
  64. %token T_ASSIGN
  65. %token T_GT
  66. %token T_LT
  67. %token T_OPENPAR
  68. %token T_CLOSEPAR
  69.  
  70. %nonassoc T_NEQ T_EQ T_GTEQ T_LTEQ T_OPENPAR T_CLOSEPAR
  71. %nonassoc T_LT T_GT
  72. %left T_OR
  73. %left T_AND
  74. %left T_PLUS T_MINUS
  75. %left T_TIMES T_DIV
  76. %right T_ASSIGN
  77. %left UNARY_OPERATOR
  78.  
  79. %type <nPtr> exp comando comandoret opbin opunaria semicol_aux for_aux lista_elseif comando_else listaexp_opcional_comandoret listadenomes_opicional programa
  80. %type <nPtr> lista_exp_opcional listaexp listadenomes chamadadefuncao listadenomes_function_opcional listaexpr_loop lista_comando comandoret_opcional listaexp_opcional
  81. %type <nPtr> bloco
  82.  
  83. %% /* Gramatica LUA */
  84.  
  85. input: programa {ex($1);}
  86. ;
  87.  
  88. programa: bloco { $$ = naoTerm(programa,1,$1); }
  89. ;
  90.  
  91. bloco: lista_comando comandoret_opcional {$$ = naoTerm(bloco,2,$1,$2);}
  92. ;
  93.  
  94. lista_comando: comando lista_comando { $$ = naoTerm(comando,2,$1,$2);} | {}
  95. ;
  96.  
  97. comandoret: T_RETURN listaexp_opcional_comandoret semicol_aux { $$ = naoTerm(comandoret,3,opr(T_RETURN, 1, NULL),$2,$3); }
  98. ;
  99.  
  100. listaexp_opcional_comandoret: listaexp | {}
  101. ;
  102.  
  103. semicol_aux: T_SEMICOL { $$ = opr(T_SEMICOL, 1, NULL); } | {}
  104. ;
  105.  
  106. comandoret_opcional: comandoret | {}
  107. ;
  108.  
  109. comando: T_SEMICOL { $$ = opr(T_SEMICOL, 1, NULL); } |
  110. listadenomes T_ASSIGN listaexp { $$ = naoTerm(listadenomes,3,$1,opr(T_ASSIGN, 1,NULL),$3); } |
  111. chamadadefuncao |
  112. T_DO bloco T_END { $$ = opr(T_DO, 2, $2, opr(T_END, 1, NULL)); } |
  113. T_WHILE exp T_DO bloco T_END { $$ = opr(T_WHILE, 4, $2,opr(T_DO, 1, NULL),$4,opr(T_END, 1, NULL)); } |
  114. T_FOR T_NAME T_ASSIGN exp T_COMMA exp for_aux T_DO bloco T_END { $$ = opr(T_FOR,9, id($2),opr(T_ASSIGN, 1, NULL), $4,opr(T_COMMA, 1, NULL), $6, $7,opr(T_DO, 1, NULL), $9, opr(T_END, 1, NULL)); } |
  115. T_IF exp T_THEN bloco lista_elseif comando_else T_END { $$ = opr(T_IF, 6, $2,opr(T_THEN, 1, NULL),$4, $5, $6,opr(T_END, 1, NULL));} |
  116. T_FUNCTION T_NAME T_OPENPAR listadenomes_function_opcional T_CLOSEPAR bloco T_END { $$ = opr(T_FUNCTION,6,id($2),opr(T_OPENPAR, 1,NULL),$4,opr(T_CLOSEPAR, 1,NULL), $6,opr(T_END, 1, NULL)); } |
  117. T_LOCAL listadenomes lista_exp_opcional { $$ = opr(T_LOCAL, 2, $2, $3); }
  118. ;
  119.  
  120. for_aux: T_COMMA exp { opr(T_COMMA, 1, $2) } | {}
  121. ;
  122.  
  123. listadenomes_function_opcional: listadenomes | {}
  124. ;
  125.  
  126. lista_exp_opcional: T_ASSIGN listaexp { $$ = opr(T_ASSIGN, 1, $2); } | {}
  127. ;
  128.  
  129. lista_elseif : T_ELSEIF exp T_THEN bloco lista_elseif { $$ = opr(T_ELSEIF, 4, $2,opr(T_THEN, 1, NULL), $4,$5); } | {}
  130. ;
  131.  
  132. comando_else: T_ELSE bloco { $$ = opr(T_ELSE, 1, $2); } |{}
  133. ;
  134.  
  135. exp: T_NUMBER { $$ = naoTerm(exp,1,con($1));}|
  136. T_NAME { $$ = naoTerm(exp,1,id($1));} |
  137. T_NIL { $$ = naoTerm(exp,1,opr(T_NIL, 1, NULL));} |
  138. chamadadefuncao {$$ = naoTerm(exp,1,$1);} |
  139. opbin {$$ = naoTerm(exp,1,$1);} |
  140. opunaria {$$ = naoTerm(exp,1,$1);} |
  141. T_OPENPAR exp T_CLOSEPAR { $$ = opr(T_OPENPAR, 2, $2,opr(T_CLOSEPAR, 1, NULL)); }
  142. ;
  143.  
  144. chamadadefuncao: T_NAME T_OPENPAR listaexp_opcional T_CLOSEPAR { $$ = naoTerm(chamadadefuncao,4,id($1),opr(T_OPENPAR, 1,NULL),$3,opr(T_CLOSEPAR, 1,NULL));}
  145. ;
  146.  
  147. listaexp_opcional: listaexp | {}
  148. ;
  149.  
  150. listadenomes: T_NAME listadenomes_opicional { $$ = id($1);/*naoTerm(listadenomes,2,id($1),$2);*/}
  151. ;
  152.  
  153. listadenomes_opicional: T_COMMA T_NAME listadenomes_opicional { $$ = opr(T_COMMA,2,id($2),$3);} | {}
  154. ;
  155.  
  156. listaexp: exp listaexpr_loop {$$ = naoTerm(listaexp,2,$1,$2); }
  157. ;
  158.  
  159. listaexpr_loop: T_COMMA exp listaexpr_loop { $$ = opr(T_COMMA, 2, $2,$3); } | {}
  160. ;
  161.  
  162. opbin: exp T_MINUS exp { $$ = naoTerm(opbin,3,$1,opr(T_MINUS,1,NULL),$3);}|
  163. exp T_PLUS exp {$$ = naoTerm(opbin,3,$1,opr(T_PLUS,1,NULL),$3);} |
  164. exp T_TIMES exp { $$ = naoTerm(opbin,3,$1,opr(T_TIMES,1,NULL),$3);} |
  165. exp T_DIV exp { $$ = naoTerm(opbin,3,$1,opr(T_DIV,1,NULL),$3); } |
  166. exp T_LT exp { $$ = naoTerm(opbin,3,$1,opr(T_LT,1,NULL),$3); } |
  167. exp T_LTEQ exp { $$ = naoTerm(opbin,3,$1,opr(T_LTEQ,1,NULL),$3); } |
  168. exp T_GT exp { $$ = naoTerm(opbin,3,$1,opr(T_GT,1,NULL),$3); } |
  169. exp T_GTEQ exp { $$ = naoTerm(opbin,3,$1,opr(T_GTEQ,1,NULL),$3); } |
  170. exp T_EQ exp { $$ = naoTerm(opbin,3,$1,opr(T_EQ,1,NULL),$3); }|
  171. exp T_NEQ exp { $$ = naoTerm(opbin,3,$1,opr(T_NEQ,1,NULL),$3); } |
  172. exp T_AND exp { $$ = naoTerm(opbin,3,$1,opr(T_AND,1,NULL),$3); } |
  173. exp T_OR exp { $$ = naoTerm(opbin,3,$1,opr(T_OR,1,NULL),$3); }
  174. ;
  175.  
  176. opunaria: T_MINUS exp %prec UNARY_OPERATOR { $$ = naoTerm(opunaria,2,opr(T_MINUS,1,NULL), $2); } |
  177. T_NOT exp %prec UNARY_OPERATOR { $$ = naoTerm(opunaria,2,opr(T_NOT,1,NULL), $2); }
  178. ;
  179.  
  180. %%
  181. noTipo *con(int value) {
  182. noTipo *p;
  183.  
  184. /* allocate node */
  185. if ((p = malloc(sizeof(noTipo))) == NULL)
  186. yyerror("out of memory");
  187.  
  188. /* copy information */
  189. p->tipo = tipoConstante;
  190. p->con.valor = value;
  191.  
  192. return p;
  193. }
  194.  
  195. noTipo *id(char i[50]) {
  196. noTipo *p;
  197.  
  198. /* allocate node */
  199. if ((p = malloc(sizeof(noTipo))) == NULL)
  200. yyerror("out of memory");
  201.  
  202. /* copy information */
  203. p->tipo = tipoId;
  204. p->id.i = i;
  205.  
  206. return p;
  207. }
  208.  
  209. noTipo *naoTerm(int t, int nFilhos, ...) {
  210. va_list f;
  211. noTipo *p;
  212. int i;
  213. /* allocate node */
  214. if ((p = malloc(sizeof(noTipo) + (nFilhos-1) * sizeof(noTipo *))) == NULL)
  215. yyerror("out of memory");
  216.  
  217. /* copy information */
  218. p->tipo = tipoNaoTerminal;
  219. p->naoTerm.terminais = t;
  220. p->naoTerm.numFilhos = nFilhos;
  221.  
  222. va_start(f, nFilhos);
  223. for (i = 0; i < nFilhos; i++)
  224. p->naoTerm.filhos[i] = va_arg(f, noTipo*);
  225. va_end(f);
  226. return p;
  227. }
  228.  
  229.  
  230. noTipo *opr(int oper, int nops, ...) {
  231. va_list ap;
  232. noTipo *p;
  233. int i;
  234.  
  235. /* allocate node, extending op array */
  236. if ((p = malloc(sizeof(noTipo) + (nops-1) * sizeof(noTipo *))) == NULL)
  237. yyerror("out of memory");
  238.  
  239. /* copy information */
  240. p->tipo = tipoOperador;
  241. p->opr.oper = oper;
  242. p->opr.nops = nops;
  243. va_start(ap, nops);
  244. for (i = 0; i < nops; i++)
  245. p->opr.op[i] = va_arg(ap, noTipo*);
  246. va_end(ap);
  247. return p;
  248. }
  249.  
  250. void freeNode(noTipo *p) {
  251. int i;
  252.  
  253. if (!p) return;
  254. if (p->tipo == tipoOperador) {
  255. for (i = 0; i < p->opr.nops; i++)
  256. freeNode(p->opr.op[i]);
  257. }
  258. free (p);
  259. }
  260.  
  261.  
  262. void yyerror(char *s)
  263. {
  264. printf("Error: %s linha: %d \n", s,line_num);
  265. }
  266.  
  267.  
  268. int main(int argc, char **argv)
  269. {
  270. ++argv, --argc; /* pular o nome do programa */
  271. if(argc == 0)
  272. {
  273. yyin = stdin;
  274. yyout = stdout;
  275. }
  276. else if(argc == 1)
  277. {
  278. yyin = fopen(argv[0], "r" );
  279. yyout = stdout;
  280. }
  281. else if(argc == 2){
  282. yyin = fopen(argv[0], "r" );
  283. yyout = fopen(argv[1], "a+");
  284. }
  285. printf("valor %d \n",yyparse());
  286. // printTree(arvore);
  287. return 0;
  288. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement