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>
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.