Pascal/Turbo Pascal - Tipos enumerado

   
Vista:

Tipos enumerado

Publicado por David Blanco (2 intervenciones) el 26/09/2009 14:19:54
Hola a tod@s.

Tengo un problema, y no se como solucionarlo. Estoy realizando un compilador para pascal, en pascal. El tema es que necesito tener un tipo numerado de la forma:

tokens = (ARRAY, AND, BEGIN...) con los tokens de pascal, bueno, un subconjunto de pascal, pero claro, esto no me lo permite hacer el pascal. No se como poder declarar un enumerado con esos tokens, para que me devuelva un número para cada uno de los tokens. He intentado con los literales, pero tampoco se como declarar un tipo enumerado con strings. Cualquier ayuda es muy bienvenida. Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Tipos enumerado

Publicado por Diego Romero (997 intervenciones) el 26/09/2009 16:14:10
Los tipos enumerados son tipos simples en sí mismos por lo que no puedes volver enumerados a otros tipos simples como char o integer.

Supongo, por lo que comentas, que quieres hacer tipo enumerado de las palabras reservadas de Pascal porque quieres verificar si algún token está dentro de un conjunto de tokens y los tipos enumerados son ideales para ese tipo de situaciones pero tienes el inconveniente que no puedes usar en Pascal como identificador dentro de un tipo enumerado una palabra que ya es palabra reservada en Pascal.

Yo te sugiero que hagas una lista constante de strings tal como un array de string y metas todas las palabras reservadas allí y escribas una función para saber si un candidato a token es un token dentro de esa lista.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tipos enumerado

Publicado por David Blanco (2 intervenciones) el 26/09/2009 17:29:25
Muchas gracias por tu respuesta Diego. El problema que pienso que se puede plantear es que no es muy rápido el acceso a un array de string. Estoy haciendo un analizador léxico, y claro, éste va leyendo el código fuente, y va reuniendo caracteres, hasta formar un token, si por cada token tengo que llamar a una función, que busque dentro del array a ver si ese token es correcto y devolver un número que corresponda con el token... sería bastante lento, debido a las muchísimas veces que llamaría a esa función... con lo fácil que sería en c++ y el profesor se empeña en hacerlo en pascal... no creo que esa forma sea muy eficiente, pero probaré a ver que pasa. Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tipos enumerado

Publicado por Diego Romero (997 intervenciones) el 27/09/2009 03:35:10
¿Y crees que con un tipo enumerado será más rápido?. Eso es relativo porque en el fondo cuando el compilador Pascal debe determinar si un identificador es un tipo enumerado hace exactamente eso, busca en un array (en realidad hace una sucesión de accesos indirectos a memoria pero no quiero entrar en terreno escabroso).

La función si la haces eficientemente se puede traducir a código efectivo tan rápido como el que el copilador genera cuando debe hacerlo con un tipo enumerado.

La desventaja de C++ desde tu punto de vista (el del programador) es que debes controlar que no se produzca un "buffer overflow", es decir, agregar más código que a la larga será lo mismo que hace Pascal con su restricción estática de tipos, con la ventaja de que en Pascal el chequeo se hace en tiempo de compilación mientras que en C++ lo tienes que hacer tú en tiempo de ejecución a riesgo de introducir un bug oculto.

La restricción de tipos en Pascal no es un capricho. Es una forma de hacer fácil escribir buen código y difícil escribir mal código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar