Sei sulla pagina 1di 4

Ejercicios Adicionales Tema 1 y 2 2 de octubre de 2012

Ejercicio 1:
Queremos generar listas enumeradas en HTML. Para ello, tenemos las siguientes palabras reservadas: la pareja
TKN_OL y TKN_END_OL que indican el inicio y final de una lista y la pareja TKN_LI y TKN_END_LI
que encierran un tem. Disear una gramtica LL(1) que genere dicho lenguaje. La gramtica debe cumplir
que: i) En el fichero de datos entrada debe haber al menos una lista; ii) Pueden existir listas dentro de listas; iii)
No pueden existir listas vacas, sin tems u otras listas; iv) Detrs o delante de una lista pueden ir un tem u otra
lista y v) A un tem le puede seguir otro tem o una lista.

Las expresiones regulares que definen los componentes lxicos de nuestro lenguaje son:

TKN_OL: <OL>
TKN_END_OL: </OL>
TKN_LI: <LI>
TKN_END_LI: </LI>
TKN_ID: [a-zA-Z]+
TKN_BLANCO: [\n\t ]

Un ejemplo de las sentencias a generar es:

<OL>
<LI> este es el primer tem </LI>
<OL>
<LI> un tem de otra lista </LI>
<LI> otro tem de otra lista </LI>
</OL>
<LI> ms tems </LI>
</OL>

Ejercicio 2:
Disear una gramtica que genere sentencias de llamadas a funciones con un nmero indeterminado de
argumentos. Asumid que: i) Puede existir anidamiento en llamadas a funciones, es decir, un argumento puede
ser lo que devuelva la llamada a una funcin; ii) Pueden existir funciones sin argumentos; iii) Slo tenemos la
operacin asignacin.

Ejemplo: a = Suma(Suma(a,b), c);

Ejercicio 3:
Disea una gramtica que permita generar sentencias if_else anidadas.

Ejercicio 4:
Disea una gramtica que permita generar declaraciones en C++ de clases dentro de clases.
Ejercicios Adicionales Tema 1 y 2 2 de octubre de 2012

SOLUCION EJERCICIO 2.2 - APUNTES

typedef enum {TKN_MENOR, TKN_MENORIG, TKN_IG, TKN_MAYOR, TKN_MAYORIG, TKN_DIST, TKN_ERROR }


TokenType;

typedef enum {INICIO, MENOR, IGUAL, MAYOR, ACEPTAR } StateType;

typedef struct {
TokenType tok;
strig lex;
} TokenRecord;

TokenRecord getToken(void) {
char c;
StateType estado = INICIO;
TokenRecord token;

while (estado != ACEPTAR)


{
c = getChar();
switch (estado)
{
case INICIO:
if ( (c ==' ') || (c == 't') || (c == '\n')) ; // no hacer nada
else if (c =='<')
estado = MENOR;
else if (c == '=')
estado = IGUAL;
else if (c == '>')
estado = MAYOR;
else
Ejercicios Adicionales Tema 1 y 2 2 de octubre de 2012

{
estado = ACEPTAR;
token.tok = TKN_ERROR;
}
break;
case MENOR:
if ( c == '>')
{
estado = ACEPTAR;
token.tok = TKN_DIST;
}
else if ( c == '=')
{
estado = ACEPTAR;
token.tok = TKN_MENORIG;
}
else
{
estado = ACEPTAR;
token.tok = TKN_MENOR;
unGetChar();
}
break;
case IGUAL:
if ( c == '=')
{
estado = ACEPTAR;
token.tok = TKN_IG;
}
else
{
estado = ACEPTAR;
token.tok = TKN_ERROR;
}
break;
case MAYOR:
if ( c == '=')
{
estado = ACEPTAR;
token.tok = TKN_MAYORIG;
}
else
{
estado = ACEPTAR;
token.tok = TKN_MAYOR;
unGetChar();
}
break;
} //end_switch
} // end_while
return token;
} // end_function
Ejercicios Adicionales Tema 1 y 2 2 de octubre de 2012

Potrebbero piacerti anche