Escriba usando Parse::Eyapp
un analizador sintáctico PL::Simple
para la siguiente gramática:
0 | p ds ss |
1 | p ss |
2 | ds d ';' ds |
3 | ds d ';' |
4 | d INT il |
5 | d STRING il |
6 | ss s ';' ss |
7 | ss s |
8 | s ID '=' e |
9 | s PRINT nel |
10 | s |
11 | e e '+' t |
12 | e e '-' t |
13 | e t |
14 | t t '*' f |
15 | t t '/' f |
16 | t f |
17 | f '(' e ')' |
18 | f ID |
19 | f NUM |
20 | f STR |
21 | f FUNCTIONID '(' el ')' |
22 | il ID ',' il |
23 | il ID |
24 | el nel |
25 | el |
26 | nel e ',' nel |
27 | nel e |
El terminal ID
corresponde a identificador y NUM
a un número entero sin signo.
El terminal STR
a cadenas de dobles comillas.
El terminal FUNCTIONID
viene dado por la expresión regular min|max|concat
.
Declare dichos terminales en la cabecera usando la directiva %token
(lea la documentación de
Parse::Eyapp
). Una directiva como:
%token ID FUNCTIONID NUMdeclara los terminales pero no les da prioridad.
C
.
a < b
, a == b
, etc.).
Observe que tales expresiones tiene menor prioridad que los operadores aditivos:
a = b < c + 2
es interpretada como a = b < (c + 2)
PL/Simple.pod
.
MANIFEST
. Ubiquelos en un directorio
de informes.