Beruflich Dokumente
Kultur Dokumente
- Defina compilador:
Es un programa que toma un programa en lenguaje fuente y lo convierte a un lenguaje
equivalente en lenguaje objeto.
- ¿Cuáles son las dos partes de la compilación?
1.- Análisis: se divide un programa en componentes, se impone una estructura gramatical y se
almacena.
2.- Síntesis: se construye el programa destino deseado a partir de la representación intermedia y
de la información en la tabla de símbolos.
- Describa las 6 fases de un compilador
1. Análisis léxico: lee los caracteres de la entrada y los agrupa en “objetos token”.
2. Análisis sintáctico: utiliza los primeros componentes de los tokens producidos por el
analizador léxico para crear una representación intermedia en forma de árbol que describa la
estructura gramatical del flujo de tokens.
3. Análisis semántico: utiliza el árbol sintáctico y la información en la tabla de símbolos para
comprobar la consistencia semántica del programa fuente con la definición del lenguaje.
4. Generación de código intermedio: genera un nivel bajo explícito, o una representación
intermedia similar al código máquina, que podemos considerar como un programa para una
máquina abstracta.
5. Optimización de código: trata de mejorar el código intermedio,de manera que se produzca un
mejor código destino.
6. Generación de código: recibe como entrada una representación intermedia del programa
fuente y la asigna al lenguaje destino.
- ¿Cuáles son los 8 módulos de un compilador?
1. Flujo de caracteres
2. Flujo de tokens
3. Árbol sintáctico
4. Árbol sintáctico
5. Representación intermedia
6. Representación intermedia
7. Código máquina destino
8. Código máquina destino
- A partir de hoc4 se usan dos etapas en hoc. Cuales son y qué hacen?
1.- Generar codigo en postfijo
2.- Ejecuta codigo de un prefijo
- Para qué sirve el Análisis Léxico
a) Para generar el código en lenguaje b) Nos dice si una cadena pertenece ( C)
objeto al lenguaje generado por una
gramática
- Si Una gramática contiene una regla de producción de la forma A → Aa entonces es una
a) Gramática recursiva por la izquierda b) Gramática ambigua ( A )
c) Gramática libre de contexto d) ninguna de las anteriores
s->0 s 1
s->00 s11
s->000 s 111
s->000 01 111
- Dada la gramática
T={a, b, +, -, *, /, (,)}, N={E, T, F} S={E}
P={ E->T | E+T | E-T
T->F | T*F | T/F
F-> a | b | (E) }
y la cadena (a+b)/b
a) Obtenga una derivación de dicha cadena
E->T
E->F/T
E->(E)/T
E->(E+T)/T
E->(T+F)/F
E->(F+F)/F
E->(a+b)/b
Ambigüedad
Demostrar que la siguiente gramática es
ambigua
A →A x B | x
B → x B | x
se transforma en
A→b | bR
R → a R | ε
Ahora considere la siguiente gramática
S→ ( L ) | a
L→ L , S
|S
Elimine la recursividad por la izquierda de dicha gramática.
S→ ( L ) | a
L→ SM
M→ , S
M|E
Escriba el analizador sintáctico predictivo descendente recursivo
%%
S: a
| ‘(‘ L ‘)’
;
L: SM
;
M:
| ‘,’ SM
;
%%
Definiciones dirigidas por la sintaxis
sec →
comienza sec.x = 0
sec.y = 0
instr →
este instr.dx = 1
instr.dy = 0
instr →
norte instr.dx = 0
instr.dy = 1
instr →
oeste instr.dx = -1
instr.dy = 0
Esquemas de traducción
Escriba un esquema de traducción para convertir una expresión en:
Escriba un esquema de traducción para evaluar expresiones booleanas
Para cada esquema de traducción de arriba escriba la sección de reglas de la especificación de YACC
Escritura de Gramaticas
Escribir una gramática que genere todas las cadenas de longitud 4 formadas con los símbolos
del alfabeto {a,b,c}
S->aA|bA|cA
A->aB|bB|cB
B->aC|bC|cC
C->a|b|c
Escribir una gramática que sirva para generar las siguientes cadenas
Especie perro Especie gato Especie perro Especie gato
Edad 1 Edad 2 Edad 2 Edad 2
Sexo macho Sexo macho Sexo hembra Sexo macho
Tamaño grande Tamaño mediano Tamaño pequeño Tamaño grande
Colores negro , Colores negro , Colores canela , gris Colores blanco
blanco blanco , café Soy fuerte , alegre, Soy listo , obediente
Soy rápido , activo, Soy tranquilo , activo. Aficiones jugar,
alegre sociable Aficiones aullar haraganear
Aficiones correr, Aficiones dormir,
comer parrandear, comer
12.-Escribir una gramática que sirva para generar las siguientes cadenas
YACC
1.-Los %% se usan para indicar
a)inicio de la sección de declaraciones b)inicio de la sección de reglas ( b )
3.-Como le indica el analizador léxico (yylex) al analizador sintáctico (yyparse) que ya no hay
más tokens en la entrada
a) retornando cero b) retornando -1 ( a )
|D
L-> L, D
D-> 0 | 1
Escriba la sección de reglas de la especificación de yacc para dicha gramática
%%
L:D
|L‘,’ D
;
D:’0’
|’1’
;
%%
S→U|V
U → TaU | TaT
V → TbV | TbT
T → aTbT | bTaT | ε
%%
S:U
|V
;
U:T ‘a’ U
|T ‘a’ T
;
V:T ‘a’ V
|T ‘a’ T
;
T:
| ‘a’ T ‘b’ T
|’b’ T ‘a’ T
;
%%
Escriba las acciones gramaticales para que imprima el número de b's en la cadena de entrada
%{
/*escriba el tipo de los elementos en la pila de yacc */
Int numb;
#define YYSTYPE
%}
%%
S : ’(’ B ’)’ {$$=$2;}
;
B : ’(’ B ’)’ {$$=$2;}
| D { $$=$1; }
;
D:{}
| ’b’ D {$$.numb++; $$=$2; }
;
%%
Escriba la sección de reglas de la especificación de yacc para dicha gramática y las acciones
semánticas respectivas para que se imprima si un triangulo es equilátero y si un cuadrilátero es
un cuadrado
%%
Lista:lista ‘,’ Figura
|Figura
;
Figura: Triangulo
|Cuadrilátero
;
Triangulo:’lado’’lado’’lado’ {if($1==$2&&$2==$3)printf(“Equilatero”);}
;
Cuadrilátero:’lado’’lado’’lado’’lado’ {if($1==$2&&$2==$3&&$3==$4)printf(“Cuadrilatero”);}
;
%%
Análisis Sintáctico Predictivo no Recursivo
-Para las siguientes GLC construya la tabla Análisis Sintáctico Predictivo no Recursivo
-Use dicho análisis para analizar las cadenas propuestas:
-Muestre el contenido de la pila, la entrada y la acción a realizar
(((a)))
(a , a)
(a , a, a)
(a , a, a, a )