26 return calloc
(1, sizeof
(struct label
));
38 printf
("%s jah estah definido!\n", name
);
43 context_check
(int op
, char *name
)
49 printf
("Simbolo nao declarado: %s\n", name
);
51 gen_code
(op
, id
->offset
);
66 %token
<id
> VARIABLE IDENTIFIER
67 %token
<label
> IF WHILE
68 %token ELSIF ELSE MY WRT_INT
75 program: statements
{ gen_code
(HALT
, 0); YYACCEPT; }
78 statements: statements statement
82 statement: declarations
';'
83 | VARIABLE
'=' expression
';' { context_check
(STORE
, $1); }
85 | WRT_INT
'(' INTEGER
')' ';' { gen_code
(LOAD_INT
, $3);
86 gen_code
(WRITE_INT
, 0); }
87 | WRT_INT
'(' VARIABLE
')' ';' { context_check
(LOAD_VAR
, $3);
88 gen_code
(WRITE_INT
, 0); }
89 | IF
'(' expression
')' { $1 = alloc_label
();
90 $1->for_jmp_false
= reserve_loc
(); }
91 '{' statements
'}' { back_patch
($1->for_jmp_false
,
94 | WHILE
{ $1 = alloc_label
();
95 $1->for_goto
= gen_label
(); }
96 '(' expression
')' { $1->for_jmp_false
= reserve_loc
(); }
97 '{' statements
'}' { gen_code
(GOTO
, $1->for_goto
);
98 back_patch
($1->for_jmp_false
,
101 | IDENTIFIER
'{' statements
'}'
104 declarations: MY VARIABLE
{ install
($2); }
108 id_list: id_list
',' VARIABLE
{ install
($3); }
112 expression: expression
'+' expression
{ gen_code
(ADD
, 0); }
113 | expression
'-' expression
{ gen_code
(SUB
, 0); }
114 | expression
'*' expression
{ gen_code
(MUL
, 0); }
115 | expression
'/' expression
{ gen_code
(DIV
, 0); }
116 | expression
'%' expression
{ gen_code
(MOD
, 0); }
117 | IDENTIFIER
'(' id_list
')'
118 | VARIABLE
{ context_check
(LOAD_VAR
, $1); }
119 | INTEGER
{ gen_code
(LOAD_INT
, $1); }
127 fprintf
(stderr
, "Uso: %s [argumentos] <programa>\n", pname
);
128 fprintf
(stderr
, "Onde argumentos pode ser:\n");
129 fprintf
(stderr
, "\t-o: Especifica arquivo de saida\n");
130 fprintf
(stderr
, "\t-d: Habilita saida de debugging do parser\n");
131 fprintf
(stderr
, "\t-h: Imprime essa mensagem e finaliza a execucao\n");
139 fprintf
(stderr
, "%s\n", err
);
143 main
(int argc
, char **argv
)
145 char *pname
= argv
[0];
146 char *outfile
= NULL
;
149 while
( (opt
= getopt
(argc
, argv
, "o:dh")) != -1) {
151 case
'd': /* enable parser debugging */
157 case
'h': /* print usage */
163 if
(optind
>= argc
) { /* input file missing */
167 yyin
= fopen
(argv
[optind
], "r");
170 fprintf
(stderr
, "Erro ao abrir %s\n", argv
[optind
]);
174 /* init symbol table */