-
Notifications
You must be signed in to change notification settings - Fork 0
/
Portugol.grammar
155 lines (128 loc) · 2.68 KB
/
Portugol.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
/*****************************************************************************************
* Copyright (c) 2014, Carlos Alberto Santos de Souza (carlos.albertoufs@gmail.com)
* Samir Dantas Oliveira (samir.ufs@hotmail.com)
All Rights Reserved.
*
******************************************************************************************/
Helpers
//define terminais
a = 'a';
b = 'b';
c = 'c';
d = 'd';
f = 'f';
g = 'g';
h = 'h';
i = 'i';
j = 'j';
k = 'k';
l = 'l';
m = 'm';
n = 'n';
o = 'o';
p = 'p';
q = 'q';
r = 'r';
s = 's';
t = 't';
u = 'u';
v = 'v';
x = 'x';
y = 'y';
w = 'w';
z = 'z';
chave_dir = '{' ;
chave_esq = '}' ;
colchete_dir = '[';
colchete_esq = ']';
barra = '/';
contra_barra = '\';
asterisco = '*';
sublinhado = '_' ;
barraou = '|' ;
ascii_char = [0x0 .. 0x7f] ; //define qual parte da tabela ascii usar
letra = ['a' .. 'z'] ;
letra_m = ['A' .. 'Z'] ;
digito = ['0' .. '9'] ;
//caracteres não imprimiveis
tab = 9 ;
cr = 13 ;
lf = 10 ;
blank = ' ' ;
States
normal,
comment;
Tokens
//palavras reservadas
programa = 'programa' ;
inicio = 'inicio' ;
fim = 'fim' ;
faca = 'faca' ;
ate = 'ate' ;
se = 'se' ;
entao = 'entao';
senao = 'senao' ;
avalie = 'avalie' ;
caso = 'caso' ;
enquanto = 'enquanto' ;
repita = 'repita';
para = 'para' ;
de = 'de' ;
passo = 'passo' ;
leia = 'leia' ;
escreva = 'escreva' ;
var = 'var' ;
fim_se = 'fim se' ;
fim_enquanto = 'fim enquanto' ;
fim_para = 'fim para' ;
fim_repita = 'fim repita' ;
caracter = 'caracter' ;
inteiro = 'inteiro' ;
logico = 'logico' ;
falso = 'falso' ;
verdade = 'verdade' ;
interrompa = 'interrompa' ; //break em java
nao = 'nao' ;
ou = 'ou' ;
procedimento = 'procedimento' ;
xou = 'xou' ;
e = 'e' ;
vetor = 'vetor' ;
const = 'const' ;
//símbolos aritméticos
mais = '+' ;
menos = '-';
mult = '*';
divisao = '/';
exponenciacao = '^';
resto = '%' ;
atrib ='<-' ;
//logico
maiorq = '>' ;
menorq = '<' ;
maior_igual = '>=' ;
menor_igual = '<=';
igual = '=';
diferente = '<>' ;
//pontuacao
virgula = ',';
dois_pontos = ':' ;
ponto_virgula = ';';
ponto = '.' ;
parentese_dir = '(';
parentese_esq = ')';
//numeros
numero = digito+ ;
//comentários
comentario = barra barra [ascii_char -[cr + lf]]*;
//comentatios aninhados
{normal} blanks = (blank | cr lf | cr | lf | tab)* ;
{normal} identificador = (letra |letra_m | sublinhado)+ (letra | letra_m | digito | sublinhado)*;
{normal->comment, comment}
comment = '/*';
{comment} comment_end = '*/';
{comment} comment_body = [ascii_char - ['*' + '/']*];
{comment} star = '*';
{comment} slash = '/';
Ignored Tokens
comentario, blanks;