Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ESPECIFICACAO LÉXICA LINGUAGEM LUA
- VIVIANE PEREIRA E FLORENCIA MALLENCHINI 2016.1 */
- %{
- #include <stdlib.h>
- #include <stdio.h>
- #include "arvore.h"
- #include <stdarg.h>
- #include <string.h>
- FILE *yyin;
- FILE *yyout;
- extern int line_num;
- /* prottipos */
- noTipo *opr(int oper, int nops, ...);
- noTipo *id(char i[50]);
- noTipo *con(int value);
- noTipo *naoTerm(int t, int nFilhos, ...) ;
- void freeNode(noTipo *p);
- int ex(noTipo *p);
- //int yylex(void);
- void yyerror(char *s);
- int sym[26];
- %}
- %union {
- int val;
- char string[50];
- noTipo *nPtr;
- }
- /* TOKENS */
- %start input
- %token T_AND
- %token T_DO
- %token T_ELSE
- %token T_ELSEIF
- %token T_END
- %token T_FOR
- %token T_FUNCTION
- %token T_IF
- %token T_LOCAL
- %token T_NIL
- %token T_NOT
- %token T_OR
- %token T_RETURN
- %token T_THEN
- %token T_WHILE
- %token <val> T_NUMBER
- %token <string> T_NAME
- %token T_EQ
- %token T_GTEQ
- %token T_LTEQ
- %token T_NEQ
- %token T_MINUS
- %token T_PLUS
- %token T_TIMES
- %token T_DIV
- %token T_COMMA
- %token T_SEMICOL
- %token T_ASSIGN
- %token T_GT
- %token T_LT
- %token T_OPENPAR
- %token T_CLOSEPAR
- %nonassoc T_NEQ T_EQ T_GTEQ T_LTEQ T_OPENPAR T_CLOSEPAR
- %nonassoc T_LT T_GT
- %left T_OR
- %left T_AND
- %left T_PLUS T_MINUS
- %left T_TIMES T_DIV
- %right T_ASSIGN
- %left UNARY_OPERATOR
- %type <nPtr> exp comando comandoret opbin opunaria semicol_aux for_aux lista_elseif comando_else listaexp_opcional_comandoret listadenomes_opicional programa
- %type <nPtr> lista_exp_opcional listaexp listadenomes chamadadefuncao listadenomes_function_opcional listaexpr_loop lista_comando comandoret_opcional listaexp_opcional
- %type <nPtr> bloco
- %% /* Gramatica LUA */
- input: programa {ex($1);}
- ;
- programa: bloco { $$ = naoTerm(programa,1,$1); }
- ;
- bloco: lista_comando comandoret_opcional {$$ = naoTerm(bloco,2,$1,$2);}
- ;
- lista_comando: comando lista_comando { $$ = naoTerm(comando,2,$1,$2);} | {}
- ;
- comandoret: T_RETURN listaexp_opcional_comandoret semicol_aux { $$ = naoTerm(comandoret,3,opr(T_RETURN, 1, NULL),$2,$3); }
- ;
- listaexp_opcional_comandoret: listaexp | {}
- ;
- semicol_aux: T_SEMICOL { $$ = opr(T_SEMICOL, 1, NULL); } | {}
- ;
- comandoret_opcional: comandoret | {}
- ;
- comando: T_SEMICOL { $$ = opr(T_SEMICOL, 1, NULL); } |
- listadenomes T_ASSIGN listaexp { $$ = naoTerm(listadenomes,3,$1,opr(T_ASSIGN, 1,NULL),$3); } |
- chamadadefuncao |
- T_DO bloco T_END { $$ = opr(T_DO, 2, $2, opr(T_END, 1, NULL)); } |
- T_WHILE exp T_DO bloco T_END { $$ = opr(T_WHILE, 4, $2,opr(T_DO, 1, NULL),$4,opr(T_END, 1, NULL)); } |
- 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)); } |
- 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));} |
- 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)); } |
- T_LOCAL listadenomes lista_exp_opcional { $$ = opr(T_LOCAL, 2, $2, $3); }
- ;
- for_aux: T_COMMA exp { opr(T_COMMA, 1, $2) } | {}
- ;
- listadenomes_function_opcional: listadenomes | {}
- ;
- lista_exp_opcional: T_ASSIGN listaexp { $$ = opr(T_ASSIGN, 1, $2); } | {}
- ;
- lista_elseif : T_ELSEIF exp T_THEN bloco lista_elseif { $$ = opr(T_ELSEIF, 4, $2,opr(T_THEN, 1, NULL), $4,$5); } | {}
- ;
- comando_else: T_ELSE bloco { $$ = opr(T_ELSE, 1, $2); } |{}
- ;
- exp: T_NUMBER { $$ = naoTerm(exp,1,con($1));}|
- T_NAME { $$ = naoTerm(exp,1,id($1));} |
- T_NIL { $$ = naoTerm(exp,1,opr(T_NIL, 1, NULL));} |
- chamadadefuncao {$$ = naoTerm(exp,1,$1);} |
- opbin {$$ = naoTerm(exp,1,$1);} |
- opunaria {$$ = naoTerm(exp,1,$1);} |
- T_OPENPAR exp T_CLOSEPAR { $$ = opr(T_OPENPAR, 2, $2,opr(T_CLOSEPAR, 1, NULL)); }
- ;
- 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));}
- ;
- listaexp_opcional: listaexp | {}
- ;
- listadenomes: T_NAME listadenomes_opicional { $$ = id($1);/*naoTerm(listadenomes,2,id($1),$2);*/}
- ;
- listadenomes_opicional: T_COMMA T_NAME listadenomes_opicional { $$ = opr(T_COMMA,2,id($2),$3);} | {}
- ;
- listaexp: exp listaexpr_loop {$$ = naoTerm(listaexp,2,$1,$2); }
- ;
- listaexpr_loop: T_COMMA exp listaexpr_loop { $$ = opr(T_COMMA, 2, $2,$3); } | {}
- ;
- opbin: exp T_MINUS exp { $$ = naoTerm(opbin,3,$1,opr(T_MINUS,1,NULL),$3);}|
- exp T_PLUS exp {$$ = naoTerm(opbin,3,$1,opr(T_PLUS,1,NULL),$3);} |
- exp T_TIMES exp { $$ = naoTerm(opbin,3,$1,opr(T_TIMES,1,NULL),$3);} |
- exp T_DIV exp { $$ = naoTerm(opbin,3,$1,opr(T_DIV,1,NULL),$3); } |
- exp T_LT exp { $$ = naoTerm(opbin,3,$1,opr(T_LT,1,NULL),$3); } |
- exp T_LTEQ exp { $$ = naoTerm(opbin,3,$1,opr(T_LTEQ,1,NULL),$3); } |
- exp T_GT exp { $$ = naoTerm(opbin,3,$1,opr(T_GT,1,NULL),$3); } |
- exp T_GTEQ exp { $$ = naoTerm(opbin,3,$1,opr(T_GTEQ,1,NULL),$3); } |
- exp T_EQ exp { $$ = naoTerm(opbin,3,$1,opr(T_EQ,1,NULL),$3); }|
- exp T_NEQ exp { $$ = naoTerm(opbin,3,$1,opr(T_NEQ,1,NULL),$3); } |
- exp T_AND exp { $$ = naoTerm(opbin,3,$1,opr(T_AND,1,NULL),$3); } |
- exp T_OR exp { $$ = naoTerm(opbin,3,$1,opr(T_OR,1,NULL),$3); }
- ;
- opunaria: T_MINUS exp %prec UNARY_OPERATOR { $$ = naoTerm(opunaria,2,opr(T_MINUS,1,NULL), $2); } |
- T_NOT exp %prec UNARY_OPERATOR { $$ = naoTerm(opunaria,2,opr(T_NOT,1,NULL), $2); }
- ;
- %%
- noTipo *con(int value) {
- noTipo *p;
- /* allocate node */
- if ((p = malloc(sizeof(noTipo))) == NULL)
- yyerror("out of memory");
- /* copy information */
- p->tipo = tipoConstante;
- p->con.valor = value;
- return p;
- }
- noTipo *id(char i[50]) {
- noTipo *p;
- /* allocate node */
- if ((p = malloc(sizeof(noTipo))) == NULL)
- yyerror("out of memory");
- /* copy information */
- p->tipo = tipoId;
- p->id.i = i;
- return p;
- }
- noTipo *naoTerm(int t, int nFilhos, ...) {
- va_list f;
- noTipo *p;
- int i;
- /* allocate node */
- if ((p = malloc(sizeof(noTipo) + (nFilhos-1) * sizeof(noTipo *))) == NULL)
- yyerror("out of memory");
- /* copy information */
- p->tipo = tipoNaoTerminal;
- p->naoTerm.terminais = t;
- p->naoTerm.numFilhos = nFilhos;
- va_start(f, nFilhos);
- for (i = 0; i < nFilhos; i++)
- p->naoTerm.filhos[i] = va_arg(f, noTipo*);
- va_end(f);
- return p;
- }
- noTipo *opr(int oper, int nops, ...) {
- va_list ap;
- noTipo *p;
- int i;
- /* allocate node, extending op array */
- if ((p = malloc(sizeof(noTipo) + (nops-1) * sizeof(noTipo *))) == NULL)
- yyerror("out of memory");
- /* copy information */
- p->tipo = tipoOperador;
- p->opr.oper = oper;
- p->opr.nops = nops;
- va_start(ap, nops);
- for (i = 0; i < nops; i++)
- p->opr.op[i] = va_arg(ap, noTipo*);
- va_end(ap);
- return p;
- }
- void freeNode(noTipo *p) {
- int i;
- if (!p) return;
- if (p->tipo == tipoOperador) {
- for (i = 0; i < p->opr.nops; i++)
- freeNode(p->opr.op[i]);
- }
- free (p);
- }
- void yyerror(char *s)
- {
- printf("Error: %s linha: %d \n", s,line_num);
- }
- int main(int argc, char **argv)
- {
- ++argv, --argc; /* pular o nome do programa */
- if(argc == 0)
- {
- yyin = stdin;
- yyout = stdout;
- }
- else if(argc == 1)
- {
- yyin = fopen(argv[0], "r" );
- yyout = stdout;
- }
- else if(argc == 2){
- yyin = fopen(argv[0], "r" );
- yyout = fopen(argv[1], "a+");
- }
- printf("valor %d \n",yyparse());
- // printTree(arvore);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement