-
Notifications
You must be signed in to change notification settings - Fork 0
/
Portugol3.grammar
348 lines (265 loc) · 7.64 KB
/
Portugol3.grammar
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
/*****************************************************************************************
* Copyright (c) 2014, Carlos Alberto Santos de Souza ([email protected])
* Samir Dantas Oliveira ([email protected])
All Rights Reserved.
*
******************************************************************************************/
Helpers
//define terminais
//Alfabeto da linguagem
ascii_char = [0x0 .. 0x7f] ; //toda a tabela ascii
letra = ['a' .. 'z'] ;
letra_m = ['A' .. 'Z'] ;
digito = ['0' .. '9'] ;
//Pontuação
chave_dir = '}';
chave_esq = '{';
cochete_dir = ']';
cochete_esq = '[';
barra_dir = '/';
barra_esq = '\';
parentese_dir = ')';
parentese_esq = '(';
estrela = '*';
sublinhado = '_' ;
virgula = ',';
menos = '-';
mais = '+';
ponto_virgula = ';';
dois_pontos = ':';
exponenciacao = '^';
resto = '%' ;
atrib = '<-' ;
maiorq = '>' ;
menorq = '<' ;
maior_igual = '>=' ;
menor_igual = '<=';
igual = '=';
diferente = '<>' ;
ponto = '.' ;
apostrof = ''';
//caracteres não imprimiveis
tab = 9 ;
cr = 13 ;
lf = 10 ;
branco = ' ';
States
//Estados
normal,
comentario_aninhado;
Tokens
//Pontuação
chave_dir = '}';
chave_esq = '{';
cochete_dir = ']';
cochete_esq = '[';
barra_dir = '/';
barra_esq = '\';
parentese_dir = ')';
parentese_esq = '(';
estrela = '*';
sublinhado = '_' ;
virgula = ',';
menos = '-';
mais = '+';
ponto_virgula = ';';
dois_pontos = ':';
exponenciacao = '^';
resto = '%' ;
atrib = '<-' ;
maiorq = '>' ;
menorq = '<' ;
maior_igual = '>=' ;
menor_igual = '<=';
igual = '=';
diferente = '<>' ;
ponto = '.' ;
apostrof = ''';
//palavras reservadas
//programa
programa = 'programa' ;
inicio = 'inicio' ;
fim_ponto = 'fim'ponto ;
//variáveis
var = 'var';
constante = 'constante';
inteiro = 'inteiro';
real = 'real';
logico = 'logico';
caractere = 'caractere';
//condicional
se = 'se';
entao = 'entao';
fim_se = 'fim se';
senao = 'senao';
fim_senao = 'fim senao';
//Multicondicional(swith,case,...)
avalie = 'avalie' ;
caso = 'caso' ;
padrao = 'padrao';
//repetição para
para = 'para';
faca = 'faca' ;
ate = 'ate' ;
inicio_para = 'inicio para';
fim_para = 'fim para';
//repetição enquanto
enquanto = 'enquanto';
inicio_enquanto = 'inicio enquanto';
fim_enquanto = 'fim enquanto';
//Repetição repita
repita = 'repita';
inicio_repita = 'inicio repita';
fim_repita = 'fim repita';
//entrada e saida
leia = 'leia' ;
escreva = 'escreva' ;
//fluxo
passo = 'passo' ;
retorne = 'retorne';
interrompa = 'interrompa' ; //break em java
continue = 'continue';
//logicos
nao = 'nao' ;
ou = 'ou' ;
xou = 'xou' ;
e = 'e' ;
verdade = 'verdade';
falso = 'falso';
//listas
vetor = 'vetor' ;
//valores da linguagem
n_int = digito+;
n_real = digito+ virgula digito+;
l_caractere = apostrof [ascii_char - lf] apostrof;
//comentários
comentario = barra_dir barra_dir [ascii_char - [cr + lf]]*;
//comentatios aninhados, identificadores
{normal} brancos = (branco | cr lf | cr | lf | tab)+ ;
{normal} identificador = (letra |letra_m | sublinhado)+ (letra | letra_m | digito | sublinhado)*;
{normal->comentario_aninhado, comentario_aninhado}
comentario_inicio = barra_dir estrela;
{comentario_aninhado} comentario_fim = estrela barra_dir;
{comentario_aninhado} comentario_corpo = [ascii_char - [estrela + barra_dir]]*;
Ignored Tokens
//tokens ignorados
comentario, brancos,comentario_corpo;
Productions
//Regras da gramatica
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///Layout do programa
programa =
{cabecalho} T.programa identificador
declaracao
comando
fim_ponto ;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///declaraçao de variaveis e constantes.
//Ex: 'variavel' integer: numero [,var*]; / 'constante' constante numero [,var*]; / 'vetor' integer: numero[1] ;
declaracao =
{variaveis} P.tipo dois_pontos escorpo ponto_virgula |
{constantes} constante identificador valor ponto_virgula |
{vazio};
tipo =
{inteiro} inteiro |
{real} real |
{caractere} caractere ;
escorpo =
{lista_variaveis} escorpo virgula variavel |
{variavel} variavel;
variavel =
{vetor} identificador cochete_esq n_int cochete_dir |
{variavel} identificador;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Comandos
comando =
{se_senao} comando se_bloco ponto_virgula |
{vazio};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SE..SENAO
se_bloco =
{se_bloco} se parentese_esq exp_logica parentese_dir entao comando senao_bloco fim_se;
senao_bloco =
{senao_bloco} senao comando fim_senao |
{vazio};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// expressões aritimetricas : +,-,*,/
exp_aritimetrica =
{numero_negativo} menos termo |
{adicao_subtracao} exp_aritimetrica soma termo |
{termo} termo ;
soma =
{adicao} mais |
{subtracao} menos;
termo =
{multiplicacao_divisao} termo mult fator |
{fator} fator ;
mult =
{multiplicacao} estrela |
{divisao} barra_dir;
fator =
{exp_parenteses} parentese_esq exp_aritimetrica parentese_dir |
{elemento} elemento;
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//expressões logicas : nao,e,ou,xou
exp_logica =
{ou_logico} exp_logica ou exp_xou |
{exp_xou} exp_xou ;
exp_xou =
{oux_logico} exp_xou xou exp_e |
{exp_e} exp_e;
exp_e =
{e_logico} exp_e e exp_nao |
{exp_nao} exp_nao;
exp_nao =
{nao_logico} nao termo_logico |
{termo_logico} termo_logico ;
termo_logico =
{parenteses_logico} parentese_esq exp_logica parentese_dir |
{parenteses_comparacao} exp_comparativa;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Expressões comparativas : >,<,>=,<=,=,<>
exp_comparativa =
{igual_diferente1} [esq]: elemento P.simbolo1 [dir]: elemento |
{menor_maior} exp_menor_maior;
simbolo1 =
{igual} igual |
{diferente} diferente;
exp_menor_maior =
{menor_logico} [esq]: elemento P.simbolo2 [dir]: elemento |
{elemento} elemento;
simbolo2 =
{menor_que} menorq |
{maior_que} maiorq |
{menor_igual} menor_igual |
{maior_igual} maior_igual;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///elementos representantes de valores
elemento =
{valor} valor |
{variaveis} variavel;
valor =
{caractere} l_caractere |
{numero_inteiro} n_int |
{numero_real} n_real ;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* exp =
{valor} valor |
{variavel} var |
{subtracao} menos exp |
{soma} exp mais exp |
{subtracao} exp menos exp |
{multiplicacao} exp estrela exp |
{divisao} exp barra_dir exp |
{expressao_logica} exp-logica;
exp-logica =
{igual} exp igual exp |
{diferente} exp diferente exp |
{menor igual} exp menor_igual exp |
{maior igual} exp maior_igual exp |
{menor} exp menorq exp |
{maior} exp maiorq exp |
{negacao} nao exp-logica |
{conjuncao} exp-logica e exp-logica |
{uniao} exp-logica ou exp-logica |
{uniao exclusiva} exp-logica xou exp-logica;*/