Informe Final Compiladores1
Informe Final Compiladores1
Informe Final Compiladores1
FECHA : 13 / Julio
TRUJILLO – PERÚ
2021
INDICE
Contenido
INDICE.............................................................................................................................................................1
INTRODUCCIÓN..............................................................................................................................................3
I. CONTENIDO.............................................................................................................................................4
A. Componentes léxicos (tokens) del lenguaje de programación..........................................................4
B. Descripción del lenguaje.....................................................................................................................6
C. Gramática de libre contexto del lenguaje..........................................................................................9
D. Comprobador de tipos......................................................................................................................13
II. CONCLUSIONES.....................................................................................................................................20
III. REFERENCIAS BIBLIOGRÁFICAS.........................................................................................................20
INTRODUCCIÓN
El análisis sintáctico toma los tokens que le envía el analizador léxico y comprueba si con ellos se
puede formar alguna sentencia válida del lenguaje. Recuérdese que se entiende por sintaxis
como el conjunto de reglas formales que especifican como se construyen las sentencias de un
determinado lenguaje. La sintaxis de los lenguajes de programación habitualmente se describe
mediante gramáticas libres de contexto (o gramáticas tipo 2) utilizando algún tipo de notación. Por
ejemplo, las notaciones BNF y EBNF. Esta especificación ofrece numerosas ventajas a los
diseñadores de lenguajes y a los escritores de compiladores:
• Una gramática bien diseñada da una estructura al lenguaje de programación que se utiliza en la
traducción del programa fuente en código objeto correcto y para la detección de errores. Existen
herramientas que a partir de la descripción de la gramática se puede generar el código del
analizador sintáctico.
Las gramáticas funcionan definiendo las transformaciones que puede realizar para
construir una cadena en el lenguaje descrito por una gramática. Las gramáticas dirán
cómo transformar un símbolo de inicio (generalmente S) en una cadena de símbolos. Una
gramática para el idioma dada anteriormente es:
S -> BBB
B -> 0
B -> 1
La forma de interpretar esto es decir que Spuede ser reemplazado por BBB, y Bpuede ser
reemplazado por 0, y Bpuede ser reemplazado por 1. Entonces, para construir la cadena
010 podemos hacerlo S -> BBB -> 0BB -> 01B -> 010.
Una gramática libre de contexto es simplemente una gramática donde lo que está
reemplazando (a la izquierda de la flecha) es un solo símbolo "no terminal". Un símbolo no
terminal es cualquier símbolo que usa en la gramática que no puede aparecer en sus
cadenas finales. En la gramática anterior, "S" y "B" son símbolos no terminales, y "0" y "1"
son símbolos "terminales". Gramáticas como
S -> AB
AB -> 1
A -> AA
B -> 0
IOSTREAM
char a;
boolean estado = false; int intentos = 0;
do
{
cout<<"Ingrese letra: "; cin<<a;
intentos++;
} while(a != h)
cout<<"¡Felicidades! te tomo<< intentos<<"!";
}
EJEMPLO 2:
IOSTREAN
EJEMPLO 3:
IOSTREAM
EJEMPLO 4:
IOSTREAM
switch(opcion)
EJEMPLO 5:
IOSTREAM
int c=1;
while(c<100)
}
C. Gramática de libre contexto del lenguaje
MiniCPP : Libreria EspacioDeNombre VOID MAIN'('VOID')''{'Cuerpo'}'
;
TipoVariable : INT
| FLOAT
| CHAR
| STRING
;
Sentencias : Asignacion
| Leer
| Escribir
| Hacer
| Mientras
| Para
| Condicional
| Seleccion
;
Leer : CIN'>''>'IDENT';'
;
MasContenido : '<''<'Contenido
| /*vacio*/
;
Hacer : DO'{'Sentencias'}'WHILE'('Condicion')'';'
;
Mientras : WHILE'('Condicion')''{'Sentencias'}'
;
Condicional : IF'('Condicion')''{'Sentencias'}'MasCondicional
;
Opcion : INT
| CHAR
| CADENA
;
Incrementos : INCREMENTO
| DECREMENTO
;
OpRelacional : '>'
| '<'
| MAYORIGUAL
| MENORIGUAL
| IGUALA
| NOIGUALA
;
Factor : INT
| FLOAT
| IDENT
| '('Expresion')'
;
%%
D. Comprobador de tipos
Condicional : IF'('Condicion')''{'Sentencias'}'MasCondicional
$$ $1 $2 $3 $4 $5 $6 $7 $8
| /*vacio*/
;
{IF($3.tipo == CTEBOOLEAN)
$$.tipo = $6.tipo
ELSE
$$.tipo = TERROR; }
| Termino
;
| Factor
;
OP_ESIGUAL:
stack[SP-1] = stack[SP-1] = stack[SP]
SP = SP - 1
IP = IP + 1
OP_NOESIGUAL:
stack[SP-1] = stack[SP-1] != stack[SP]
SP = SP - 1
IP = IP + 1
OP_MAYORIGUAL:
stack[SP-1] = stack[SP-1] >= stack[SP]
SP = SP - 1
IP = IP + 1
OP_MENORIGUAL:
stack[SP-1] = stack[SP-1] <= stack[SP]
SP = SP - 1
IP = IP + 1
OP_MAYOR:
stack[SP-1] = stack[SP-1] > stack[SP]
SP = SP - 1
IP = IP + 1
OP_MENOR:
stack[SP-1] = stack[SP-1] < stack[SP]
SP = SP - 1
IP = IP + 1
OP_SUMA:
stack[SP-1] = stack[SP-1] + stack[SP]
SP = SP - 1
IP = IP + 1
OP_RESTA:
stack[SP-1] = stack[SP-1] - stack[SP]
SP = SP - 1
IP = IP + 1
OP_MULTIPLICAR:
stack[SP-1] = stack[SP-1] * stack[SP]
SP = SP - 1
IP = IP + 1
OP_DIVIDIR:
stack[SP-1] = stack[SP-1] / stack[SP]
SP = SP - 1
IP = IP + 1
OP_MODULO:
stack[SP-1] = stack[SP-1] % stack[SP]
SP = SP - 1
IP = IP + 1
II. CONCLUSIONES
La gramática de libre contexto tuvo una influencia positiva por parte léxica y
sintáctica.
Se demostró por parte de la categoría “Calidad de la gramática” todas las
reglas que se han diseñado de manera correcta.
Se demostró por parte de la categoría “Amplitud de la gramática” todas las
características del lenguaje solicitado.
Se demostró por parte de la categoría “Calidad del comprobador de tipos”
todas las comprobaciones correctamente construidas.
Se demostró por parte de la categoría “Amplitud del comprobador de tipos”
todas las comprobaciones necesarias.
Sells, Peters (1985) LECTURES ON CONTEMPORARY SYNTACTIC THEORIES. Center for the Study of Language
and Information, Universidad de Stantord.