INTRODUCCION

 

MANUAL TECNICO

ANALIZATEC

 

 

Usted ha adquirido un analizador sintáctico, al cual le hemos asignado  el nombre de Analizatec.

Su analizador esta compuesto por un analizador léxico y un analizador sintáctico, dado que para analizar sintacticamente se necesita analizar léxicamente primero. Por lo tanto antes que  todo le daremos una breve síntesis de en que consiste un analizador léxico y un sintáctico.

 

Un analizador en general es el procesos que permite determinar si una cadena puede ser generada por una gramática. Es en nuestro caso el proceso que permite determinar si una formula esta bien generada o no. Este proceso es fundamental en el demostrador de teoremas ya que una cadena que no sea una formula no servirá para realizar los razonamientos o pruebas. Por tanto por esto es importante definir lo que es un analizador.

 

Ya definido lo que es un analizador ahora le definiremos de manera breve lo que es un analizador léxico y un analizador sintactico,ya que mas adelante lo trataremos con mayor amplitud.

 

Analizador Léxico:

Es un Autómata Finito que reconoce los componentes léxicos de una cadena de símbolos del alfabeto.

 

Analizador Sintáctico:

Es un autómata de Pila que reconoce la estructura de una cadena de componentes.

 

 

Estos son los conceptos básicos que se van a presentar en este trabajo espero que le sea de gran ayuda o simplemente léalo para tener un poco mas de conocimientos.

OBJETIVO

 

El objetivo de este analizador sintáctico el cual lleva como nombre ANALIZATEC es muy sencillo en general es el de comprender nosotros el funcionamiento de dicho analizador aquí exponemos algunos puntos:

 

·        Introducir el funcionamiento de un A. sintáctico

·        Introducir términos utilizados Introducir términos

·        Presentar la especificación en forma de gramáticas

·        Identificar los tipos de analizadores sintácticos

·        Comprobar el orden en que llegan los tokens

·        Construir una representación del programa fuente

·        Si es sintácticamente incorrecto generar error

·        Discernir la ventaja de las gramáticas independientes del contexto sobre otras formas de representación de la sintaxis.

·        Explotar la potencia de la recursividad para caracterizar estructuras de tamaño ilimitado.

·        Detectar situaciones de ambigüedad y proponer formas de superarla.

·        Modelar mediante gramáticas adecuadas las construcciones sintácticas de un lenguaje dado, incluidas las expresiones aritméticas y las instrucciones más habituales de los lenguajes de programación.

·        Distinguir entre los dos sentidos, descendente y ascendente, de análisis sintáctico y ser capaz de realizar un seguimiento mental del proceso de derivación en ambos casos.

·        Conocer la aplicación de los conocimientos adquiridos en Lenguajes, Gramáticas y Autómatas para manejar la sintaxis de lenguajes y programas.

 

Estos son algunos puntos que nosotros creemos que son los mas importantes los cuales esta tratando nuestro ANALIZATEC.

MARCO TEORICO

 

En esta parte de nuestro manual trataremos de dar una explicacion mas amplia de todos los conceptos que aquí se están tratando para su mayor compresion.

 

 

¿QUÉ ES UN ANALIZADOR?

 

 Como ya definimos en el bloque anterior analizador es el proceso que permite determina si una cadena puede ser generada por una gramática. En nuestro caso es el proceso que permite determinar si una formula esta bien generada o no. Este proceso es fundamental en el Demostrador de Teoremas ya que una cadena que no sea una formula no servirá para realizar los razonamientos o pruebas. Por tanto es importante definir precisamente un analizador para esta tarea.

 

Desde el punto de vista formal un analizador es un autómata equivalente a una gramática.

 

ANALIZADOR

 
      CADENA                                                                          ACEPTACION

 


                                                                                               RUTINA DE ERROR

 

 

QUÉ ES UN ANALIZADOR LÉXICO?

 

El análisis léxico es el proceso de convertir un flujo de caracteres de entrada en un flujo de palabras o elementos.

Los elementos son un grupo de caracteres con significancia.

El análisis léxico es la primera etapa de la indización automática, el proceso de peticiones.

 

Diseñar un analizador léxico para procesar peticiones es similar a hacerlo para la indización automática. Además el diseño para procesar peticiones dependerá del diseño que se haya empleado para la indización automática, dado que los términos de la petición debe coincidir con los términos del índice  han de reconocerse los mismos elementos en ambos analizadores.

 

Sin embargo, el analizador de peticiones deberá reconocer además los distintos operadores

(por ejemplo Boléanos) que pueden incluirse en las peticiones y los indicadores de agrupamiento (como parentesis y corchetes) que analisis lexico para procesos.

También habria que considerar que el analezador para peticiones debe tratar de formar diferente a como lo hace el analizador da la indización automatica respecto a ciertos caracteres (como los signos de puntuación).

Estos caracteres son tratados en la indización automatica como delimitadores, mientras que en las peticiones se han de considerar como un error pudiesen acompañar la expresión.

EL COSTE DE UN ANALIZADOR LÉXICO

El análisis léxico es costoso, porque requiere examinar cada carácter de entrada. En comparación con las etapas posteriores de indización automatica o de proceso de peticiones en las que no es necesario hacer este examen de carcter a carácter.

Aunque no se han realizado estudios exhaustivos del coste dela análisis léxico en los sistemas RI,este parece gastar como mucho el 50% del tiempo de creación del indice. Por ello es importante que los analizadores léxicos sean tan eficientes como sea posible.

 

CONSTRUCCIÓN DE UN ANALIZADOR LÉXICO

El análisis léxico para sistemas  RI es el mismo que para otros sistemas de proceso de texto. En particular es igual que el de los compiladores.

Existen tres formas de desarrollar un analizador léxico:

Usar un generador de analozadores léxicos para hacerlo automáticamente.

Escribir a mano un analizador léxico especifico.

Escribir a mano un anlizador léxico en forma de maquina de estados finitos.

La primera solucion es la mejor cuando el analizador léxico es compilado.

Si el analizador es sencillo normalmente es mas facil realizarlo a mano.

CONSTRUCCIÓN DE UN ANALIZADOR LÉXICO EN FORMA DE MAQUINA DE ESTADOS FINITOS

Los algoritmos de maquinas de estados finitos son extremadamente rapidos es muy probable que un algoritmo especifico sea menos eficiente.

Lo primero sera dibujar el diagrama de transiciones que:

Reconocera como elemento a cualquier cadena no-vacia de letras o digitos que no comience por un digito.

Todas las letras se convertiran a minúsculas y todos los signos de puntuación,espacio y caracteres de control seran tratados como delimitadores de elementos.

 

CONSTRUCCION DE UN ANALIZADOR LÉXICO DE MAQUINA DE ESTADOS FINITOS

Los caracteres se dividen en las siguientes clases:

Carctres de espacio

Letras

Digitos

Paréntesis izquierdo

Paréntesis derecho

Ampersand (&)

Barra

Símbolo de control

Carácter de final de cadena (fc)

Todos los demas caracteres.

 

El primer paso es contruir un mecanismo para clasificar los caracteres.

La forma mas facil de hacerlo esw precargar un vector que indique la clase de cada carácter.

Por ejemplo si ese vector se denomina char_class la clase del vector ´c´sera simplemente char_class (c).

Las clases de caracteres en si mismas constituyen un tipo enumerado.

Tambien se necesita un tipo enumerado para lo elementos que ayudara a simplicar el proceso haciendolo coincidir con los estados finales dela maquina de estados finitos.

 

El codigo para la maquina de estados finitos debe tener conocimiento del cual es el estado actual y tener una forma de cambiar de estado al recibir una entrada.

La información sobre las transiciones puede ser codificada en tablas o en el flujo de control.

 

 

¿QUÉ ES UN ANALIZADOR SINTACTICO?

 

Analizar Sintacticamente una tira o cadena de tokens no es mas que encontrar para ella el árbol sintáctico o de derivación que tiene como raíz el axioma de la gramática, y como nodos terminales la sucesión ordenada de símbolos que componen la cadena analizada. En caso de no existir este árbol sintáctico, la cadena no pertenecerá al lenguaje, y el analizador sintáctico ha de emitir el correspondiente mensaje de error.

 

 

Es la fase del analizador que se encarga de chequear el texto de entrada en base a una

gramática dada. Y en caso de que el programa de entrada sea válido, suministra el árbol

sintáctico que lo reconoce.

En teoría, se supone que la salida del analizador sintáctico es alguna representación del

árbol sintáctico que reconoce la secuencia de tokens suministrada por el analizador léxico.

En la práctica, el analizador sintáctico también hace:

• Acceder a la tabla de símbolos (para hacer parte del trabajo del analizador

semántico).

• Chequeo de tipos ( del analizador semántico).

• Generar código intermedio.

• Generar errores cuando se producen.

En definitiva, realiza casi todas las operaciones de la compilación. Este método de trabajo

da lugar a los métodos de compilación dirigidos por sintaxis.

 

 

 

 

Manejo de errores sintácticos

Si un compilador tuviera que procesar sólo programas correctos, su diseño e implantación

se simplificarían mucho. Pero los programadores a menudo escriben programas

incorrectos, y un buen compilador debería ayudar al programador a identificar y localizar

errores. Es más, considerar desde el principio el manejo de errores puede simplificar la

estructura de un compilador y mejorar su respuesta a los errores.

Los errores en la programación pueden ser de los siguientes tipos:

• Léxicos, producidos al escribir mal un identificador, una palabra clave o un

operador.

• Sintácticos, por una expresión aritmética o paréntesis no equilibrados.

• Semánticos, como un operador aplicado a un operando incompatible.

• Lógicos, puede ser una llamada infinitamente recursiva.

El manejo de errores de sintaxis es el más complicado desde el punto de vista de la

creación de compiladores. Nos interesa que cuando el compilador encuentre un error, se

recupere y siga buscando errores. Por lo tanto el manejador de errores de un analizador

sintáctico debe tener como objetivos:

• Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su

localización.

• Recuperarse del error, para poder seguir examinando la entrada.

• No ralentizar significativamente la compilación.

Un buen compilador debe hacerse siempre teniendo también en mente los errores que se

pueden producir; con ello se consigue:

• Simplificar la estructura del compilador.

• Mejorar la respuesta ante los errores.

Tenemos varias estrategias para corregir errores, una vez detectados:

Ignorar el problema (Panic mode ): Consiste en ignorar el resto de la entrada

hasta llegar a una condición de seguridad. Una condición tal se produce cuando

nos encontramos un token especial (por ejemplo un ‘;’ o un ‘END’).A partir de

este punto se sigue analizando normalmente.

Ejemplo:

aux = a[i]

a[i] = a[j];

a[j] = aux;

Error

id ‘=’ id ‘[‘ id ‘]’ id ’[‘ id ‘]’ ’=’ id ’[‘ id ‘]’ ‘;’ id ’[‘ id ‘]’ ‘=’ id ‘;’

Token especial, seguimos

compilando a partir de él

Recuperación a nivel de frase: Intenta recuperar el error una vez descubierto. En

el caso anterior, por ejemplo, podría haber sido lo suficientemente inteligente

como para insertar el token ‘;’ . Hay que tener cuidado con este método, pues

puede dar lugar a recuperaciones infinitas.

Reglas de producción adicionales para el control de errores: La gramática se

puede aumentar con las reglas que reconocen los errores más comunes. En el caso

anterior, se podría haber puesto algo como:

sent_errónea Ú sent_sin_acabar sentencia_acabada ’;’

sentencia_acabada Ú sentencia ‘;’

sent_sin_acabar Ú sentencia

Lo cual nos da mayor control en ciertas circunstancias

Corrección Global : Dada una secuencia completa de tokens a ser reconocida, si

hay algún error por el que no se puede reconocer, consiste en encontrar la

secuencia completa más parecida que sí se pueda reconocer. Es decir, el

analizador sintáctico le pide toda la secuencia de tokens al léxico, y lo que hace

es devolver lo más parecido a la cadena de entrada pero sin errores, así como el

árbol que lo reconoce.

 

Tipo de gramática que acepta un analizador sintáctico

Nosotros nos centraremos en el análisis sintáctico para lenguajes basados en gramáticas

formales, ya que de otra forma se hace muy difícil la comprensión del compilador, y se

pueden corregir, quizás más fácilmente, errores de muy difícil localización, como es la

ambigüedad en el reconocimiento de ciertas sentencias.

La gramática que acepta el analizador sintáctico es una gramática de contexto libre:

Gramática : G (N, T, P, S)

N = No terminales.

T = Terminales.

P = Reglas de Producción.

S = Axioma Inicial.

Ejemplo : Se considera la gramática que reconoce las operaciones aritméticas.

Å E Ú E + T

Æ | T

Ç T Ú T * F

È | F

É F Ú ID

Ê | NUM

Ë | ( E )

En el que: N = {E, T, F} están a la izquierda de la regla.

T = {ID, NUM, ( ,) ,+ ,*}

P = Son las siete reglas de producción.

S = Axioma inicial. Podría ser cualquiera, en este caso es E.

Derivaciones : La idea central es que se considera una producción como una regla de

reescritura, donde el no terminal de la izquierda es sustituido por la cadena del lado

derecho de la producción.

De un modo más formal:

. _ _ con ., _ _ (N F T)* , si

con A _ N; 1, 2, / _ (N F T)*; y

D V G

E VWG

A

{

{

½

¾

¿

} regla de producción A _ 2

Es la fase del analizador que se encarga de chequear el texto de entrada en base a una

gramática dada. Y en caso de que el programa de entrada sea válido, suministra el árbol

sintáctico que lo reconoce.

En teoría, se supone que la salida del analizador sintáctico es alguna representación del

árbol sintáctico que reconoce la secuencia de tokens suministrada por el analizador léxico.

En la práctica, el analizador sintáctico también hace:

• Acceder a la tabla de símbolos (para hacer parte del trabajo del analizador

semántico).

• Chequeo de tipos ( del analizador semántico).

• Generar código intermedio.

• Generar errores cuando se producen.

En definitiva, realiza casi todas las operaciones de la compilación. Este método de trabajo

da lugar a los métodos de compilación dirigidos por sintaxis.

 

Árbol sintáctico de una sentencia de un lenguaje

Es una representación que se utiliza para describir el proceso de derivación de dicha

sentencia.

Como nodos internos del árbol, se sitúan los elementos no terminales de las reglas de

producción que vayamos aplicando, y tantos hijos como símbolos existan en la parte

derecha de dichas reglas.

Veamos un ejemplo: Sea la gramática anterior.

E Ú E + T | T

T Ú T * F | F

F Ú ( E ) | a | b

Supongamos que hay que reconocer: ( a + b ) * a + b

Si el árbol puede construirse, es que la sentencia es correcta:

E

E + T

F

b T

T

a

F *

(

F

) E

+ E

T

T

F

a

b

F

 Ambigüedad: Una gramática es ambigua si derivando de forma diferente con el mismo

tipo de derivación se llega al mismo resultado.

Ejemplo: Considérese la gramática

E _ E + E

E _ E * E

E _ ( E )

E _ id | num

si tenemos aux + cont + i

<ID><+><ID><+><ID>

Tipos de análisis sintácticos

Forma Sentencial

Es cualquier secuencia de terminales y no terminales obtenida mediante derivaciones a

partir del axioma inicial.

 Tipos de Análisis

De la forma de construir el árbol sintáctico se desprenden dos tipos o clases de

analizadores sintácticos. Pueden ser descendentes o ascendente

• Descendentes : Parten del axioma inicial, y van efectuando derivaciones a izquierda hasta

obtener la secuencia de derivaciones que reconoce a la sentencia.

Pueden ser:

_ Con retroceso.

_ Con recursión.

_ LL(1)

• Ascendentes: Parten de la sentencia de entrada, y van aplicando reglas de producción

hacia atrás (desde el consecuente hasta el antecedente), hasta llegar al axioma inicial.

Pueden ser:

_ Con retroceso.

_ LR(1)

 

Análisis descendente con retroceso.

Objetivo : El método parte del axioma inicial y aplica todas las posibles reglas al

no terminal más a la izquierda.

Ejemplo: Utilizaremos la siguiente gramática (No recursiva por la izquierda)

± E Ú T + E

² E Ú T

³ T Ú F * T

´ T Ú F

µ F Ú a

F Ú b

· F Ú (E)

para reconocer la cadena de entrada: (a + b) * a + b

 

Análisis Descendentes

Mediante este árbol se pueden derivar todas las posibles sentencias reconocibles por esta

gramática y el objetivo de este algoritmo es hacer una búsqueda en este árbol de la rama

que culmine en la sentencia a reconocer. El mecanismo funciona mediante una búsqueda

primero en profundidad.

Mira si todos los tokens a la izquierda de un No Terminal coincide con la cabeza de la

secuencia a reconocer.

En todo el árbol de derivaciones, se pretende profundizar por cada rama hasta llegar a

encontrar una forma sentencial que no puede coincidir con lo que se busca, en cuyo caso

se desecha, o que coincide con lo buscado, momento en que se acepta la sentencia. Si por

ninguna rama se puede reconocer, se rechaza la sentencia.

Algoritmo :

Sea k _ N el no terminal más a la izquierda de la forma sentencial.

Sea 2 _ T* la secuencia de tokens en la izquierda de k.

Ensayar (forma_sentencial, entrada)

for {pi _P  pi _ k Ú .}

forma_sentencial’ = Aplicar(pi, k, forma_sentencial)

if 2’ = Parte_izquierda (entrada)

if forma_sentencial == entrada

¡ Sentencia reconocida !

else

Ensayar (forma_sentencial’, entrada)

endif

endif

endfor;

En el programa principal

Ensayar (S, cadena a reconocer)

if not ¡ Sentencia reconocida !

¡¡ Sentencia no reconocida !!

endif;

Problemas : Este método no funciona con gramáticas recursivas a la izquierda, ya

que puede ocurrir que entre en un bucle infinito.

No existen muchos analizadores sintácticos con retroceso. En parte, porque casi

nunca se necesita el retroceso para analizar sintácticamente las construcciones de

los lenguajes de programación. En casos como el análisis sintáctico del lenguaje

natural, el retroceso tampoco es muy eficiente, y se prefieren otros métodos.

 

 

 

 

Análisis descendente con recursión. Diagramas de Conway.

Una gramática de contexto libre puede expresar un lenguaje al igual que puede hacerlo

la notación BNF, y los diagramas de Conway.

Definición: Un diagrama de Conway es un grafo dirigido donde los elementos no

terminales aparecen como rectángulos, y los terminales como círculos.

Para demostrar que permite representar las mismas gramáticas que la BNF, se hace por

inducción sobre las operaciones básicas de BNF:

Operación BNF Diagrama de Comway

Yuxtaposición AB

Opción A|B

J | B

Repetición 1 o más veces

{B}

0 o más veces

[B]

De esta forma todos los posibles caminos desde el inicio del grafo hasta el final,

representan formas sentenciales válidas.

En todo diagrama de Conway hay un origen y un destino.

Análisis Descendentes

Vamos a intentar establecer una comparación entre el flujo de un programa y el camino

que puedo establecer en los diagramas de Conway

Ejemplo: Yuxtaposición

AxiomaInicial( )

A( );

B( );

Fin AxiomaInicial

Es importante el ejercicio de programación consistente en seguir la evolución detallada

de las llamadas de los procedimientos entre sí.

prog: sent ;

Prog ( );

sent ( );

if el siguiente token es ‘;’ entonces

consumir el token

else

!Error sintáctico¡

fi

FinProg

prog: sent ; FIN

Prog ( );

sent ( );

if el siguiente token es ‘;’ entonces

Consumir el token

else

!Error sintáctico¡

fi

if el siguiente token es FIN entonces

Consumir el token

else

!Error sintáctico¡

fi

FinProg

Flujo

Análisis Descendentes

Secuencia

main ( ) {

get_token ( );

do {

expresión ( );

while (token != PUNTOYCOMA) {

!Error en expresión¡

get_token ( );

};

get_token( );

}while (token != EOF);

};

En este caso se considera al ‘;’ como un token de seguridad, lo que permite hacer una

recuperación de errores mediante el método panic mode.

Se supone que el sintáctico pide al lexicográfico tokens a través de get_token ( );, y que

el lexicográfico deja el token actual en la variable global token.

Antes de entrar a una función, en token debemos tener el token de lookahead, que esa

función necesita consultar.

expresión ( ){

expr_simple ( );

if ((token == IGUAL)|| (token == ME)|| (token == MEI)||

(token == DIST)|| (token == MAI)|| (token == MA))

get_token ( ) ;

expr_simple ( ) ;

}

}

 

Análisis Descendentes

expr_simple ( ) {

if ((token == IGUAL) || (token == MENOS)) {

get_token( );

}

término ( );

while ((token == MAS) || (token == MENOS) || (token == OR)) {

get_token( );

término ( );

}

}

 

 

Análisis descendente de gramáticas LL(1)

Una gramática LL(1) es aquella en la que su tabla de chequeo de sintaxis no posee

entradas múltiples, o sea, es suficiente con examinar sólo un símbolo a la entrada, para

saber qué regla aplicar. Toda gramática reconocible mediante el método de los diagramas

de Conway es LL(1)

El método consiste en seguir un algoritmo partiendo de:

- La cadena a reconocer, junto con un apuntador, que nos indica cual es el token actual.

- Una pila de símbolos ( terminales y no terminales)

- Una tabla asociada de forma unívoca a una gramática. En esta asignatura no vamos a ver

como calcular dicha tabla.

La cadena de entrada acabará en el símbolo $, que consideramos como si fuese un EOF(

End Of File - Fin de Fichero).

Sea X el elemento encima de la pila, y a, el apuntado en la entrada. El algoritmo consiste

en:

1.- Si X = a = $ entonces ACEPTAR.

2.- Si X = a g $ entonces

- se quita X de la pila

- y se avanza el apuntador.

3.- Si X _ T y X g a entonces RECHAZAR.

4.- Si X _ N entonces consultamos la entrada M[X,a] de la tabla:

- M[X,a] es vacia : RECHAZAR.

- M [X,a] no es vacia, se quita a X de la pila y se inserta el consecuente en

orden inverso.

Ejemplo: Si M[X,a] = {X _ UVY}, se quita a X de la pila, y se meten UVY en

orden inverso :

5.- Ir al paso 1.

Una vez aplicada una regla, no será desaplicada por ningún tipo de retroceso.

El algoritmo comienza con $ y con el axioma inicial metidos en la pila.

 

 

 

Manejo de errores sintácticos

Si un compilador tuviera que procesar sólo programas correctos, su diseño e implantación

se simplificarían mucho. Pero los programadores a menudo escriben programas

incorrectos, y un buen compilador debería ayudar al programador a identificar y localizar

errores. Es más, considerar desde el principio el manejo de errores puede simplificar la

estructura de un compilador y mejorar su respuesta a los errores.

Los errores en la programación pueden ser de los siguientes tipos:

• Léxicos, producidos al escribir mal un identificador, una palabra clave o un

operador.

• Sintácticos, por una expresión aritmética o paréntesis no equilibrados.

• Semánticos, como un operador aplicado a un operando incompatible.

• Lógicos, puede ser una llamada infinitamente recursiva.

El manejo de errores de sintaxis es el más complicado desde el punto de vista de la

creación de compiladores. Nos interesa que cuando el compilador encuentre un error, se

recupere y siga buscando errores. Por lo tanto el manejador de errores de un analizador

sintáctico debe tener como objetivos:

• Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su

localización.

• Recuperarse del error, para poder seguir examinando la entrada.

• No ralentizar significativamente la compilación.

Un buen compilador debe hacerse siempre teniendo también en mente los errores que se

pueden producir; con ello se consigue:

• Simplificar la estructura del compilador.

• Mejorar la respuesta ante los errores.

Tenemos varias estrategias para corregir errores, una vez detectados:

Ignorar el problema (Panic mode ): Consiste en ignorar el resto de la entrada

hasta llegar a una condición de seguridad. Una condición tal se produce cuando

nos encontramos un token especial (por ejemplo un ‘;’ o un ‘END’).A partir de

este punto se sigue analizando normalmente.

Análisis Sintáctico.

Ejemplo:

aux = a[i]

a[i] = a[j];

a[j] = aux;

Error

id ‘=’ id ‘[‘ id ‘]’ id ’[‘ id ‘]’ ’=’ id ’[‘ id ‘]’ ‘;’ id ’[‘ id ‘]’ ‘=’ id ‘;’

Token especial, seguimos

compilando a partir de él

Recuperación a nivel de frase: Intenta recuperar el error una vez descubierto. En

el caso anterior, por ejemplo, podría haber sido lo suficientemente inteligente

como para insertar el token ‘;’ . Hay que tener cuidado con este método, pues

puede dar lugar a recuperaciones infinitas.

Reglas de producción adicionales para el control de errores: La gramática se

puede aumentar con las reglas que reconocen los errores más comunes. En el caso

anterior, se podría haber puesto algo como:

sent_errónea Ú sent_sin_acabar sentencia_acabada ’;’

sentencia_acabada Ú sentencia ‘;’

sent_sin_acabar Ú sentencia

Lo cual nos da mayor control en ciertas circunstancias

Corrección Global : Dada una secuencia completa de tokens a ser reconocida, si

hay algún error por el que no se puede reconocer, consiste en encontrar la

secuencia completa más parecida que sí se pueda reconocer. Es decir, el

analizador sintáctico le pide toda la secuencia de tokens al léxico, y lo que hace

es devolver lo más parecido a la cadena de entrada pero sin errores, así como el

árbol que lo reconoce.

Analizadores LR

Vamos a analizar una técnica eficiente de análisis sintáctico ascendente que se puede

utilizar para analizar una amplia clase de gramáticas de contexto libre. La técnica se denomina

análisis sintáctico LR(k); la “L” es por el examen de la entrada de izquierda a derecha (en inglés,

left-to-right), la “R” por construir una derivación por la derecha (en inglés, rightmost derivation)

en orden inverso, y la k por el número de símbolos de entrada de examen por anticipado utilizados

para tomar las decisiones del análisis sintáctico. Cuando se omite, se asume que k, es 1. El análisis

LR es atractivo por varias razones.

• Pueden reconocer la inmensa mayoría de los lenguajes de programación que puedan ser

generados mediante gramáticas de contexto-libre.

• El método de funcionamiento de estos analizadores posee la ventaja de localizar un error

sintáctico en el mismo instante que se produce con lo que se adquiere una gran eficiencia

de tiempo de compilación frente a procedimientos menos adecuados como puedan ser los

de retroceso.

El principal inconveniente del método es que supone demasiado trabajo construir un

analizador sintáctico LR a mano para una gramática de un lenguaje de programación típico. Se necesita una herramienta especializada - un generador de analizadores sintácticos LR - . Por  fortuna, existen disponibles varios de estos generadores. Más adelante estudiaremos el diseño y uso de uno, el programa YACC. Con este generador se puede escribir una gramática de contexto libre y el generador produce automáticamente un analizador sintáctico de dicha gramática.

 

Si la gramática contiene ambigüedades u otras construcciones difíciles de analizar en un examen de izquierda a derecha de la entrada, el generador puede localizar dichas construcciones e informar al diseñador del compilador de su presencia.

Existen tres técnicas para construir una tabla de análisis sintáctico LR para una gramática.

El primer método, llamado LR sencillo (SLR, en inglés) es el más fácil de implantar, pero el menos poderoso de los tres. Puede que no consiga producir una tabla de análisis sintáctico para algunas gramáticas que otros métodos si consiguen. El segundo método, llamado LR canónico,es el más poderoso y costoso. El tercer método, llamado LR con examen por anticipado (LALR, en inglés), está entre los otros dos en cuanto a poder y costo. El método LALR funciona con las gramáticas de la mayoría de los lenguajes de programación y, con un poco de esfuerzo, se puede implantar en forma eficiente.

Funcionalmente hablando, un analizador LR consta de dos partes diferenciadas, un

programa de proceso y una tabla del análisis.

El programa de proceso posee como veremos seguidamente un funcionamiento muy

simple y permanece invariable de analizador a analizador. Según sea la gramática a procesar deberá variarse el contenido de la tabla de análisis que es la que identifica plenamente al analizador.

La figura muestra un esquema sinóptico de la estructura general de una analizador LR.

Como puede apreciarse en la figura, el analizador consta de una tira de entrada donde se

encuentra la cadena a reconocer finalizada con el símbolo $ que representa el delimitador. Esta tira lee de izquierda a derecha un símbolo cada vez en el proceso de reconocimiento.

El contenido de la pila tiene la forma s0 X1 s1 X2 s2 ... Xm sm

donde el símbolo sm se encuentra en la cabeza tal y como se muestra en la figura. Cada uno de los Xi son símbolos de la gramática y a los si vamos a denominarlos estados del analizador.

Los estados se utilizan para representar toda la información contenida en la pila y situada

antes del propio estado. Es mediante el estado en cabeza de la pila por el que se decide qué

reducción ha de efectuarse o bien qué desplazamiento.

Tradicionalmente, una tabla de análisis para un reconocedor LR consta de dos partes

claramente diferenciadas entre sí que representan dos funciones, la función GOTO y la función

ACCION. Seguidamente estudiaremos los cometidos de ambas acciones.

El funcionamiento del analizador LR es el siguiente

1.- Se determina el estado sm en cabeza de la pila y el símbolo actual ai en el instante de

la cadena de entrada.

2.- Se consulta en la tabla de análisis la función acción con los parámetros anteriores y que

puede dar como resultado.

 

 

 

 

 

            ALCANCES Y LIMITACIONES

 

Los alcances de los analizadores ha ido progresando y desarrollándose cada vez mas ha ido evolucionando con el desarrollo de la tecnología y pueden tambien adaptarse al lenguaje de programación al cual sean implementados.

Una limitación importante es el coste de estos, por que requiere examinar cada carácter de entrada. En comparación con las etapas posteriores de indización automatica o de proceso de peticiones en las qu eno es necesario hacer este examen carácter a carácter. Aunque no se ha realizado estudios exhaustivos del coste del análisis léxico en los sistemas RI este parece gastar como mucho el 50% del tiempo de creación del indice por ello es importante que los analizadores léxicos sean tan eficientes como sea posible.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Codificacion

 

 

 

'*********************AQUI EMPIEZA EL ANALIZADOR LEXICO**********************

'Option Explicit

 

  'declaracion de variables

 

Dim fil As Integer

Dim fila_ide As Integer 'LÉXICO

Dim fila_num As Integer 'LÉXICO

Dim fila_coal As Integer 'LÉXICO

Dim fila_error As Integer 'LÉXICO

Dim bandera_gral As Boolean 'LÉXICO

'creacion de la funcion falla

Public Function falla(inic As Integer) As Integer

 Select Case inic

  Case 0: inic = 9

  Case 9: inic = 12

  Case 12: inic = 15

  Case 15: inic = 18

  Case 18: inic = 21

  Case 21: inic = 26

  Case 26: inic = 29

 End Select

 falla = inic

End Function

'CREACION DELAS FUNCINES PARA EVALUAR LOS DIGITOS DEL TEXT

'ES DECIR CREAACION DE LOS AUTOMATAS PARA LA VALIDACION DE CADENAS

Public Function iscaracter(caracter As String) As Boolean

 If (InStr("abcdefghijklmnopqrstuvwxyz", caracter) Or InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", caracter)) Then

  iscaracter = True

 Else: iscaracter = False

 End If

End Function

Public Function isnumero(caracter As String) As Boolean

 If (InStr("0123456789", caracter)) Then

  isnumero = True

 Else: isnumero = False

 End If

End Function

 

Public Function isvalido(caracter As String) As Boolean

Dim caract As String * 1

Dim car As Integer

 

caract = vbCrLf

car = Asc(caract)

 If (isnumero(caracter) Or InStr(".<>=,;:""(){}+-*^/! ", caracter) Or car = 9 Or iscaracter(caracter)) Then

  isvalido = True

 ElseIf (caracter = caract) Then

  isvalido = True

 Else: isvalido = False

 End If

End Function

Public Sub limpia_cajaerrores()

Tabla_errores.Rows = 1

End Sub

 

Public Function Pala_Reser(cadena As String) As Integer

 Dim cambio As String

 Dim pal_reser(16) As String

 Dim pal_reser_E(16) As String

 Dim i As Integer

 Dim j As Integer

 'PALABRAS RESERVADAS DEL ANALIZADOR

 cambio = UCase(cadena)

 

  pal_reser(0) = "IF"

  pal_reser(1) = "ELSE"

  pal_reser(2) = "ENTERO"

  pal_reser(3) = "REAL"

  pal_reser(4) = "CADENA"

  pal_reser(5) = "CARACTER"

  pal_reser(6) = "RETURN"

  pal_reser(7) = "LOGICO"

  pal_reser(8) = "DO"

  pal_reser(9) = "WHILE"

  pal_reser(10) = "VOID"

  pal_reser(11) = "WRITE"

  pal_reser(12) = "PRINT"

  pal_reser(13) = "READ"

  pal_reser(14) = "INCLUIR"

  pal_reser(15) = "INICIO"

  pal_reser(16) = "FIN"

 

  pal_reser_E(0) = "if"

  pal_reser_E(1) = "else"

  pal_reser_E(2) = "int"

  pal_reser_E(3) = "float"

  pal_reser_E(4) = "char"

  pal_reser_E(5) = "char"

  pal_reser_E(6) = "return"

  pal_reser_E(7) = "boolean"

  pal_reser_E(8) = "do"

  pal_reser_E(9) = "while"

  pal_reser_E(10) = "void"

  pal_reser_E(11) = "printf("   ' write "mensaje";'concatenar ")"

  pal_reser_E(12) = "printf("   ' print (a); 'concatenar tipo de dato, ",var

  pal_reser_E(13) = "scanf("      'read(a); concatenar tipo dato, &var

  pal_reser_E(14) = "#include"

  pal_reser_E(15) = "main(){"

  pal_reser_E(16) = "getch();return 0;}"

 

 

 

  Pala_Reser = -1

  j = 0

  For i = 0 To 16

    If (j = 10) Then

      j = 0

    End If

     If (cambio = pal_reser(i)) Then

       Pala_Reser = j + 1

       cadena = cambio 'para que toda las pal. reser. sean mayusc.

       Exit Function

     End If

   j = j + 1

  Next i

 

End Function

 

Public Function Car_esp(cadena As String) As Integer

 Dim Cara_esp(6) As String

 'CARACTERES ESPECIALES

 Dim i As Integer

  Cara_esp(0) = ";"

  Cara_esp(1) = ":"

  Cara_esp(2) = ","

  Cara_esp(3) = """"

  Cara_esp(4) = "{"

  Cara_esp(5) = "}"

  Cara_esp(6) = "."

 

  For i = 0 To 6

   If (Cara_esp(i) = cadena) Then

     Car_esp = i + 1

     Exit Function

   End If

  Next i

End Function

 

Public Function Oper_rel(cadena As String) As Integer

 Dim Opera_rel(5) As String

 Dim i As Integer

  Opera_rel(0) = ">"

  Opera_rel(1) = "<"

  Opera_rel(2) = "=="

  Opera_rel(3) = ">="

  Opera_rel(4) = "<="

  Opera_rel(5) = "<>"

 

  For i = 0 To 5

   If (cadena = Opera_rel(i)) Then

     Oper_rel = i + 1

     'Exit Sub

   End If

  Next i

 

End Function

 

Public Function Oper_arit(cadena As String) As Integer

 Dim Opera_arit(3) As String

 Dim i As Integer

  Opera_arit(0) = "+"

  Opera_arit(1) = "-"

  Opera_arit(2) = "*"

  Opera_arit(3) = "/"

 

  For i = 0 To 3

   If (cadena = Opera_arit(i)) Then

     Oper_arit = i + 1

     'Exit Sub

   End If

  Next i

End Function

 

 

Public Sub inser_token(fila As Integer, linea As Integer, token As String, toke_linea As Integer, ba As Integer, esta As Integer)

'CREACION DEL PARSER DEL ANALIZADOR

Dim i As Integer

Dim posic As Integer

Dim tokenval As String

Dim token_equi As String

Tabla_sim.Enabled = True

 

toke_linea = toke_linea + 1

Load Form4 'No lo reempla

  Select Case (esta)

   Case -1, 2, 3, 4, 5, 7, 8:

                posic = Oper_rel(token)

                tokenval = "OPR"

                If (token = "=") Then tokenval = "OPASIG"

   Case 11:

            posic = Pala_Reser(token)

             tokenval = "PR"

            If (posic = -1) Then

                posic = Form5.tabla_id(token, fila_ide, Form4.MSFlexGrid1.TextMatrix(fila - 1, 5)) 'cambio '2

                tokenval = "ID"

           

            End If

   Case 14:

            posic = Form7.tabla_num(token, fila_num) '3

            tokenval = "CTENUM"

   Case 15:

            posic = Car_esp(token)

            tokenval = "CE"

   Case 16:

            posic = Form6.tabla_coalf(token, fila_coal) '4

            tokenval = "CTEALF"

   Case 17:

            posic = Car_esp(token)

            tokenval = "CE"

   Case 22, 23, 24, 25:

            posic = Car_esp(token)

            tokenval = "CE"

   Case 27, 28:

            posic = Oper_arit(token)

            tokenval = "OPARIT"

  End Select

 

   If (fila >= 1) Then

    no_tokens = fila

    Form4.MSFlexGrid1.Rows = Form4.MSFlexGrid1.Rows + 1 '1

   End If

    Form4.MSFlexGrid1.TextMatrix(fila, 0) = fila 'Numero consecutivo  1

    Form4.MSFlexGrid1.TextMatrix(fila, 1) = linea '1

    Form4.MSFlexGrid1.TextMatrix(fila, 2) = tokenval '1

    Form4.MSFlexGrid1.TextMatrix(fila, 3) = posic       '1

    Form4.MSFlexGrid1.TextMatrix(fila, 4) = toke_linea  '1

    Form4.MSFlexGrid1.TextMatrix(fila, 5) = token   '1

 '  If (tokenval = "PR") Then

        'token_equi = pal_reser_E(posic)

 '       Call Form12.tabla_equi(pal_reser_E(posic), linea)

 '   End If

token = ""

fila = fila + 1

ba = 0

 

End Sub

Public Sub dimen_cajaerr()

With Tabla_errores

  .ColWidth(0) = 2000

  .ColWidth(1) = 5000

  End With

End Sub

 

Public Sub limpia_tablas_tama()

 

'Inicializa las variables

fila_ide = 0

fila_num = 0

fila_coal = 0

Tabla_errores.Visible = False

fila_error = 0

fil = 0

 

'Dimensionar las tablas

Call dimen_cajaerr

Call Form4.dimen_tabsimb '1

Call Form5.dimen_tabID '2

Call Form7.dimen_tabnum '3

Call Form6.dimen_tabcoalf '4

 

 

'Limpiar las tablas

Call limpia_cajaerrores

Call Form4.limpia_tabsimb '1

Call Form5.limpia_tabid  '2

Call Form7.limpia_tabnum '3

Call Form6.limpia_tabcoalf '4

Call form8.limpia_tabPR '5

 

 

 

End Sub

 

Public Sub cajas_errores(linea_error As Integer, tok_error As String, fila_error)

 

Tabla_errores.Visible = True

Command1.Visible = True

 

 

bandera_gral = False

 

 If (fila_error = 0) Then

    Tabla_errores.TextMatrix(fila_error, 0) = "LINEA"

    Tabla_errores.TextMatrix(fila_error, 1) = "ERROR"

    fila_error = fila_error + 1

 End If

   

 

 

      If (fila_error >= 1) Then

         Tabla_errores.Rows = Tabla_errores.Rows + 1

       End If

      Tabla_errores.TextMatrix(fila_error, 0) = linea_error

      Tabla_errores.TextMatrix(fila_error, 1) = tok_error

      fila_error = fila_error + 1

     

 tok_error = ""

 

End Sub

 

Private Sub analizar_lex_Click()

'PARSER DEL ANALIZADOR LEXICO

Dim tama_profu As Integer

Dim i As Integer 'Lleva el inicio de la cadena es decir, que voy a leer

Dim j As Integer ' Utilizado en los comentarios y constantes alfanumericas

Dim tok_linea As Integer

Dim cadena As String * 1

Dim cade_enter As String * 1

Dim estado As Integer

Dim token_error As String

Dim linea As Integer

Dim posicion As Integer

Dim token As String

Dim ban As Integer

Dim car As Integer

 

 

bandera_gral = True

analizar_sin.Enabled = True

Tab_Equi.Enabled = True

 

 

Load Form4 '1

Tablas_din.Enabled = True

 

 

i = 1

linea = 1

cade_enter = vbCrLf

tok_linea = 0

Call limpia_tablas_tama

    With Form4

                                                                                     

    .MSFlexGrid1.TextMatrix(fil, 0) = "NUMERO" '1

    .MSFlexGrid1.TextMatrix(fil, 1) = "LINEA" '1

    .MSFlexGrid1.TextMatrix(fil, 2) = "TOKEN" '1

    .MSFlexGrid1.TextMatrix(fil, 3) = "DIRECCION" '1

    .MSFlexGrid1.TextMatrix(fil, 4) = "TOKxLIN" '1

    .MSFlexGrid1.TextMatrix(fil, 5) = "VALOR" '1

    End With

fil = fil + 1

 

tama_profu = Len(txtQuery.Text)

 

While (i <= tama_profu)

  token = ""

  cadena = Mid(txtQuery.Text, i, 1)

  car = Asc(cadena)

  token_error = "Caracter desconocido no válido " & cadena

 ' cadena = Mid(txtQuery.Text, i, 1)

   If (cadena = cade_enter) Then

     tok_linea = 0

     i = i + 2

     linea = linea + 1

     ban = 0

     ElseIf (cadena = " " Or car = 9) Then 'Checar el valor de tabulacion

       ban = 0 'Cual es la sintaxis del tabulador?

       i = i + 1

     Else: ban = 1

   End If

 estado = 0

  While (ban)

   

    Select Case (estado)

   

    'Operadores relacionales

        Case 0: cadena = Mid(txtQuery.Text, i, 1)

                If (cadena = "=") Then

                    token = token & cadena

                    estado = 5

                    i = i + 1

                ElseIf (cadena = "<") Then

                    token = token & cadena

                    estado = 1

                    i = i + 1

                ElseIf (cadena = ">") Then

                    token = token & cadena

                    estado = 6

                    i = i + 1

                Else

                     estado = falla(estado)

                End If

         Case -1:

                 Call inser_token(fil, linea, token, tok_linea, ban, estado)

         Case 1: cadena = Mid(txtQuery.Text, i, 1)

                If (cadena = "=") Then

                    token = token & cadena

                    estado = 2

                    i = i + 1

                ElseIf (cadena = ">") Then

                    token = token & cadena

                    estado = 3

                     i = i + 1

                ElseIf (isvalido(cadena)) Then

                    estado = 4

                ElseIf (Not isvalido(cadena)) Then

                    estado = 29

                    token_error = "Caracter desconocido no válido " & cadena

                End If

         Case 2: Call inser_token(fil, linea, token, tok_linea, ban, estado)

         Case 3: Call inser_token(fil, linea, token, tok_linea, ban, estado)

         Case 4: Call inser_token(fil, linea, token, tok_linea, ban, estado)

         Case 5: cadena = Mid(txtQuery.Text, i, 1)

                If (cadena = "=") Then

                    token = token & cadena

                    estado = -1

                    i = i + 1

                ElseIf (isvalido(cadena)) Then

                    estado = 8

                ElseIf (Not isvalido(cadena)) Then

                    estado = 29

                    token_error = "Caracter desconocido no válido " & cadena

               

                'Else

                '     estado = 25 'Enviar el error a la tabla adecuada

                '     token_error = "Caracter Desconocido no válido " & cadena

                End If

                 

         Case 6: cadena = Mid(txtQuery.Text, i, 1)

                If (cadena = "=") Then

                    token = token & cadena

                    estado = 7

                    i = i + 1

                    ElseIf (isvalido(cadena)) Then

                    estado = 8

                    ElseIf (Not isvalido(cadena)) Then

                    estado = 29

                    token_error = "Caracter desconocido no válido " & cadena

                End If

         Case 7: Call inser_token(fil, linea, token, tok_linea, ban, estado)

        

         Case 8: Call inser_token(fil, linea, token, tok_linea, ban, estado)

        

         'Letras

         Case 9: cadena = Mid(txtQuery.Text, i, 1)

                 If (iscaracter(cadena)) Then 'checar funcion

                    token = token & cadena

                    estado = 10

                    i = i + 1

                 Else

                     estado = falla(estado)

                 End If

         Case 10: cadena = Mid(txtQuery.Text, i, 1)

                 If (cadena = "_" Or iscaracter(cadena) Or (isnumero(cadena))) Then 'checar funcion

                    token = token & cadena

                    estado = 10

                    i = i + 1

                 ElseIf (isvalido(cadena)) Then

                     estado = 11

                 ElseIf (Not isvalido(cadena)) Then

                    'aqui modifique

                      Call inser_token(fil, linea, token, tok_linea, ban, estado + 1)

                      estado = 29 'Enviar el error a la tabla adecuada

                      ban = 1

                     'token_error = "Identificador no valido"

                      token_error = "Caracter desconocido no válido " & cadena

                 End If

         Case 11: Call inser_token(fil, linea, token, tok_linea, ban, estado)

        

          'Numeros

         Case 12: cadena = Mid(txtQuery.Text, i, 1)

                 If (isnumero(cadena)) Then 'checar funcion

                    token = token & cadena

                    estado = 13

                    i = i + 1

                 Else

                     estado = falla(estado)

                 End If

         Case 13: cadena = Mid(txtQuery.Text, i, 1)

                 If (isnumero(cadena)) Then 'checar funcion

                    token = token & cadena

                    estado = 13

                    i = i + 1

                 ElseIf (cadena = ".") Then

                    token = token & cadena

                    estado = 13

                    i = i + 1

                

                 ElseIf (isvalido(cadena)) Then

                  estado = 14

                 ElseIf (Not isvalido(cadena)) Then

                  Call inser_token(fil, linea, token, tok_linea, ban, 14) 'Salvar los números que están antes del error

                  estado = 29 'Enviar el error a la tabla adecuada

                  token_error = "Caracter desconocido no válido " & cadena

                 End If

         Case 14: Call inser_token(fil, linea, token, tok_linea, ban, estado)

        

         'Constante alfanumérica

         Case 15: cadena = Mid(txtQuery.Text, i, 1)

                 If (cadena = """") Then 'checar funcion

                     token = token & cadena

                     Call inser_token(fil, linea, token, tok_linea, ban, estado)

                     estado = 16

                     ban = 1

                     i = i + 1

                 Else

                     estado = falla(estado)

                 End If

         Case 16:

                  tama_profu = tama_profu + 1

                 For j = i To tama_profu

                    cadena = Mid(txtQuery.Text, i, 1)

                  If (cadena = "\" And Mid(txtQuery.Text, i + 1, 1) = """" And cadena <> cade_enter) Then

                     token = token & Mid(txtQuery.Text, i + 1, 1)

                     i = i + 1

                   ElseIf (cadena <> """" And cadena <> cade_enter) Then

                     token = token & cadena

                   End If

                     If (cadena = """") Then

                       Call inser_token(fil, linea, token, tok_linea, ban, estado)

                       token = token & cadena

                       ban = 1

                       estado = 17

                       Exit For

                       ElseIf (cadena = cade_enter) Then

                       estado = 26 'error dio enter

                       token_error = "Constante alfanumérica mal delimitada"

                       Exit For

                       ElseIf (j = tama_profu) Then

                       i = i + 1

                       estado = 26 'error no se termino " CHECAR QUE LA BANDERA INDICA ERROR

                       token_error = "Constante alfanumérica mal delimitada"

                       Exit For

                     End If

                     i = i + 1

                  Next j

         Case 17: Call inser_token(fil, linea, token, tok_linea, ban, estado)

                   i = i + 1

        

         'Comentarios

         Case 18: cadena = Mid(txtQuery.Text, i, 1)

                 If (cadena = "'") Then

                    estado = 19

                    i = i + 1

                 Else

                     estado = falla(estado)

                 End If

        Case 19:

                  cadena = Mid(txtQuery.Text, i, 1)

                  tama_profu = tama_profu + 1

                  estado = 20

                 '   If (cadena = "/") Then

                 '      estado = 20

                 '      i = i + 1

                  '  End If

               ' For j = i To tama_profu

                '  If (estado = 20) Then

                 '    Exit For

                 ' End If

                '  cadena = Mid(txtQuery.Text, i, 1)

                 '       If (j >= tama_profu) Then

                  '      estado = 26 'Error comentario mal delimitado un solo / sin letra, esp, enter

                   '     token_error = "Comentario mal delimitado"

                    '    Exit For

                     '   ElseIf (cadena = cade_enter) Then

                      '  token_error = "Comentario mal delimitado"

                       ' estado = 26 'Error comentario mal delimitado solo un / y un enter

                        'Exit For

                       ' i = i + 1

                   ' End If

                   ' i = i + 1

               ' Next j

                

         Case 20:

                 tama_profu = tama_profu + 1

                 For j = i To tama_profu

                    cadena = Mid(txtQuery.Text, i, 1)

                    i = i + 1

                      If (cadena = cade_enter) Then

                       linea = linea + 1

                       i = i + 1

                       ban = 0

                       Exit For

                       ElseIf (j = tama_profu) Then

                       linea = linea + 1

                       ban = 0

                       Exit For

                      End If

                  Next j

                 

            'Caracteres especiales

         Case 21: cadena = Mid(txtQuery.Text, i, 1)

                 If (cadena = ";" Or cadena = ":" Or cadena = "!") Then 'checar funcion

                    token = token & cadena

                    estado = 22

                    i = i + 1

                 ElseIf (cadena = "," Or cadena = "{") Then

                    token = token & cadena

                    estado = 23

                    i = i + 1

                 ElseIf (cadena = """" Or cadena = "}") Then

                    token = token & cadena

                    estado = 24

                    i = i + 1

                 ElseIf (cadena = "(" Or cadena = ")") Then

                    token = token & cadena

                    estado = 25

                    i = i + 1

                 Else

                     estado = falla(estado)

                 End If

         Case 22: Call inser_token(fil, linea, token, tok_linea, ban, estado)

         Case 23: Call inser_token(fil, linea, token, tok_linea, ban, estado)

         Case 24: Call inser_token(fil, linea, token, tok_linea, ban, estado)

         Case 25: Call inser_token(fil, linea, token, tok_linea, ban, estado)

         'operadores aritmeticos

         Case 26:

                If (cadena = "+" Or cadena = "-") Then

                    token = token & cadena

                    estado = 27

                    i = i + 1

                ElseIf (cadena = "/" Or cadena = "*") Then

                    token = token & cadena

                    estado = 28

                    i = i + 1

                ElseIf (isvalido(cadena)) Then

                    estado = 28

                ElseIf (Not isvalido(cadena)) Then

                    estado = 29

                    token_error = "Caracter desconocido no válido " & cadena

                             

                Else

                    estado = falla(estado)

                End If

         Case 27: Call inser_token(fil, linea, token, tok_linea, ban, estado)

         Case 28: Call inser_token(fil, linea, token, tok_linea, ban, estado)

        

        

        

        

         'Errores

         Case 29:

                   cadena = Mid(txtQuery.Text, i, 1)

                    If (i > tama_profu) Then

                       estado = 30

                    ElseIf (cadena = cade_enter) Then

                       estado = 30

                    ElseIf (iscaracter(cadena) Or isnumero(cadena) Or Not isvalido(cadena)) Then

                      i = i + 1

                      'estado = 25

                      'estado = 0

                      estado = 30

                   ' ElseIf (isvalido(cadena)) Then

                   '    estado = 26

                    End If

         Case 30:  token = ""

                   ban = 0

                   Call cajas_errores(linea, token_error, fila_error)

                  

  

    End Select

   

 

  Wend

Wend

'Solo Activar En Proyecto Terminado

'Desactivar Enabled en Lexico, Sintactico y Semantico

'Por Ahora se encuentran activados

 

If (bandera_gral = True) Then

  analizar_lex.Enabled = False

   

End If

 

End Sub

 

 

 

 

''''''''''''''aqui se realiza el analisis sintactico

 

Private Sub analizar_sin_Click()

'aqui empieza el analizador sintactico

Dim no_token As Integer

Dim linea As Integer

Dim tipo_token As String

Dim token As String

Dim i As Integer

Dim est As Integer

Dim linea_aux As Integer

Dim close_ban As Boolean

Dim open_estructura As Integer

Dim open_estruc_do As Integer

Dim do_encontrado As Integer

Dim es_valido As Boolean

Dim retorna As Boolean 'para el retorno de funciones

 

es_valido = False

est = 0   'control del estado actual

i = 1  'control de los tokens

do_encontrado = 0

open_estructura = 0

open_estruc_do = 0

 

While (i <= no_tokens)

 

'i = i + 1

'primer token

    With Form4

        no_token = .MSFlexGrid1.TextMatrix(i, 0) ' no. de token

        linea = .MSFlexGrid1.TextMatrix(i, 1) ' no. de linea

        tipo_token = .MSFlexGrid1.TextMatrix(i, 2) ' tipo_de token

        token = .MSFlexGrid1.TextMatrix(i, 5) 'valor token

        If (i > 1) Then

            linea_aux = .MSFlexGrid1.TextMatrix(i - 1, 1) ' no. de linea del token anterior

        End If

    End With

i = i + 1

Select Case (est)

        Case 0:

                If (token = "INCLUIR") Then

                    est = 1

                Else

                    MsgBox ("Se esperaba PR [incluir] en la linea " & linea)

                    Exit Sub

                End If

                

        Case 1:

                If (token = """" And linea = linea_aux) Then

                    est = 2

                Else

                    MsgBox ("Se esperaba CE [ "" ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 2: 'aqui hay que validar la ruta de los archivos

                'de cabecera, por defaul son una CTEALF

                If (tipo_token = "CTEALF" And linea = linea_aux) Then

                    est = 3

                Else

                    MsgBox ("Se esperaba CTEALF en la linea " & linea_aux)

                    Exit Sub

                End If

               

        Case 3:

                If (token = """" And linea = linea_aux) Then

                    est = 4

                Else

                    MsgBox ("Se esperaba CE [ "" ] en la linea " & linea_aux)

                    Exit Sub

                End If

       

        Case 4:

                If (token = ";" And linea = linea_aux) Then

                    est = 5

                Else

                    MsgBox ("Se esperaba CE [;] en la linea " & linea_aux)

                    Exit Sub

               

                End If

               

        Case 5:

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & "en la línea: " & linea)

                    Exit Sub

                Else

                    ' si son prototipos de funciones

                    If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA") Then

                        est = 6

                    ElseIf (token = "LOGICO" Or token = "REAL" Or token = "VOID") Then

                        est = 6

                    ' si se declara nuevamente otra cabecera

                    ElseIf (token = "INCLUIR") Then

                        est = 1

                    ' si es el inicio del cuerpo del programa

                    ElseIf (token = "INICIO") Then

                        est = 14

                    Else

                        MsgBox ("Se esperaba PR [ INICIO ] en la linea " & linea)

                        Exit Sub

                    End If

                End If

        Case 6:

                ' prototipos de funciones

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 7

                Else

                    MsgBox ("Se esperaba [ ID ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 7:

                If (token = "(" And linea = linea_aux) Then

                    est = 8

                Else

                    MsgBox ("Se esperaba CE [ ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 8:

                If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA" And linea = linea_aux) Then

                    est = 9

                ElseIf (token = "LOGICO" Or token = "REAL" And linea = linea_aux) Then

                    est = 9

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 12

                Else

                    MsgBox ("Se esperaba CE [ ) ] o TIPO DATO en la linea " & linea)

                    Exit Sub

                End If

        Case 9:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 10

                Else

                    MsgBox ("Se esperaba [ ID ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 10:

                If (token = "," And linea = linea_aux) Then

                    est = 11

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 12

                Else

                    MsgBox ("Se esperaba CE [ , ó ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 11:

                If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA" And linea = linea_aux) Then

                    est = 9

                ElseIf (token = "LOGICO" Or token = "REAL" And linea = linea_aux) Then

                    est = 9

                Else

                    MsgBox ("Se esperaba TIPO DATO en la linea " & linea_aux)

                    Exit Sub

                End If

             

        Case 12: ' cerrar parentesis del prototipo de funcion

                If (token = ";" And linea = linea_aux) Then

                    est = 13

                Else

                    MsgBox ("Se esperaba CE [ ; ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 13:

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & "en la línea: " & linea)

                    Exit Sub

                Else

                    ' si son otros prototipos de funciones

                    If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA") Then

                        est = 6

                    ElseIf (token = "LOGICO" Or token = "REAL" Or token = "VOID") Then

                        est = 6

                    ' si es el inicio del cuerpo del programa

                    ElseIf (token = "INICIO") Then

                        est = 14

                    Else

                        MsgBox ("Se esperaba PR [ INICIO ] en la linea " & linea)

                        Exit Sub

                    End If

                End If

        Case 14: 'inicio del cuerpo de programa

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & "en la línea: " & linea)

                    Exit Sub

                Else

                    'si son declaraciones de variables

                    If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA") Then

                        est = 15

                    ElseIf (token = "LOGICO" Or token = "REAL") Then

                        est = 15

                    ' si son sentencias y/o llamadas a funciones

                    ElseIf (tipo_token = "ID") Then

                        est = 33

                    ElseIf (token = "WRITE") Then

                        est = 22

                    ElseIf (token = "READ") Then

                        est = 28

                    ElseIf (token = "PRINT") Then

                        est = 31

                    ElseIf (token = "IF") Then

                        open_estructura = open_estructura + 1

                        est = 44

                    ElseIf (token = "WHILE") Then

                        open_estructura = open_estructura + 1

                        est = 44

                    ElseIf (token = "DO") Then

                        open_estructura = open_estructura + 1

                        est = 52

                    ElseIf (token = "FIN") Then

                        es_valido = True

                            'pendiente para las definiciones de funciones

                        est = 63 ''llamadaa definicion de funciones

                    Else

                        MsgBox ("Se esperaba DECLARACIONES ó SENTENCIA o PR[ fin ]en la linea " & _

                                   linea)

                        Exit Sub

                    End If

                End If

        Case 15:

                'inicio de declaraciones

                    If (tipo_token = "ID" And linea = linea_aux) Then

                        est = 16

                    Else

                        MsgBox ("Se esperaba ID en la linea " & linea_aux)

                        Exit Sub

                    End If

        Case 16:

                If (token = "(" And linea = linea_aux) Then

                    est = 17

                ElseIf (token = "," And linea = linea_aux) Then

                    est = 20

                ElseIf (token = ";" And linea = linea_aux) Then

                    est = 21

               

                Else

                    MsgBox ("Se esperaba CE [, ó ; ó (] en la linea " & linea_aux)

                    Exit Sub

                End If

               

        Case 17:

                ' arreglo de tipo de dato

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 18

                Else

                    MsgBox ("Se esperaba CTE_NUM en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 18:

                If (token = ")" And linea = linea_aux) Then

                    est = 19

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 19:

                If (token = ";" And linea = linea_aux) Then

                    est = 21

                ElseIf (token = "," And linea = linea_aux) Then

                    est = 20

                Else

                    MsgBox ("Se esperaba CE [ ; ó , ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 20:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 16

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        ' aqui quite un caso el 21  14/11/03

        Case 21:

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & "en la línea: " & linea)

                    Exit Sub

                Else

                'si es otra declaracion

                    If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA") Then

                        est = 15

                    ElseIf (token = "LOGICO" Or token = "REAL") Then

                        est = 15

                    'si son sentencias y/o llamadas a funciones

                    ElseIf (tipo_token = "ID") Then

                        est = 33

                    ElseIf (token = "WRITE") Then

                        est = 22

                    ElseIf (token = "READ") Then

                        est = 28

                    ElseIf (token = "PRINT") Then

                        est = 31

                    ElseIf (token = "IF") Then

                        open_estructura = open_estructura + 1

                        est = 44

                    ElseIf (token = "WHILE") Then

                        open_estructura = open_estructura + 1

                        est = 44

                    ElseIf (token = "DO") Then

                        open_estructura = open_estructura + 1

                        est = 52

                    ElseIf (token = "FIN") Then

                        es_valido = True

                            'pendiente para las definiciones de funciones

                        est = 63 ''llamadaa definicion de funciones

                    Else

                        MsgBox ("Se esperaba PR [ FIN ] en la linea " & linea)

                        Exit Sub

                    End If

                End If

        'modificado 14 / 11 / 3???????

        Case 22: 'inicio de sentencia WRITE

                If (token = """" And linea = linea_aux) Then

                    est = 23

                Else

                    MsgBox ("Se esperaba CE [ "" ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 23:

                If (tipo_token = "CTEALF" And linea = linea_aux) Then

                    est = 25

                Else

                    MsgBox ("Se esperaba CTEALF en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 25:

                If (token = """" And linea = linea_aux) Then

                    est = 26

                Else

                    MsgBox ("Se esperaba CE [ "" ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 26: 'fin sentencias

                If (token = ";" And linea = linea_aux) Then

                    est = 27

                Else

                    MsgBox ("Se esperaba CE [ ; ] " & linea_aux)

                    Exit Sub

                End If

        Case 27:

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & " en la línea: " & linea)

                    Exit Sub

                Else

                 ' si son sentencias y/o llamadas a funciones

                    If (open_estructura = 0) Then

                        If (tipo_token = "ID") Then

                            est = 33

                        ElseIf (token = "WRITE") Then

                            est = 22

                        ElseIf (token = "READ") Then

                            est = 28

                        ElseIf (token = "PRINT") Then

                            est = 31

                        ElseIf (token = "IF") Then

                            open_estructura = open_estructura + 1

                            est = 44

                        ElseIf (token = "WHILE") Then

                            open_estructura = open_estructura + 1

                            est = 44

                        ElseIf (token = "DO") Then

                            open_estructura = open_estructura + 1

                            est = 52

                        ElseIf (token = "FIN") Then

                            es_valido = True

                            'pendiente para las definiciones de funciones

                            est = 63 ''llamadaa definicion de funciones

                        Else

                            MsgBox ("Se esperaba PR [ FIN ] en la linea " & linea)

                            Exit Sub

                        End If

                    Else 'existen condiciones o bucles IF o WHILE

                        If (tipo_token = "ID") Then

                            est = 33

                        ElseIf (token = "WRITE") Then

                            est = 22

                        ElseIf (token = "READ") Then

                            est = 28

                        ElseIf (token = "PRINT") Then

                            est = 31

                        ElseIf (token = "IF") Then

                            open_estructura = open_estructura + 1

                            est = 44

                        ElseIf (token = "WHILE") Then

                            open_estructura = open_estructura + 1

                            est = 44

                        ElseIf (token = "DO") Then

                            open_estructura = open_estructura + 1

                            est = 52

                        ElseIf (token = "}") Then

                           ' open_estructura = open_estructura - 1

                            If (do_encontrado > 0) Then

                                If (open_estruc_do > 0) Then

                                    open_estruc_do = open_estruc_do - 1

                                    est = 53

                                Else

                                    do_encontrado = do_encontrado - 1

                                    open_estructura = open_estructura - 1

                                    est = 54

                                End If

                            Else

                                open_estructura = open_estructura - 1

                                est = 27

                            End If

                        Else

                            MsgBox ("Se esperaban SENTENCIAS o CE [ } ] en la linea " & linea)

                            Exit Sub

                        End If

                    End If

                End If

        Case 28: 'inicio de sentencia READ

                If (token = "(" And linea = linea_aux) Then

                    est = 29

                Else

                    MsgBox ("Se esperaba CE [ ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 29:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 30

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 30:

                If (token = ")" And linea = linea_aux) Then

                    est = 26

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 31: 'inicio de sentencia PRINT

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 32

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 32:

                If (token = ";" And linea = linea_aux) Then

                    est = 27

                ElseIf (token = "," And linea = linea_aux) Then

                    est = 31

                Else

                    MsgBox ("Se esperaba CE [ ; ó ,] en la linea " & linea_aux)

                    Exit Sub

                End If

         Case 33: 'inicio asignaciones y/o llamadas a funciones

         'por el momento solo se asiganaran a variables

         'unidimensionales

                If (token = "=" And linea = linea_aux) Then

                    est = 34

                ElseIf (token = "(" And linea = linea_aux) Then

                    est = 41  ' si es un arreglo

                Else

                    MsgBox ("Se esperaba CE [ = ó ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

       

        Case 34: ' despues del igual

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 35

                ElseIf (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 39

                Else

                    MsgBox ("Se esperaba ID o CTENUM en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 35:

                If (token = "(" And linea = linea_aux) Then

                    est = 36

                ElseIf (token = ";" And linea = linea_aux) Then

                    est = 27

                ElseIf (tipo_token = "OPARIT" And linea = linea_aux) Then

                    est = 34

                Else

                    MsgBox ("Se esperaba CE [ ( ó ; ] ó OPARIT en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 36:

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 37

                ElseIf (tipo_token = "ID" And linea = linea_aux) Then

                    est = 40  'llamada a funcion

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 38

                Else

                    MsgBox ("Se esperaba CE [ ) ]ó CTENUM ó ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 37:

                If (token = ")" And linea = linea_aux) Then

                    est = 38

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

 

        Case 38:

                If (token = ";" And linea = linea_aux) Then

                    est = 27

                ElseIf (tipo_token = "OPARIT" And linea = linea_aux) Then

                    est = 34

                Else

                    MsgBox ("Se esperaba CE [ ; ] ó APARIT en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 39: ' constante numerica

                If (tipo_token = "OPARIT" And linea = linea_aux) Then

                    est = 34

                ElseIf (token = ";" And linea = linea_aux) Then

                    est = 27

                Else

                    MsgBox ("Se esperaba CE [ ; ] ó APARIT en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 40: 'si es una funcion con parametros

                If (token = "," And linea = linea_aux) Then

                    est = 40

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 38

                Else

                    MsgBox ("Se esperaba CE [ , ó ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 41:

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 42

                Else

                    MsgBox ("Se esperaba CTENUM en la linea " & linea_aux)

                    Exit Sub

                End If

               

        Case 42:

                If (token = ")" And linea = linea_aux) Then

                    est = 43

                Else

                    MsgBox ("Se esperaba CE [ ) ]en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 43:

                If (token = "=" And linea = linea_aux) Then

                    est = 34

                Else

                    MsgBox ("Se esperaba CE [ = ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 44: ' inicio sentencia if o while

                If (token = "(" And linea = linea_aux) Then

                    est = 45

                Else

                    MsgBox ("Se esperaba CE [ ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 45:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 46

                ElseIf (token = "!" And linea = linea_aux) Then

                    est = 51

                Else

                    MsgBox ("Se esperaba ID ó CE [ ! ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 46:

                If (tipo_token = "OPR" And linea = linea_aux) Then

                    est = 47

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 49

                Else

                    MsgBox ("Se esperaba OPREL ó CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 47:

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 48

                ElseIf (tipo_token = "ID" And linea = linea_aux) Then

                    est = 48

                ElseIf (token = "!" And linea = linea_aux) Then

                    est = 50

                Else

                    MsgBox ("Se esperaba CTENUM ó ID ó CE [ ! ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 48:

                If (token = ")" And linea = linea_aux) Then

                    est = 49

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 49:

                If (token = "{" And linea = linea_aux) Then

                    est = 27

                Else

                    MsgBox ("Se esperaba CE [ { ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 50:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 48

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 51:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 46

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 52: 'inicio sentencia DO

                If (token = "{" And linea = linea_aux) Then

                    do_encontrado = do_encontrado + 1

                    est = 53

                Else

                    MsgBox ("Se esperaba CE [ { ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 53:

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & " en la línea: " & linea)

                    Exit Sub

                Else

                        If (tipo_token = "ID") Then

                            est = 33

                        ElseIf (token = "WRITE") Then

                            est = 22

                        ElseIf (token = "READ") Then

                            est = 28

                        ElseIf (token = "PRINT") Then

                            est = 31

                        ElseIf (token = "IF") Then

                            open_estruc_do = open_estruc_do + 1

                            est = 44

                        ElseIf (token = "WHILE") Then

                            open_estruc_do = open_estruc_do + 1

                            est = 44

                        ElseIf (token = "DO") Then

                            open_estruc_do = open_estruc_do + 1

                            est = 52

                        ElseIf (token = "}") Then

                            do_encontrado = do_encontrado - 1

                            open_estructura = open_estructura - 1

                            est = 54

                        Else

                            MsgBox ("Se esperaban SENTENCIAS o CE [ } ] en la linea " & linea)

                            Exit Sub

                        End If

                End If

        Case 54: 'fin sentencia DO

                If (token = "WHILE" And linea = linea_aux) Then

                    est = 55

                Else

                    MsgBox ("Se esperaba PR [ while ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 55:

                If (token = "(" And linea = linea_aux) Then

                    est = 56

                Else

                    MsgBox ("Se esperaba CE [ ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 56:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 57

                ElseIf (token = "!" And linea = linea_aux) Then

                    est = 61

                Else

                    MsgBox ("Se esperaba ID ó CE [ ! ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 57:

                If (tipo_token = "OPR" And linea = linea_aux) Then

                    est = 58

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 62

                Else

                    MsgBox ("Se esperaba OPREL ó CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 58:

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 59

                ElseIf (tipo_token = "ID" And linea = linea_aux) Then

                    est = 59

                ElseIf (token = "!" And linea = linea_aux) Then

                    est = 61

                Else

                    MsgBox ("Se esperaba CTENUM ó ID ó CE [ ! ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 59:

                If (token = ")" And linea = linea_aux) Then

                    est = 62

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 60:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 57

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

               

        Case 61:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 59

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

               

        Case 62: 'fin sentencia do

                If (token = ";" And linea = linea_aux) Then

                    If (do_encontrado > 0) Then 'si existe un Do

                        est = 53

                    Else

                        est = 27

                    End If

                Else

                    MsgBox ("Se esperaba CE [ ; ] " & linea_aux)

                    Exit Sub

                End If

        Case 63: 'Finalizar el cuerpo del programa

                'y empezar la definiciones de funciones

                retorna = False

                do_encontrado = 0

                open_estructura = 0

                open_estruc_do = 0

                es_valido = False 'para validar que ahora la funcion se

                'complete correctamente

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & "en la línea: " & linea)

                    Exit Sub

                Else

                    ' si prototipos de funciones

                    If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA") Then

                        retorna = True

                        est = 64

                    ElseIf (token = "LOGICO" Or token = "REAL") Then

                        retorna = True

                        est = 64

                    ElseIf (token = "VOID") Then

                        est = 64

                    ' si es el inicio del cuerpo del programa

                    Else

                        MsgBox ("Se esperaba TIPO de DATO en la linea " & linea)

                        Exit Sub

                    End If

                End If

        Case 64: 'comenzar las definiciones de funciones

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 65

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 65:

                If (token = "(" And linea = linea_aux) Then

                    est = 66

                Else

                    MsgBox ("Se esperaba CE [ ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 66:

                If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA" And linea = linea_aux) Then

                    est = 67

                ElseIf (token = "LOGICO" Or token = "REAL" And linea = linea_aux) Then

                    est = 67

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 70

                Else

                    MsgBox ("Se esperaba CE [ ) ] o TIPO DATO en la linea " & linea)

                    Exit Sub

                End If

        Case 67:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 68

                Else

                    MsgBox ("Se esperaba [ ID ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 68:

                If (token = "," And linea = linea_aux) Then

                    est = 69

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 70

                Else

                    MsgBox ("Se esperaba CE [ , ó ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 69:

                If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA" And linea = linea_aux) Then

                    est = 67

                ElseIf (token = "LOGICO" Or token = "REAL" And linea = linea_aux) Then

                    est = 67

                Else

                    MsgBox ("Se esperaba TIPO DATO en la linea " & linea_aux)

                    Exit Sub

                End If

             

        Case 70: ' cerrar parentesis del prototipo de funcion

                If (token = "{" And linea = linea_aux) Then

                    est = 71

                Else

                    MsgBox ("Se esperaba CE [ { ] en la linea " & linea_aux)

                    Exit Sub

                End If

 

        Case 71: 'inicio del cuerpo de la definicion de funcion

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & "en la línea: " & linea)

                    Exit Sub

                Else

                    'si son declaraciones de variables

                    If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA") Then

                        est = 151

                    ElseIf (token = "LOGICO" Or token = "REAL") Then

                        est = 151

                    ' si son sentencias y/o llamadas a funciones

                    ElseIf (tipo_token = "ID") Then

                        est = 331

                    ElseIf (token = "WRITE") Then

                        est = 221

                    ElseIf (token = "READ") Then

                        est = 281

                    ElseIf (token = "PRINT") Then

                        est = 311

                    ElseIf (token = "IF") Then

                        open_estructura = open_estructura + 1

                        est = 441

                    ElseIf (token = "WHILE") Then

                        open_estructura = open_estructura + 1

                        est = 441

                    ElseIf (token = "DO") Then

                        open_estructura = open_estructura + 1

                        est = 521

                    ElseIf (token = "RETURN" And retorna = True) Then

                        est = 72

                    ElseIf (token = "}" And retorna = True) Then

                        MsgBox ("Se espera PR [ RETURN ] en la linea " & linea)

                        Exit Sub

                    ElseIf (token = "}" And retorna = False) Then

                        es_valido = True

                        est = 63

                    Else

                        MsgBox ("Se esperaba DECLARACIONES ó SETENCIAS ó Cierre de Función [ } ] en la linea " & linea)

                        Exit Sub

                    End If

                End If

        Case 151:

                'inicio de declaraciones

                    If (tipo_token = "ID" And linea = linea_aux) Then

                        est = 161

                    Else

                        MsgBox ("Se esperaba ID en la linea " & linea_aux)

                        Exit Sub

                    End If

        Case 161:

                If (token = "(" And linea = linea_aux) Then

                    est = 171

                ElseIf (token = "," And linea = linea_aux) Then

                    est = 201

                ElseIf (token = ";" And linea = linea_aux) Then

                    est = 211

               

                Else

                    MsgBox ("Se esperaba CE [, ó ; ó (] en la linea " & linea_aux)

                    Exit Sub

                End If

               

        Case 171:

                ' arreglo de tipo de dato

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 181

                Else

                    MsgBox ("Se esperaba CTE_NUM en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 181:

                If (token = ")" And linea = linea_aux) Then

                    est = 191

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 191:

                If (token = ";" And linea = linea_aux) Then

                    est = 211

                ElseIf (token = "," And linea = linea_aux) Then

                    est = 201

                Else

                    MsgBox ("Se esperaba CE [ ; ó , ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 201:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 161

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        ' aqui quite un caso el 21  14/11/03

        Case 211:

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & "en la línea: " & linea)

                    Exit Sub

                Else

                'si es otra declaracion

                    If (token = "ENTERO" Or token = "CARACTER" Or token = "CADENA") Then

                        est = 151

                    ElseIf (token = "LOGICO" Or token = "REAL") Then

                        est = 151

                    'si son sentencias y/o llamadas a funciones

                    ElseIf (tipo_token = "ID") Then

                        est = 331

                    ElseIf (token = "WRITE") Then

                        est = 221

                    ElseIf (token = "READ") Then

                        est = 281

                    ElseIf (token = "PRINT") Then

                        est = 311

                    ElseIf (token = "IF") Then

                        open_estructura = open_estructura + 1

                        est = 441

                    ElseIf (token = "WHILE") Then

                        open_estructura = open_estructura + 1

                        est = 441

                    ElseIf (token = "DO") Then

                        open_estructura = open_estructura + 1

                        est = 521

                    ElseIf (token = "RETURN" And retorna = True) Then

                        est = 72

                    ElseIf (token = "}" And retorna = True) Then

                        MsgBox ("Se espera PR [ RETURN ] en la linea " & linea)

                        Exit Sub

                    ElseIf (token = "}" And retorna = False) Then

                        es_valido = True

                        est = 63

                    Else

                        MsgBox ("Se esperaba SENTENCIAS ó Cierre de Función [ } ] en la linea " & linea)

                        Exit Sub

                    End If

                End If

        'modificado 14 / 11 / 3???????

        Case 221: 'inicio de sentencia WRITE

                If (token = """" And linea = linea_aux) Then

                    est = 231

                Else

                    MsgBox ("Se esperaba CE [ "" ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 231:

                If (tipo_token = "CTEALF" And linea = linea_aux) Then

                    est = 251

                Else

                    MsgBox ("Se esperaba CTEALF en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 251:

                If (token = """" And linea = linea_aux) Then

                    est = 261

                Else

                    MsgBox ("Se esperaba CE [ "" ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 261: 'fin sentencias

                If (token = ";" And linea = linea_aux) Then

                    est = 271

                Else

                    MsgBox ("Se esperaba CE [ ; ] " & linea_aux)

                    Exit Sub

                End If

        Case 271:

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & " en la línea: " & linea)

                    Exit Sub

                Else

                 ' si son sentencias y/o llamadas a funciones

                    If (open_estructura = 0) Then

                        If (tipo_token = "ID") Then

                            est = 331

                        ElseIf (token = "WRITE") Then

                            est = 221

                        ElseIf (token = "READ") Then

                            est = 281

                        ElseIf (token = "PRINT") Then

                            est = 311

                        ElseIf (token = "IF") Then

                            open_estructura = open_estructura + 1

                            est = 441

                        ElseIf (token = "WHILE") Then

                            open_estructura = open_estructura + 1

                            est = 441

                        ElseIf (token = "DO") Then

                            open_estructura = open_estructura + 1

                            est = 521

                        ElseIf (token = "RETURN" And retorna = True) Then

                            est = 72

                        ElseIf (token = "}" And retorna = True) Then

                            MsgBox ("Se espera PR [ RETURN ] en la linea " & linea)

                            Exit Sub

                        ElseIf (token = "}" And retorna = False) Then

                            est = 63

                        Else

                            MsgBox ("Se esperaba Cierre de Función [ } ] en la linea " & linea)

                            Exit Sub

                        End If

                    Else 'existen condiciones o bucles IF o WHILE

                        If (tipo_token = "ID") Then

                            est = 331

                        ElseIf (token = "WRITE") Then

                            est = 221

                        ElseIf (token = "READ") Then

                            est = 281

                        ElseIf (token = "PRINT") Then

                            est = 311

                        ElseIf (token = "IF") Then

                            open_estructura = open_estructura + 1

                            est = 441

                        ElseIf (token = "WHILE") Then

                            open_estructura = open_estructura + 1

                            est = 441

                        ElseIf (token = "DO") Then

                            open_estructura = open_estructura + 1

                            est = 521

                        ElseIf (token = "}") Then

                           ' open_estructura = open_estructura - 1

                            If (do_encontrado > 0) Then

                                If (open_estruc_do > 0) Then

                                    open_estruc_do = open_estruc_do - 1

                                    est = 531

                                Else

                                    do_encontrado = do_encontrado - 1

                                    open_estructura = open_estructura - 1

                                    est = 541

                                End If

                            Else

                                open_estructura = open_estructura - 1

                                est = 271

                            End If

                        Else

                            MsgBox ("Se esperaban SENTENCIAS o CE [ } ] en la linea " & linea)

                            Exit Sub

                        End If

                    End If

                End If

        Case 281: 'inicio de sentencia READ

                If (token = "(" And linea = linea_aux) Then

                    est = 291

                Else

                    MsgBox ("Se esperaba CE [ ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 291:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 301

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 301:

                If (token = ")" And linea = linea_aux) Then

                    est = 261

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 311: 'inicio de sentencia PRINT

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 321

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 321:

                If (token = ";" And linea = linea_aux) Then

                    est = 271

                ElseIf (token = "," And linea = linea_aux) Then

                    est = 311

                Else

                    MsgBox ("Se esperaba CE [ ; ó ,] en la linea " & linea_aux)

                    Exit Sub

                End If

         Case 331: 'inicio asignaciones y/o llamadas a funciones

         'por el momento solo se asiganaran a variables

         'unidimensionales

                If (token = "=" And linea = linea_aux) Then

                    est = 341

                ElseIf (token = "(" And linea = linea_aux) Then

                    est = 411  ' si es un arreglo

                Else

                    MsgBox ("Se esperaba CE [ = ó ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

       

        Case 341: ' despues del igual

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 351

                ElseIf (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 391

                Else

                    MsgBox ("Se esperaba ID o CTENUM en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 351:

                If (token = "(" And linea = linea_aux) Then

                    est = 361

                ElseIf (token = ";" And linea = linea_aux) Then

                    est = 271

                ElseIf (tipo_token = "OPARIT" And linea = linea_aux) Then

                    est = 341

                Else

                    MsgBox ("Se esperaba CE [ ( ó ; ] ó OPARIT en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 361:

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 371

                ElseIf (tipo_token = "ID" And linea = linea_aux) Then

                    est = 401  'llamada a funcion

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 381

                Else

                    MsgBox ("Se esperaba CE [ ) ]ó CTENUM ó ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 371:

                If (token = ")" And linea = linea_aux) Then

                    est = 381

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

 

        Case 381:

                If (token = ";" And linea = linea_aux) Then

                    est = 271

                ElseIf (tipo_token = "OPARIT" And linea = linea_aux) Then

                    est = 341

                Else

                    MsgBox ("Se esperaba CE [ ; ] ó APARIT en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 391: ' constante numerica

                If (tipo_token = "OPARIT" And linea = linea_aux) Then

                    est = 341

                ElseIf (token = ";" And linea = linea_aux) Then

                    est = 271

                Else

                    MsgBox ("Se esperaba CE [ ; ] ó APARIT en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 401: 'si es una funcion con parametros

                If (token = "," And linea = linea_aux) Then

                    est = 401

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 381

                Else

                    MsgBox ("Se esperaba CE [ , ó ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 411:

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 421

                Else

                    MsgBox ("Se esperaba CTENUM en la linea " & linea_aux)

                    Exit Sub

                End If

               

        Case 421:

                If (token = ")" And linea = linea_aux) Then

                    est = 431

                Else

                    MsgBox ("Se esperaba CE [ ) ]en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 431:

                If (token = "=" And linea = linea_aux) Then

                    est = 341

                Else

                    MsgBox ("Se esperaba CE [ = ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 441: ' inicio sentencia if o while

                If (token = "(" And linea = linea_aux) Then

                    est = 451

                Else

                    MsgBox ("Se esperaba CE [ ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 451:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 461

                ElseIf (token = "!" And linea = linea_aux) Then

                    est = 511

                Else

                    MsgBox ("Se esperaba ID ó CE [ ! ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 461:

                If (tipo_token = "OPR" And linea = linea_aux) Then

                    est = 471

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 491

                Else

                    MsgBox ("Se esperaba OPREL ó CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 471:

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 481

                ElseIf (tipo_token = "ID" And linea = linea_aux) Then

                    est = 481

                ElseIf (token = "!" And linea = linea_aux) Then

                    est = 501

                Else

                    MsgBox ("Se esperaba CTENUM ó ID ó CE [ ! ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 481:

                If (token = ")" And linea = linea_aux) Then

                    est = 491

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 491:

                If (token = "{" And linea = linea_aux) Then

                    est = 271

                Else

                    MsgBox ("Se esperaba CE [ { ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 501:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 481

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 511:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 461

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 521: 'inicio sentencia DO

                If (token = "{" And linea = linea_aux) Then

                    do_encontrado = do_encontrado + 1

                    est = 531

                Else

                    MsgBox ("Se esperaba CE [ { ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 531:

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & " en la línea: " & linea)

                    Exit Sub

                Else

                        If (tipo_token = "ID") Then

                            est = 331

                        ElseIf (token = "WRITE") Then

                            est = 221

                        ElseIf (token = "READ") Then

                            est = 281

                        ElseIf (token = "PRINT") Then

                            est = 311

                        ElseIf (token = "IF") Then

                            open_estruc_do = open_estruc_do + 1

                            est = 441

                        ElseIf (token = "WHILE") Then

                            open_estruc_do = open_estruc_do + 1

                            est = 441

                        ElseIf (token = "DO") Then

                            open_estruc_do = open_estruc_do + 1

                            est = 521

                        ElseIf (token = "}") Then

                            do_encontrado = do_encontrado - 1

                            open_estructura = open_estructura - 1

                            est = 541

                        Else

                            MsgBox ("Se esperaban SENTENCIAS o CE [ } ] en la linea " & linea)

                            Exit Sub

                        End If

                End If

        Case 541: 'fin sentencia DO WHILE

                If (token = "WHILE" And linea = linea_aux) Then

                    est = 551

                Else

                    MsgBox ("Se esperaba PR [ while ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 551:

                If (token = "(" And linea = linea_aux) Then

                    est = 561

                Else

                    MsgBox ("Se esperaba CE [ ( ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 561:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 571

                ElseIf (token = "!" And linea = linea_aux) Then

                    est = 611

                Else

                    MsgBox ("Se esperaba ID ó CE [ ! ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 571:

                If (tipo_token = "OPR" And linea = linea_aux) Then

                    est = 581

                ElseIf (token = ")" And linea = linea_aux) Then

                    est = 621

                Else

                    MsgBox ("Se esperaba OPREL ó CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 581:

                If (tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 591

                ElseIf (tipo_token = "ID" And linea = linea_aux) Then

                    est = 591

                ElseIf (token = "!" And linea = linea_aux) Then

                    est = 611

                Else

                    MsgBox ("Se esperaba CTENUM ó ID ó CE [ ! ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 591:

                If (token = ")" And linea = linea_aux) Then

                    est = 621

                Else

                    MsgBox ("Se esperaba CE [ ) ] en la linea " & linea_aux)

                    Exit Sub

                End If

        Case 601:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 571

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

               

        Case 611:

                If (tipo_token = "ID" And linea = linea_aux) Then

                    est = 591

                Else

                    MsgBox ("Se esperaba ID en la linea " & linea_aux)

                    Exit Sub

                End If

               

        Case 621: 'fin sentencia do

                If (token = ";" And linea = linea_aux) Then

                    If (do_encontrado > 0) Then 'si existe un Do

                        est = 531

                    Else

                        est = 271

                    End If

                Else

                    MsgBox ("Se esperaba CE [ ; ] " & linea_aux)

                    Exit Sub

                End If

        Case 72: 'Finalizar las definiciones de funciones

                    ' si fue con return

                If (tipo_token = "ID" Or tipo_token = "CTENUM" And linea = linea_aux) Then

                    est = 73

                Else

                    MsgBox ("Se esperaba ID ó CTENUM " & linea_aux)

                    Exit Sub

                End If

        Case 73:

                If (token = ";" And linea = linea_aux) Then

                    est = 74

                Else

                    MsgBox ("Se esperaba CE [ ; ] " & linea_aux)

                    Exit Sub

                End If

        Case 74:

                If (linea = linea_aux) Then

                    MsgBox ("No se esperaba " & token & "en la linea " & linea)

                    Exit Sub

                Else

                    If (token = "}") Then

                        es_valido = True

                        est = 63

                    Else

                        MsgBox ("Se esperaba Cierre de Función [ } ] " & linea_aux)

                        Exit Sub

                    End If

                End If

End Select

 

Wend   'while principal

If (es_valido = False) Then

    MsgBox ("No se ha completado correctamente " & _

           "una parte de programa")

Else

    MsgBox ("Programa sintácticamente  correctamente")

End If

'Solo Activar En Proyecto Terminado

'Desactivar Enabled en Lexico, Sintactico y Semantico

'Por Ahora se encuentran activados

 

If (bandera_gral = True) Then

  analizar_lex.Enabled = True

  analizar_sin.Enabled = False

  analizar_sem.Enabled = True

 

End If

 

End Sub

 

 

Private Sub archivo_abrir_Click()

txtQuery.Visible = True

Label1.Visible = True

 

On Error GoTo ManipularErrorAbrir

CommonDialog1.Filter = "ficheros de texto(*.txt;doc)|"

CommonDialog1.FilterIndex = 1

CommonDialog1.ShowOpen

 

Dim NumFichero As Integer

NumFichero = FreeFile

Open CommonDialog1.FileTitle For Input As NumFichero

Label1.Caption = CommonDialog1.FileTitle

 

txtQuery.Text = Input(LOF(1), #NumFichero)

 

SalirAbrir:

Close NumFichero

Exit Sub

 

ManipularErrorAbrir:

MsgBox Err.Description

Resume SalirAbrir

 

'CommonDialog1.ShowOpen

End Sub

 

Private Sub archivo_guardar_Click()

On Error GoTo ManipularErrorGuardar

CommonDialog2.CancelError = True

 

CommonDialog2.Filter = "ficheros de texto(*.txt;*.doc)|" & _

                        "todos los archivos (*.*)|*.*"

CommonDialog2.FilterIndex = 1

CommonDialog2.ShowSave

Label1.Caption = CommonDialog2.FileTitle

 

Dim NumFichero As Integer

NumFichero = FreeFile

Open CommonDialog2.FileName For Output As NumFichero

Print #NumFichero, Form1!txtQuery.Text

 

SalirGuardar:

Close NumFichero

Exit Sub

 

ManipularErrorGuardar:

If Err.Number = cdlCancel Then Exit Sub

MsgBox Err.Description

Resume SalirGuardar

End Sub

 

Private Sub CE_Click()

Call form9.dimen_tabce '6

Call form9.limpia_tabce '6

Call form9.Tabla_CE

form9.Show

End Sub

 

Private Sub Command1_Click()

Tabla_errores.Visible = False

Command1.Visible = False

 

End Sub

 

Private Sub Form_Load()

'desactivamos algunos menus

archivo_guardar.Enabled = False

analizar_lex.Enabled = False

analizar_sin.Enabled = False

archivo_imprimir.Enabled = False

Tablas_din.Enabled = False

txtQuery.Visible = False

Label1.Visible = False

Tab_Equi.Enabled = False

 

End Sub

 

Private Sub Form_Unload(Cancel As Integer)

'cuando se descarge el formulario principal cerramos todos los demas

Unload Form2

Unload Form3

Unload Form4

Unload Form5

Unload Form6

Unload Form7

Unload form8

Unload form9

Unload Form10

Unload Form11

Unload Form12

 

End Sub

 

Private Sub men_3_Click()

'llamamos un formulario

Form2.Show

End Sub

 

Private Sub men_4_Click()

 

End Sub

 

Private Sub OP_A_Click()

'llamamos el procedimiento dimen_tab_oparit del form 11

Call Form11.dimen_tab_oparit '6

Call Form11.limpia_tab_oparit '6

Call Form11.Tabla_oparit

Form11.Show

 

End Sub

 

 

Private Sub OP_R_Click()

 

Call Form10.dimen_tabop_rel '7

Call Form10.limpia_tabop_rel '7

Call Form10.Tabla_op_rel

Form10.Show

End Sub

 

Private Sub PR_Click()

Call form8.dimen_tabPR '5

Call form8.limpia_tabPR '5

Call form8.tabla_pr

form8.Show

'Call Form8.tabla_pr

 

End Sub

 

Private Sub Tab_Equi_Click()

Form12.dimen_tabequi

Form12.limpia_tabequi

Form12.Show

End Sub

 

Private Sub Toolbar2_ButtonClick(ByVal Button As MSComctlLib.Button)

 

End Sub

 

'Solo Activar En Proyecto Terminado

 

Private Sub txtQuery_Change()

'EL LEXICO Y EL SINTACTICO EN EL MENU COMO ENABLED

'CUANDO LA CAJA DE TEXTO PRO_FU CAMBIA TENER EL LEXICO ENABLED A TRUE Y EL SINTACTICO

'A FALSE, CUANDO TERMINE DE EJECUTARSE EL LEXICO, TENER EL LEXICO ENABLED A FALSE

'Y EL SINTACTICO A TRUE, CUANDO SE TERMINE DE EJeCUTAR EL SINTACTICO TENERLO AL IGUAL

'QUE EL LEXICO A FALSE

 

 

analizar_lex.Enabled = True

archivo_guardar = True

Tabla_sim.Enabled = False

ID.Enabled = False

Cte_num.Enabled = False

Cte_alf.Enabled = False

Tabla_errores.Visible = False

 

End Sub

 

Private Sub Tabla_sim_Click()

Form4.Visible = True '1

Form4.Show '1

End Sub

 

 

Private Sub ID_Click()

Form5.Visible = True     '2

Form5.Show '2

End Sub

 

Private Sub Cte_num_Click()

Form7.Visible = True '3

Form7.Show '3

End Sub

 

Private Sub Cte_alf_Click()

Form6.Visible = True '4

Form6.Show '4

End Sub

 

Private Sub archivo_nuevo_Click()

'Form8.Show

Label1.Visible = True

Label1.Caption = "[Sin Nombre]"

txtQuery.Text = " "

txtQuery.Visible = True

Tabla_errores.Text = " "

Tabla_errores.Visible = False

 

 

End Sub

 

Private Sub archivo_salir_Click()

End

End Sub

 

 

 

 

 

 

Public Function Tabla_op_rel()

Dim i As Integer

Dim Opera_rel(5) As String

  Opera_rel(0) = ">"

  Opera_rel(1) = "<"

  Opera_rel(2) = "=="

  Opera_rel(3) = ">="

  Opera_rel(4) = "<="

  Opera_rel(5) = "<>"

 

 

   MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

   MSFlexGrid1.TextMatrix(i, 0) = "NUMERO"

   MSFlexGrid1.TextMatrix(i, 1) = "Operador Relacional"

   

For i = 0 To 5

    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

    MSFlexGrid1.TextMatrix(i + 1, 0) = i + 1

    MSFlexGrid1.TextMatrix(i + 1, 1) = Opera_rel(i)

Next i

End Function

 

 

 

 

 

 

 

 

 

Public Sub dimen_tabop_rel()

With MSFlexGrid1

  .ColWidth(0) = 2000

  .ColWidth(1) = 2000

  End With

End Sub

 

Public Sub limpia_tabop_rel()

MSFlexGrid1.Rows = 1

End Sub

 

Private Sub Command1_Click()

form9.WindowState = 0

form9.Visible = False

Form1.Show

End Sub

 

 

Public Function Tabla_oparit()

Dim i As Integer

Dim Opera_arit(3) As String

 

  Opera_arit(0) = "+"

  Opera_arit(1) = "-"

  Opera_arit(2) = "*"

  Opera_arit(3) = "/"

 

 

   MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

   MSFlexGrid1.TextMatrix(i, 0) = "NUMERO"

   MSFlexGrid1.TextMatrix(i, 1) = "Operador Aritmético"

   

For i = 0 To 3

    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

    MSFlexGrid1.TextMatrix(i + 1, 0) = i + 1

    MSFlexGrid1.TextMatrix(i + 1, 1) = Opera_arit(i)

Next i

 

End Function

Public Sub dimen_tab_oparit()

With MSFlexGrid1

  .ColWidth(0) = 2000

  .ColWidth(1) = 2000

  End With

End Sub

 

Public Sub limpia_tab_oparit()

MSFlexGrid1.Rows = 1

End Sub

 

Private Sub Command1_Click()

Form11.WindowState = 0

Form11.Visible = False

Form1.Show

 

End Sub

 

 

Public Sub tabla_equi(token As String, fila_equi As Integer)

 

 If (fila_equi = 0) Then

    MSFlexGrid1.TextMatrix(fila_equi, 0) = "EQUIVALENCIAS"

    fila_equi = fila_ide + 1

 End If

   

 If (fila_equi >= 1) Then

    MSFlexGrid1.TextMatrix(fila_equi, 0) = token

 End If

 

End Sub

Public Sub dimen_tabequi()

With MSFlexGrid1

  .ColWidth(0) = 2000

  End With

End Sub

 

Public Sub limpia_tabequi()

MSFlexGrid1.Rows = 1

End Sub

 

 

 

Private Sub Command1_Click()

 

Form12.WindowState = 0

Form12.Visible = False

Form1.Show

End Sub

 

Public Sub fbb()

 

End Sub

 

Private Sub Command1_Click()

Unload Me

End Sub

 

Public Sub limpia_tabsimb()

MSFlexGrid1.Rows = 1

End Sub

 

Public Sub dimen_tabsimb()

With MSFlexGrid1

  .ColWidth(0) = 1100

  .ColWidth(1) = 1100

  .ColWidth(2) = 1100

  .ColWidth(3) = 1100

  .ColWidth(4) = 1100

  .ColWidth(5) = 1100

 

  End With

End Sub

Private Sub Command1_Click()

Form4.WindowState = 0

Form4.Visible = False

Form1.Show

End Sub

 

 

Public Function tabla_id(token As String, fila_ide As Integer, tipo As String) As Integer

Dim i As Integer

Dim band As Integer

 

  band = 0

  Form1.ID.Enabled = True

 

 If (fila_ide = 0) Then

    MSFlexGrid1.TextMatrix(fila_ide, 0) = "NUMERO"

    MSFlexGrid1.TextMatrix(fila_ide, 1) = "IDENTIFICADOR"

    MSFlexGrid1.TextMatrix(fila_ide, 2) = "TIPO"

    fila_ide = fila_ide + 1

 End If

   

 If (fila_ide >= 1) Then

    For i = 0 To MSFlexGrid1.Rows - 1

      If (token = MSFlexGrid1.TextMatrix(i, 1)) Then

           tabla_id = i

           band = 1

          Exit For

      End If

    Next i

 End If

 

    If (band = 0) Then

      If (fila_ide >= 1) Then

         MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

       End If

      MSFlexGrid1.TextMatrix(fila_ide, 0) = fila_ide

      MSFlexGrid1.TextMatrix(fila_ide, 1) = token

      MSFlexGrid1.TextMatrix(fila_ide, 2) = tipo

      tabla_id = fila_ide

      fila_ide = fila_ide + 1

    End If

End Function

Public Sub dimen_tabID()

With MSFlexGrid1

  .ColWidth(0) = 2000

  .ColWidth(1) = 2000

  .ColWidth(2) = 2000

  End With

End Sub

 

Public Sub limpia_tabid()

MSFlexGrid1.Rows = 1

End Sub

 

 

 

Private Sub Command1_Click()

 

Form5.WindowState = 0

Form5.Visible = False

Form1.Show

End Sub

 

 

 

Public Function tabla_coalf(token As String, fila_coal As Integer) As Integer

Dim i As Integer

Dim band As Integer

 

 

band = 0

Form1.Cte_alf.Enabled = True

      

 If (fila_coal = 0) Then

    Form6.MSFlexGrid1.TextMatrix(fila_coal, 0) = "NUMERO"

    Form6.MSFlexGrid1.TextMatrix(fila_coal, 1) = "CONSTANTE"

    fila_coal = fila_coal + 1

 End If

   

 If (fila_coal >= 1) Then

    For i = 0 To Form6.MSFlexGrid1.Rows - 1

      If (token = Form6.MSFlexGrid1.TextMatrix(i, 1)) Then

           tabla_coalf = i

           band = 1

          Exit For

      End If

    Next i

 End If

 

    If (band = 0) Then

      If (fila_coal >= 1) Then

         Form6.MSFlexGrid1.Rows = Form6.MSFlexGrid1.Rows + 1

       End If

      Form6.MSFlexGrid1.TextMatrix(fila_coal, 0) = fila_coal

      Form6.MSFlexGrid1.TextMatrix(fila_coal, 1) = token

      tabla_coalf = fila_coal

      fila_coal = fila_coal + 1

    End If

End Function

Public Sub dimen_tabcoalf()

With MSFlexGrid1

  .ColWidth(0) = 2000

  .ColWidth(1) = 2000

  End With

End Sub

 

 

Public Sub limpia_tabcoalf()

MSFlexGrid1.Rows = 1

End Sub

 

 

Private Sub Command1_Click()

Form6.WindowState = 0

Form6.Visible = False

 

Form1.Show

End Sub

 

 

 

Public Function tabla_num(token As String, fila_num As Integer) As Integer

Dim i As Integer

Dim band As Integer

 

  band = 0

 

Form1.Cte_num.Enabled = True

  

 If (fila_num = 0) Then

    MSFlexGrid1.TextMatrix(fila_num, 0) = "NUMERO"

    MSFlexGrid1.TextMatrix(fila_num, 1) = "IDENTIFICADOR"

    fila_num = fila_num + 1

 End If

   

 If (fila_num >= 1) Then

    For i = 0 To MSFlexGrid1.Rows - 1

      If (token = MSFlexGrid1.TextMatrix(i, 1)) Then

           tabla_num = i

           band = 1

          Exit For

      End If

    Next i

 End If

 

    If (band = 0) Then

      If (fila_num >= 1) Then

         MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

       End If

      MSFlexGrid1.TextMatrix(fila_num, 0) = fila_num

      MSFlexGrid1.TextMatrix(fila_num, 1) = token

      tabla_num = fila_num

      fila_num = fila_num + 1

    End If

End Function

 

 

Public Sub dimen_tabnum()

With MSFlexGrid1

  .ColWidth(0) = 2000

  .ColWidth(1) = 2000

  End With

End Sub

 

Public Sub limpia_tabnum()

MSFlexGrid1.Rows = 1

End Sub

 

 

Private Sub Command1_Click()

Form7.WindowState = 0

Form7.Visible = False

Form1.Show

End Sub

 

 

 

End With

End Sub

 

Public Sub limpia_tabnum()

MSFlexGrid1.Rows = 1

End Sub

 

 

Private Sub Command1_Click()

Form7.WindowState = 0

Form7.Visible = False

Form1.Show

End Sub

 

 

Public Function tabla_pr()

Dim i As Integer

Dim pal_reser(20) As String

 

 

  pal_reser(0) = "IF"

  pal_reser(1) = "ELSE"

  pal_reser(2) = "ENTERO"

  pal_reser(3) = "REAL"

  pal_reser(4) = "CADENA"

  pal_reser(5) = "CARACTER"

  pal_reser(6) = "RETURN"

  pal_reser(7) = "LOGICO"

  pal_reser(8) = "DO"

  pal_reser(9) = "WHILE"

  pal_reser(10) = "VOID"

  pal_reser(11) = "WRITE"

  pal_reser(12) = "PRINT"

  pal_reser(13) = "READ"

  pal_reser(14) = "INCLUIR"

  pal_reser(15) = "INICIO"

  pal_reser(16) = "FIN"

 

   MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

   MSFlexGrid1.TextMatrix(i, 0) = "NUMERO"

   MSFlexGrid1.TextMatrix(i, 1) = "Palabra Reservada"

   

For i = 0 To 16

    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

    MSFlexGrid1.TextMatrix(i + 1, 0) = i + 1

    MSFlexGrid1.TextMatrix(i + 1, 1) = pal_reser(i)

Next i

End Function

Public Sub dimen_tabPR()

With MSFlexGrid1

  .ColWidth(0) = 2000

  .ColWidth(1) = 2000

  End With

End Sub

 

Public Sub limpia_tabPR()

MSFlexGrid1.Rows = 1

End Sub

 

 

 

 

Private Sub Command1_Click()

form8.WindowState = 0

form8.Visible = False

Form1.Show

End Sub

 

 

 

Public Function Tabla_CE()

Dim i As Integer

Dim Cara_esp(8) As String

 

  Cara_esp(0) = ";"

  Cara_esp(1) = ","

  Cara_esp(2) = """"

  Cara_esp(3) = "{"

  Cara_esp(4) = "}"

  Cara_esp(5) = "."

  Cara_esp(6) = "("

  Cara_esp(7) = ")"

  Cara_esp(8) = "!"

 

 

 

   MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

   MSFlexGrid1.TextMatrix(i, 0) = "NUMERO"

   MSFlexGrid1.TextMatrix(i, 1) = "CARACTER ESPECIAL"

   

For i = 0 To 8

    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

    MSFlexGrid1.TextMatrix(i + 1, 0) = i + 1

    MSFlexGrid1.TextMatrix(i + 1, 1) = Cara_esp(i)

Next i

End Function

Public Sub dimen_tabce()

With MSFlexGrid1

  .ColWidth(0) = 2000

  .ColWidth(1) = 2000

  End With

End Sub

 

Public Sub limpia_tabce()

MSFlexGrid1.Rows = 1

End Sub

 

Private Sub Command1_Click()

form9.WindowState = 0

form9.Visible = False

Form1.Show

End Sub

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

           

CONCLUSION

 

Este programa ha sido realizado para el conocimiento y compresion de el funcionamiento de analizadores tales como el sintactico y el lexico.

Para poder hacer este programa necesitabamos tener conocimiento teorico acerca de este tipo de analizadores.

La verdad para poder realizar este proyecto tuvimos que pasar por muchas cosas,sobre todo porque es muy difcil ponerse de acuerdo cuando se esta trabajando en equipo,pero hicimos todo lo posible para que el proyecto quedara no del todo bien pero que si efectuara las operaciones que nosotros queriamos.

Al principio no nos interesaba saber sobre los analizadores solo queriamos cumplir con la materia y pasar,pero despues de estudiar um poco nos dimos cuenta de que puede ser muy interesante no nada mas este proyecto,sino que nosotros muchas veces hacemos las cosas nada mas por cumplir y no nosa damos cuenta de que podemos tener muchos conocimientos a nuestro alrededor.  

Por ello exortamos a todos los alumnos que realizen trabajos de investigacion que no solo lo hagan por cumplir sino por aprender mas de lo que el maestro les pueda enseñar en el aula de clases.

Gracias por el tiempo que le prestan a nuestro proyecto,nosotros sabemos que les ayudara em mucho.