Você está na página 1de 5

PRACTICA COMPILADORES

Enunciado
El objetivo de la prctica es realizar un interprete de un lenguaje especificado en
este enunciado, al que el alumno puede realizar las ampliaciones que considere
interesantes. El lenguaje tiene las siguientes caractersticas:
El lenguaje es no tipado. Por lo tanto en las declaraciones no es necesario
especificar el tipo de datos de las variables, funciones, parmetros, etc. La
verificacin de los tipos de datos se realizar en tiempo de ejecucin.
Se ha de poder definir
o variables locales y globales
o funciones globales
Los tipos de datos del lenguaje sern como mnimo: enteros, reales, strings y
vectores.
La gestin de memoria la realizar el propio lenguaje.
Las funciones se pueden llamar recursivamente.
Las instrucciones de control de flujo mnimas sern una instruccin
condicional y un bucle.
El lenguaje se estructura como una secuencia de expresiones y declaraciones
simples.
Las operaciones mnimas son:
o Operaciones aritmticas entre enteros y reales (suma, resta, cambio de
signo, multiplicacin, divisin).
o Comparaciones entre enteros y reales (igual, distinto, mayor, menor,
etc).
o Acceso a los elementos de vectores
o Asignacin
o If sin y con else
o While
o Instruccin compuesta
o Leer y escribir enteros, reales y strings.
o leer ficheros con programa
o Crear un vector.
Ejemplo de lenguaje:
var a;
a=10;
Fun f(x)=>
{
if (x==0) 1; else f(x-1)*x;
}
f(3);
Fun numeros(min,max)=>
{
while (min<=max) {
print(min);
min=min+1;
}
}
Fun Primos(n)=>
{
var x;
var i;
var flag;
x=1;
while (x<n) {
i=2;
flag=0;
while (i<x) {
if (x%i==0) { // % no es obligatorio implementarlo
flag=1;
i=x;
}
i=i+1;
}
if (flag=0) {
print("primo: ");
print(x);
print("\n");
}
x=x+1;
}
}
La gramtica del lenguaje de programacin de la prctica es:
<Programa>::={<DecFun> | <DecVar> | <Instruccin>}

<Comando>::=<DecFun> | <DecVar> | <Instruccin>

<DecFun>::=Fun Id '(' [Id {,Id}] ')' => <Instruccin>

<DecVar>::= Var Id ;

<Instruccin>::=
<Expresin>; |
<DecVar> |
'{' { <Instruccin> } '}' |
if '(' <Expresin> ')' <Instruccin> [else <Instruccin>] |
while '(' <Expresin> ')' <Instruccin> |
return <Expresin> ;

<Expresin>::=<TerBool> { '||' <TerBool> }

<TerBool>::= <FacBool> { '&&' <FacBool> }

<FacBool>::=<ExpArit> [ (>|<|>=|<=|==|!=) <ExpArit> ]

<ExpArit>::=<Termino> { (+|-) <Termino> }

<Termino>::= <Factor> { (*|/) <Factor> }

<Factor>::=
- <Factor> |
(' <Expresin> ')' |
Num |
String |
Id (
'(' [<Expresin> {, <Expresin>}] ')' |
{'['<Expresin>']'} [= <Expresin>] )




Entregas
Las entregas se realizarn en las siguientes fechas:
Primera entrega: 19 de Mayo. Scanner
Segunda entrega: 2 de Junio. Parser *
Tercera entrega: 11 de Junio" #$%&'()*+ ,
Cuarta entrega: antes de la fecha del examen Final. Generacion de Cdigo*

, -.(&. /0&*()*&. .$ 1&. )'2)*&0$ $' 1+. /034)%+. 25&."









PRACTICA COMPILADORES

Entrega 1: Scanner
Realizar la funcin Scanner que deja en una variable global el smbolo ledo del
stream de entrada. Para poder seguir la ejecucin del scanner se abrirn dos
ventanas en el entorno. La ventana de comandos es con la que trabajar el usuario y
una ventana de debug donde aparecern mensajes sobre lo que esta haciendo el
scanner. Por ejemplo:
Ventana de comandos:
if (a>10) a=10;
Ventana de Debug:
Smbolo if
Smbolo Abrir parntesis
Smbolo Identificador Nombre="a"
Smbolo mayor;
Smbolo Nmero Valor=10 Tipo=Int
Smbolo Cerrar parntesis
Smbolo Identificador Nombre="a"
Smbolo igual
Smbolo Nmero Valor=10 Tipo=Int
Smbolo puto y coma
Se har un bucle en el que el scanner lee un smbolo e imprime su categora
sintctica y atributos por la ventana de debug. En caso que el escanner encuentre un
error lexicogrfico ha de imprimir en la ventana de comandos la lnea completa
donde se ha encontrado el error y en la siguiente lnea "^Error lexicogrfico".
Ejemplo:
Ventana de comandos:
Error en linea 10 del fichero "error.prl"
Fun f(x)=> return x+10 # 7*4;
^Error lexicogrfico
El scanner ha de aceptar los siguientes smbolos:
Indentificador:
o Forma: (l|_)(l|d|_)*
! Es decir (letra | guionbajo)(letra | digito | guionbajo)*
o Atributo nombre: string con los caracteres que forman el identificador
String literal:
o Forma (v-( | \) | \n)* (no acepta saltos de lnea)
o Atributo contenido: caracteres que forman el string sin las comillas y
convirtiendo los caracteres \ y n en el carcter \n (salto de lnea).
Nmero:
o Forma: d+[.d+]
o Atributo valor: un double con el valor del nmero
o Atributo tipo: entero o real
Palabras clave (una categora sintctica para cada palabra clave): if,
else, while, var, fun return
Signos: ( ) , [ ] => < <= > >= == != = ; + - * / && ||
! { }
El prototipo de la funcin del scanner ser:
void Scanner();
IScan es el stream del que leer el scanner. El smbolo leido se guardar en las
variables ScanCat, ScanEntero, ScanReal, ScanEsEntero y ScanString.
Pruebas: El scanner ha de procesar correctamente las siguientes lneas de programa
Fun fin(x) => { ifa=10.4; if (a>b) _1="casa"; else a_2="hola\nadios\n"; }

128// comentario de una lnea

" string errneo
La entrega se realizar en la hora de clase:
Nombre de los integrantes del equipo.
Ficheros fuente del scanner.
Un fichero con el conjunto de pruebas del scanner. Estas pruebas son trozos
de programa donde se puede ver que el scanner lee todos los tipos de
smbolos correctamente y que es capaz de detectar errores lexicogrficos.
Las pruebas han de incluir las indicadas en el enunciado.

Você também pode gostar