El documento presenta una gramática para expresiones aritméticas y derivaciones por la izquierda y árboles sintácticos abstractos para tres expresiones diferentes según la gramática dada. También incluye declaraciones de tipo C para un árbol sintáctico abstracto correspondiente a otra gramática y un ejemplo de árbol sintáctico para esa gramática. Finalmente, muestra que una solución propuesta para resolver la ambigüedad del else no es efectiva al seguir siendo ambigua.
1. Benjamín Joaquín Martínez Compiladores 2021B
3.3 Dada la gramática
exp exp opsuma term|term
opsuma + | -
term term opmult factor|factor
opmult *
factor ( exp ) | número
Escriba derivaciones por la izquierda, árboles de análisis gramatical y árboles sintácticos
abstractos para las siguientes expresiones:
a. 3 + 4 * 5 – 6
b. 3 * (4 – 5 + 6)
c. 3 – ( 4 + 5 * 6 )
exp => exp opsuma term [ exp exp opsuma term ]
=> exp opsuma factor [ term factor ]
=> exp opsuma numero [ factor número ]
=> exp – numero [ opsuma - ]
=> exp opsuma term – numero [ exp exp opsuma term ]
=> exp opsuma term opmult factor – numero [ term term opmult factor]
=> exp opsuma term opmult numero – numero [ factor número]
=> exp opsuma term * numero – numero [ opmult *]
=> exp opsuma factor * numero – numero [ term factor]
=> exp opsuma numero * numero – numero [ factor número]
=> exp + numero * numero – numero [ opsuma +]
=> term + numero * numero – numero [ exp term]
=> factor + numero * numero – numero [ term factor]
=> numero + numero * numero – numero [ factor número]
3 + 4 * 5 – 6
2. Benjamín Joaquín Martínez Compiladores 2021B
exp => term [ exp term]
=> term opmult factor [ term term opmult factor]
=> term opmult ( exp ) [factor ( exp )]
=> term opmult ( exp opsuma term ) [ exp exp opsuma term ]
=> term opmult ( exp opsuma factor ) [ term factor]
=> term opmult ( exp opsuma numero ) [ factor número]
=> term opmult (exp opsuma term + numero ) [ opsuma +]
=> term opmult (exp opsuma factor + numero ) [ term factor]
=> term opmult (exp opsuma numero + numero ) [ factor número]
=> term opmult (exp - numero + numero ) [ opsuma - ]
=> term opmult (term - numero + numero ) [ exp term]
=> term opmult (factor - numero + numero ) [ term factor]
=> term opmult (numero - numero + numero ) [ factor número]
=> term * (numero - numero + numero ) [ opmult *]
=> factor * (numero - numero + numero ) [ term factor]
=> numero * (numero - numero + numero ) [ factor número]
3 * (4 – 5 + 6)
exp => exp opsuma term [ exp exp opsuma term ]
=> exp opsuma factor [ term factor]
=> exp opsuma ( exp ) [factor ( exp )]
=> exp opsuma (exp opsuma term) [ exp exp opsuma term ]
=> exp opsuma (exp opsuma term opmult factor) [ term term opmult factor]
=> exp opsuma (exp opsuma term opmult numero) [ factor número]
=> exp opsuma (exp opsuma term * numero) [ opmult *]
=> exp opsuma (exp opsuma factor * numero) [ term factor]
=> exp opsuma (exp opsuma numero * numero) [ factor número]
=> exp opsuma (exp + numero * numero) [ opsuma + ]
=> exp opsuma (term + numero * numero) [ exp term]
3. Benjamín Joaquín Martínez Compiladores 2021B
=> exp opsuma (factor + numero * numero) [ term factor]
=> exp opsuma (numero + numero * numero) [ factor número]
=> exp - (numero + numero * numero) [ opsuma - ]
=> term - (numero + numero * numero) [ exp term]
=> factor - (numero + numero * numero) [ term factor]
=> numero - (numero + numero * numero) [ factor número]
3 – ( 4 + 5 * 6 )
exp
exp opsuma term
exp opsuma term
term
factor
numero
+ term opmult factor
factor
numero
* numero
- factor
numero
4. Benjamín Joaquín Martínez Compiladores 2021B
exp
term
term opmult
factor
factor
numero
*
( exp )
exp opsuma term
exp opsuma term
term
factor
numero
- factor
numero
factor
numero
+
5. Benjamín Joaquín Martínez Compiladores 2021B
exp
exp opsuma term
factor
(
exp )
exp opsuma term
term
factor
numero
+
term opmult factor
factor
numero
* numero
-
term
factor
numero
6. Benjamín Joaquín Martínez Compiladores 2021B
exp
numero
+
numero
*
numero
-
numero
exp
numero
*
( )
numero
-
numero
numero
+
8. Benjamín Joaquín Martínez Compiladores 2021B
3.16 Vuelva a escribir el árbol sintáctico typedef al principio de la sección 3.3.2 ( página 111) para
utilizar una unión.
typedef enum {Plus,Minus,Times) OpKind;
typedef enum {OpKind,ConstKind) ExpKind;
union streenode
{ ExpKind kind;
OpKind op;
int val;
} ;
streenode *SyntaxTree;
3.7 a) Escriba declaraciones tipo C para una estructura de árbol sintáctico abstracto
correspondiente a la gramática del ejercicio 3.6
typedef enum (atom,list) LexpKind;
typedef enum (numero,identificador) AtomKind;
typedef enum (lexp-sec, lexp) LexpsecKind;
typedef union lexp-secUnion {
LexpsecKind ls;
LexpsecKind lp;
};
lexp-secUnion lu, *u;
typedef struct streenode{
LexpKind lkind;
AtomKind akind;
struct list {
char str [1];
u lexp-sec;
char str [1];
} List;
lexp-secUnion
}
streenode * SyntaxTree
9. Benjamín Joaquín Martínez Compiladores 2021B
b) Dibuje el árbol sintáctico para la cadena ( a 23 ( m x y ) ) que resultaría de sus declaraciones del
inciso a.
3.9 (Aho, Sethi y Ullman) Muestre que el siguiente intento para resolver la ambigüedad del else
ambigüo todavía es ambigüo (compare con la solución de la 121):
sentencia if ( exp) sentencia | sent-igualada
sent-igualada if (exp) sent-igualada else sentencia | otro
exp 0 |1
Al partir de un nodo padre “sentencia” ambas opciones llevan a la construcción de un árbol de
análisis gramatical que puede coincidir con la misma cadena. Por ejemplo la cadena
If(0) if(1) otro else otro tiene dos caminos iniciales que pueden llevar a dos árboles de análisis
gramatical.
lexp
lexp-sec list
( lexp-sec )
a 23
m x y
10. Benjamín Joaquín Martínez Compiladores 2021B
sentencia
if ( exp ) sentencia
0 sent-igualada
if ( exp ) sent-igualada else sentencia
sent-igualada
otro
otro
1
sentencia
if ( exp )
sentencia
1
sent-igualada
if ( exp ) sent-igualada else sentencia
sent-igualada
otro
otro
0
sent-igualada
sentencia