1. Benjamín Joaquín Martínez Compiladores 2021B
2.10
Vuelva a escribir el pseudocódigo para la implementación del DFA para comentarios en C (sección
2.3.3) utilizando el carácter de entrada como prueba en case externo y el estado como prueba del
case interno. Compare su pseudocódigo con el del texto. ¿En qué circunstancias preferiría usted
utilizar esta organización para implementación de código de un DFA?
estado:= 1; {inicio]
while estado = 1,2,3 o 4 do
case estado of
1: case carácter de entrada of
“/” : avanza en la entrada;
estado:=2;
else estado:= … {error u otro};
end case;
2: case carácter de entrada of
“*”: avanza en la entrada;
estado:=3;
else estado := . . . {error u otro};
end case;
3: case carácter de entrada of
“*”: avanza en la entrada;
estado := 4;
else advance the input { y permanecer en el estado 3};
end case;
4: case carácter de entrada of
“/” avanza en la entrada;
estado := 5;
“*”: avanza en la entrada; { y permanecer en el estado 4 }
else avanza en la entrada;
estado := 3;
end case;
end case;
end while;
if estado = 5 then aceptar else error;
estado:= 1; {inicio]
while estado != 5 do
case carácter de entrada of
“/”: case estado of
1 : avanza en la entrada;
estado:=2;
2 : estado := . . . {error u otro};
3 : advance the input { y permanecer en el estado 3};
4 : avanza en la entrada;
estado := 5;
end case;
“*”: case estado of
1 : estado := . . . {error u otro};
2 : avanza en la entrada;
estado:=3;
3 : avanza en la entrada;
estado := 4;
4 : avanza en la entrada; { y permanecer en el estado 4 }
end case;
default: case estado of
1 : estado := . . . {error u otro};
2 : estado := . . . {error u otro};
3 : advance the input { y permanecer en el estado 3};
4 : avanza en la entrada;
estado := 3;
end case;
end case;
end while;
if estado = 5 then aceptar;
Preferiría usar esta organización donde específicos caracteres de entrada no me llevaran al
inmediato estado siguiente, o donde existiera un carácter de escape que me mueva de un estado
cualquiera al estado aceptable.
2. Benjamín Joaquín Martínez Compiladores 2021B
2.12 a) utilice la construcción de Thompson para convertir la expresión regular (a|b) * a (a|b|Ɛ)
en un NFA.
1
2
3
4
a
b
Ɛ
Ɛ
Ɛ
(a|b)*
5 6
7
8
9
a
a
b
Ɛ
a (a|b|Ɛ)
r
s
Ɛ
r
…
s
…
L(rs) = L(r) L(s)
Ɛ
1
2
3
4
a
b
Ɛ
Ɛ
Ɛ
5 6
7
8
9
a
a
b
Ɛ
3. Benjamín Joaquín Martínez Compiladores 2021B
b) Convierta el NFA del inciso a en un DFA utilizando la construcción de subconjuntos.
2.9
Dibuje un DFA que acepte las cuatro palabras reservadas case, char, const y continue del lenguaje
C
c
a
s e
h a r
o
n
s
s
t
t
i n u e
1,2,
4,5
1,2,4,5
,6,7,9
1,3,
4,5 1,3,4,
5,8
1,2,4,
5,6,9
1
a
b
b b
a
a
b
a
a
a
4. Benjamín Joaquín Martínez Compiladores 2021B
2.4
En la definición de las expresiones regulares describimos la precedencia de las operaciones pero
no su asociatividad. Por ejemplo, no especificamos si a|b|c significaba (a|b)|c o a|(b|c), y lo
mismo para la concatenación ¿A que debio esto?
Puede deberse a que esto equivaldría a la unión, es decir a|b|c y (a|b)|c tendría el mismo
diagrama de transición, y la concatenación al ser la unión de dos expresiones no existe un orden o
precedencias más que el que dicte quien lo haga, por lo que en la expresión regular no existe un
símbolo para esta más que unir las expresiones en una.