-
Notifications
You must be signed in to change notification settings - Fork 0
/
portugol.l
168 lines (144 loc) · 4.44 KB
/
portugol.l
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
%{
/*
Compilador PORTUGOL v.2q
Autor: Ruben Carlo Benante
Email: benante@gmail.com
Data criação: 23/04/2009
Data modificação: 24/05/2009
*/
#include <math.h>
#include <stdlib.h>
#include "portugol.h"
#include "y.tab.h"
FILE *fhead=NULL;
%}
%%
/* comandos reservados */
inicio { return INICIO; } /* { */
fim { return FIM; } /* } */
se { return SE; } /* if */
entao { return ENTAO; } /* then_separator */
senao { return SENAO; } /* else */
enquanto { return ENQUANTO; } /* while */
aborte { return ABORTE; } /* exit(1) */
para { return PARA; } /* for */
int { return INT; } /* int */
real { return REAL; } /* float */
texto { return TEXTO; } /* char* */
importe { return IMPORTE; } /* import double sqrt ( double ) */
define { return DEFINE; } /* define int funcId ( int argId ) */
"#debug" { return DEBUG; } /* pre-processor directive */
_ARVORE { return ARVORE; } /* turn on print-syntatic-tree option */
_TABELA { return TABELA; } /* turn on print-symbol-table option */
/* funcoes reservadas */
imprima { return IMPRIMA; } /* printf(format,x); format=={"%d", "%.2f", "%s"} */
leia { return LEIA; } /* scanf("%f",&x); */
saia { return SAIA; } /* exit(x) */
/* Pontuacao */
">=" { return GE; }
"<=" { return LE; }
"==" { return EQ; }
"!=" { return NE; }
">" { return GT; }
"<" { return LT; }
"e" { return E; }
"ou" { return OU; }
"nao" { return NAO; }
[-+*/=();%] { return yytext[0]; }
/* Identificadores */
[a-zA-Z][a-zA-Z0-9_]* { tabelaSimb *ps = achaId(yytext);
yylval.pSimb = ps;
return IDENT;
}
/* Constantes */
[0-9]+"."[0-9]+([eE][+-]?[0-9]+)? { tabelaSimb *ps = achaFloat(atof(yytext));
yylval.pSimb = ps;
return REALCON;
}
[0-9]+ { tabelaSimb *ps = achaInt(atoi(yytext));
yylval.pSimb = ps;
return INTCON;
}
"\""[^"\n]*"\"" { tabelaSimb *ps = achaStr(yytext);
yylval.pSimb = ps;
return TEXTOCON;
}
/* espacos e comentarios */
\n { lineno++; }
[ \t\r]+ ; /* do nothing */
"//".* ; /* one-line comments */
/* Outras coisas */
. { yyerror("caracter invalido"); }
%%
int yywrap(void)
{
return 1;
}
void yyerror(char *s)
{
fprintf(stderr, "// Linha:%d. Erro: %s Token: '%s'.\n", lineno, s, yytext);
}
int main(int ac, char **av)
{
int i;
yyin=stdin;
yyout=stdout;
fhead=stdout;
if(ac>2) //tem arquivo de saida
{
if((yyout = fopen(av[2],"w"))==NULL)
{
fprintf(stderr, "Nao consigo abrir arquivo %s para gravacao.\n", av[2]);
exit(1);
}
if((fhead = fopen("saida.h","w"))==NULL)
{
fprintf(stderr, "Nao consigo abrir arquivo saida.h para gravacao.\n");
exit(1);
}
}
if(ac>1)
{
if((yyin = fopen(av[1],"r"))==NULL)
{
fprintf(stderr, "Nao consigo abrir arquivo %s para leitura.\n", av[1]);
exit(1);
}
}
else
fprintf(yyout, "Compilador PORTUGOL versao 2q, por Ruben Carlo Benante (24/05/09).\n");
addFuncVoid("imprima", (void *)printf, "printf");
addFuncVoid("leia", (void *)scanf, "scanf");
addFuncVoid("saia", (void *)exit, "exit");
addFuncDouble("raiz", sqrt, "sqrt");
addFuncDouble("exp", exp, "exp");
addConStr("?");
if(yyparse()) //falhou
{
fprintf(stderr, "// Falha! Programa em Portugol nao compilado.\n\n");
if(yyout!=stdout)
fprintf(yyout, "// Falha! Programa em Portugol nao compilado.\n\n");
return 1;
}
return 0;
}
void addConStr(char *s)
{
tabelaSimb *ps = achaStr(s);
}
void addFuncDouble(char *id, double (*func)(), char *idF)
{
tabelaSimb *ps = achaId(id); //ps->idNome = strdup(nome);
ps->dfunc = func;
ps->tipoD = tipoIdFuncDouble;
ps->idx = geraTF();
ps->idFunc = strdup(idF);
}
void addFuncVoid(char *id, void (*func)(), char *idF)
{
tabelaSimb *ps = achaId(id); //idName
ps->vfunc = func;
ps->tipoD = tipoIdFuncVoid;
ps->idx = geraTF();
ps->idFunc = strdup(idF);
}