Estadísticas

Domingo 29 de Octubre de 2006 a las 23:57

Para contar las visitas del sitio estoy utilizando dos sistemas: Statcounter y Google Analytics. Cada uno de los dos tiene sus ventajas y ambos son gratuitos. La ventaja de Statcounter es que se contabilizan las visitas en tiempo real, mientras que para las de Google hay que esperar un día aproximadamente para poder verlas. Las estadísticas de Google son más completas y tienen la ventaja de que se conservan todos los datos indefinidamente mientras que las de Statcounter se guardan algunos datos (los más importantes como el número de visitantes únicos, páginas visualizadas y visitantes que regresan) permanentemente pero de la mayoría solo se guardan los de las 100 últimas visitas.

Desde que estoy contando las visitas con statcounter que es desde el inicio del blog a finales de Julio he tenido 1.784 visitantes únicos y se han visualizado 3.683 páginas. Excluyendo, naturalmente, mis visitas ya que ambos sistemas permiten excluir las visitas provenientes de una determinada dirección I.P.

Los días que publico un nuevo post tengo entre 30 y 50 visitas diferentes aproximadamente y entre 50 y 100 páginas visualizadas. El resto de los días tengo entre 5 y 20 visitas únicas y entre 15 y 40 paginas vistas. Aunque hay algún día que ni llego a esas cifras o excepcionalmente las excedo.

SPAM

Miércoles 25 de Octubre de 2006 a las 23:49

Como no estoy cansado de recibir SPAM en el email ahora lo recibo también en los comentarios de los post del blog. Parece que un robot ha encontrado el blog y le ha gustado.

Espero no haber borrado ningún comentario valido por accidente al borrar los comentarios que son SPAM. Si no es así disculpad el error. Como medida inicial he configurado el wordpress para que no publique directamente ningún comentario que contenga más de un enlace y que tenga yo que autorizarlo manualmente.

Tengo intención de implantar un sistema de captcha para evitar el SPAM, espero que esta sea la solución definitiva al SPAM, aunque conlleva pequeñas molestias para los que quieran escribir un comentario. Si alguno lo usáis ya, por favor, dadme información al respecto.

Un gran día

Martes 24 de Octubre de 2006 a las 23:51

Hoy es un gran día. Por fin, después de echarle muchas horas al interprete del lenguaje de script que he creado, sin que se pudieran palpar resultados visibles, hoy he ejecutado las dos primeras sentencias correctamente. Simplemente ha sido la declaración de una variable y la asignación a esta del resultado de una expresión.

variable numerica j .
j = 1 + 2 * 3 + 4 .

Tras darle al botón ejecutar de la interfaz gráfica, el interprete ha realizado el análisis léxico, el sintáctico, el semántico y al no detectar en ninguna de dichas fases ningún error ha procedido a generar las instrucciones y posteriormente a ejecutarlas. Finalmente la variable j ha recibido el valor 11.

Un segundo script más complicado también ha sido ejecutado correctamente:

escribirEnConsola ( “a” + “b” + numericaACadena ( 3 + 2 ) ) .
variable numerica j .
constante numerica k = 3 .
j = 4 + 7 - 4 * k + 1 .
j = 1 + 2 * j + 4 .
j = 1 + 2 * ( j + 4 ) .
variable logica a .
a = ( 2 < 4 ) y ( 3 != 5 ) .
si a entonces
     j = 4 + 7 - 4 * k + 1 .
sino
     j = 3 .
fin si .
escribirEnConsola ( numericaACadena ( j ) ) .

variable numerica i .
i = 0 .
mientras i < 5 hacer
     escribirEnConsola ( “i = ” + numericaACadena ( i ) ) .
     i = i + 1 .
fin mientras .

Los tiempos consumidos en realizar esta segunda compilación y que devuelve la salida del compilador son los siguientes

Análisis léxico realizado correctamente en 78,125 milisegundos (0,078125 segundos)
Análisis sintáctico realizado correctamente en 140,625 milisegundos (0,140625 segundos)
Análisis semántico realizado correctamente en 15,625 milisegundos (0,015625 segundos)
Compilación realizada correctamente en 234,375 milisegundos (0,234375 segundos)

Y la salida de la consola:

ab5
-2
i = 0
i = 1
i = 2
i = 3
i = 4

El -2 puede extrañar a simple vista. Pese a lo que pudiera parecer el resultado es correcto, la cuestión es que se ha definido la asociatividad por la derecha en vez de por la izquierda.

Desarrollos para MSX

Lunes 23 de Octubre de 2006 a las 23:59

Hoy en día se sigue desarrollando para MSX, aquel ordenador con el que tanto disfrute. Existe incluso un concurso internacional de desarrollo para dicha plataforma.
Me parece interesante que se siga desarrollando para una plataforma tan antigua.

La empresa española nerlaska también esta desarrollando en la actualidad un par de videojuegos para MSX, que presentará en el msxdev’06.

Más información en castellano sobre el concurso: http://es.msx.org/MSXdev06.newspost3667.html

Estado del proyecto a 22/10/2006

Domingo 22 de Octubre de 2006 a las 23:58

He realizado los siguientes avances en el proyecto:

He incorporado al script la posibilidad de que un operando de una expresión (y por lo tanto un parámetro de una función ya que los parámetros son expresiones) sea una función. Que a su vez podría tener como parámetros otras funciones y expresiones, y así indefinidamente.

He creado el generador de instrucciones que a partir del árbol semántico genera las instrucciones que serán ejecutadas por el “Motor en tiempo de ejecución”.

También e incorporado varias funciones al motor que serán accesibles desde cualquier script, como funciones para convertir datos de unos tipos a otros, escribir en consola, etc.

Voy a dejar abierto el módulo de los scripts para que puedan ser utilizados independientemente del proyecto por otras aplicaciones y que estas puedan exponer sus propias funciones para hacerlas accesibles desde un script.

Terminé la aplicación de gestión

Sábado 21 de Octubre de 2006 a las 0:56

Por fin terminé la aplicación de gestión que he estado realizando estos últimos días. He tardado más horas de las que había previsto en un principio (esto suele ser normal en los desarrollos) y le he podido echar al día menos horas de las que esperaba. Es muy triste constatar el poco tiempo libre del que disponemos a diario.

Ahora ya me podré poner con el motor de aventuras gráficas. Ya tenía mono de programar cosas interesantes :-)

Aplicación de gestión

Domingo 8 de Octubre de 2006 a las 23:58

Últimamente tengo muy abandonado el blog, hace más de una semana que no escribo nada. Ahora mismo estoy liado con una aplicación de gestión que estoy realizando por encargo en mis ratos libres. Ya la tengo bastante avanzada y espero terminarla antes del puente de Octubre. Estoy deseando terminarla para ponerme de nuevo con el motor de aventuras gráficas.

El desarrollo de aplicaciones de gestión es tremendamente aburrido, es una tarea realmente monótona. Apenas requiere hacer uso del cerebro y supongo que se podría llegar a entrenar a chimpancés para que hicieran este tipo de aplicaciones.
Es tan sencillo y monótono que se puede automatizar el desarrollo de gran parte de las aplicaciones. He desarrollado varios generadores de aplicaciones que crean el 80% del código, incluyendo los procedimientos almacenados. La creación de un generador de aplicaciones es una labor bastante interesante.

Creando un analizador semántico

Viernes 29 de Septiembre de 2006 a las 0:52

Entre las funciones de un analizador semántico están las siguientes:

  • Detectar si las variables, constantes y funciones han sido declaradas antes de ser utilizadas.
  • Verificar que las variables, constantes y funciones sean accesibles (visibilidad) desde el ámbito en que son utilizadas.
  • Comprobar que los diferentes identificadores solo hayan sido declarados una vez.
  • Comprobaciones de tipos al evaluar las expresiones. Por ejemplo que no se multiplique un número por una cadena o que la expresión a evaluar en un IF sea del tipo booleano.
  • Verificar que no se intente modificar el valor de una constante.
  • Generar la tabla de símbolos.

El lenguaje de script que estoy desarrollando de momento solo tendrá un ámbito, por lo que no será necesaria la comprobación del ámbito.

Para realizar el análisis semántico utilizaremos una gramática de atributos. Dichos atributos se asociaran tanto a los símbolos terminales como a los no terminales y se propagarán por el árbol sintáctico desde abajo hacia arriba, dando lugar al árbol semántico.
Lo primero que haremos será definir las reglas semánticas, para ello utilizaremos de nuevo la notición BNF a la que añadiremos en pseudocódigo las reglas semánticas.

A continuación se detallan aquellas producciones que constan de reglas semánticas:


10 <DeclaracionVariable> ::= Variable <Tipo> Identificador
	InsertarSimbolo (Variable, Identificador, <Tipo>.Tipo)
11 <Tipo> ::= Numerica
	<Tipo>.Tipo  = Numerica
12 <Tipo> ::= Cadena
	<Tipo>.Tipo  = Cadena
13 <Tipo> ::= Logica
	<Tipo>.Tipo  = Logica
14 <DeclaracionConstante> ::= Constante <Resto_Constante>
	InsertarSimbolo (Constante, Identificador, < Resto_Constante >.Tipo)
18 <Condicional> ::= Si <Expresion> Entonces <Sentencias>  <Resto_Condicional>
	Si <Expresion>.Tipo <> Logica
		Error
21 <Bucle> ::= Mientras <Expresion> Hacer <Sentencias> Fin Mientras
	Si <Expresion>.Tipo <> Logica
		Error
22 <Asignacion_O_LlamadaAMetodo> ::= Identificador <Resto_Asignacion_O_LlamadaAMetodo> 

	Si No Existe (Identificador)
		Error
	Si hijo(1).produccion = 23
		Si es una variable
			Si tipo(identificado) <> hijo(1).tipo
				error
		sino
			Error
	Si hijo(1).produccion = 24
		Recorrer parametros y comprobar que el numero y el tipo de parámetros coincide
23 <Resto_Asignacion_O_LlamadaAMetodo> ::= = <Expresion>
	<Resto_Asignacion_O_LlamadaAMetodo>.Tipo = <Expresion>.Tipo
24 <Resto_Asignacion_O_LlamadaAMetodo> ::= <Parametros>
30 <Expresion> ::= <ExpresionSimple> <Resto_Expresion>
	Si <Resto_Expresion> SeAnula
		<Expresion>.Tipo = <ExpresionSimple>.Tipo
	Sino
		Si <ExpresionSimple>  = <Resto_Expresion>.Tipo
			<Expresion>.Tipo = Logica
		Sino
			Error
31 <Resto_Expresion> ::= <OperadorRelacional> <ExpresionSimple>
	<Resto_Expresion>.Tipo = <ExpresionSimple>.Tipo
32 <Resto_Expresion> ::= ε
39 <ExpresionSimple> ::= <Termino> <Resto_ExpresionSimple>
	Si <Resto_ExpresionSimple>  se anula
		<ExpresionSimple>.Tipo = <Termino>.Tipo
	Sino
		Si <Termino>.Tipo = <Resto_ExpresionSimple>.Tipo
			<ExpresionSimple>.Tipo = <Termino>.Tipo
		Si no
			Error
40 <Resto_ExpresionSimple> ::= <OperadorAditivo> <ExpresionSimple>
	Si <OperadorAditivo> = +
		Si <ExpresionSimple>.Tipo  = Numerica Or <ExpresionSimple>.Tipo = Cadena
			<Resto_ExpresionSimple>.Tipo = <ExpresionSimple>.Tipo
		Sino
			Error
	Si <OperadorAditivo> = -
		Si <ExpresionSimple>.Tipo  = Numerica
			<Resto_ExpresionSimple>.Tipo = <ExpresionSimple>.Tipo
		Sino
			Error
	Si <OperadorAditivo> = O
		Si <ExpresionSimple>.Tipo  = Logica
			<Resto_ExpresionSimple>.Tipo = Logica
		Sino
			Error
41 <Resto_ExpresionSimple> ::= ε
45 <Termino> ::= <Operando> <Resto_Termino>
	Si <Resto_Termino> se anula
		<Termino>.Tipo = <Operando>.Tipo
	Sino
		Si <Operando>.Tipo = <Resto_Termino>.Tipo
			<Termino>.Tipo = <Operando>.Tipo
		Si no
			Error
46 <Resto_Termino> ::= <OperadorMultiplicacion> <Termino>
	Si <OperadorMultiplicacion> = *  Or <OperadorMultiplicacion> = /
		Si <Termino>.Tipo  = Numerica
			<Resto_Termino>.Tipo = Numerica
		Sino
			Error
	Si <OperadorMultiplicacion> = Y
		Si <Termino>.Tipo  = Logica
			<Resto_Termino>.Tipo = Logica
		Sino
			Error
47 <Resto_Termino> ::= ε
51 <Operando> ::= Identificador
	Si Existe(Identificado)
		<Operando>.Tipo = Tipo (Identificador)
	Sino
		Error
52 <Operando> ::= Cte_Numerica
	<Operando>.Tipo = Numerico
53 <Operando> ::= Cte_Cadena
	<Operando>.Tipo = Cadena
54 <Operando> ::= Cte_Logica
	<Operando>.Tipo = Logica
55 <Operando> ::= ( <Expresion> )
	<Operando>.Tipo = Tipo(<Expresion>)

Recorreremos recursivamente el árbol sintáctico en postorden (para cada nodo procesamos recursivamente todos los descendientes primero y luego el nodo). Iremos añadiendo atributos con información al árbol a medida que procesemos nodos. Como el recorrido se realiza en postorden cuando procesemos un nodo ya habremos procesado previamente todos sus descendientes por lo que dispondremos de la información de que nos provean sus atributos.

Añadiremos a la tabla de símbolos todas las constantes y variables que se vayan reconociendo, junto con la información del tipo y el valor (en el caso des la constantes)

La tabla de símbolos será una lista de elementos del tipo símbolo:

VB.NET:
  1. ''' <summary>
  2. ''' Es un simbolo de la tabla de simbolos. Se utiliza en el analizador léxico
  3. ''' </summary>
  4. ''' <remarks></remarks>
  5. Public Class Simbolo
  6.  
  7.     Public Enum ClaseSimbolo
  8.         Variable
  9.         Constante
  10.         Funcion
  11.     End Enum
  12.  
  13.     Private _nombre As String
  14.  
  15.     ''' <summary>
  16.     ''' El nombre del simbolo. Por ejemplo el nombre de una variable tal y como se declara
  17.     ''' </summary>
  18.     ''' <value></value>
  19.     ''' <returns></returns>
  20.     ''' <remarks></remarks>
  21.     Public Property Nombre() As String
  22.         Get
  23.             Return _nombre
  24.         End Get
  25.         Set(ByVal value As String)
  26.             _nombre = value
  27.         End Set
  28.     End Property
  29.  
  30.     Private _clase As ClaseSimbolo
  31.  
  32.     ''' <summary>
  33.     ''' Indica que clase de simbolo es: variable, constante o función
  34.     ''' </summary>
  35.     ''' <value></value>
  36.     ''' <returns></returns>
  37.     ''' <remarks></remarks>
  38.     Public Property Clase() As ClaseSimbolo
  39.         Get
  40.             Return _clase
  41.         End Get
  42.         Set(ByVal value As ClaseSimbolo)
  43.             _clase = value
  44.         End Set
  45.     End Property
  46.  
  47.     Private _tipo As String
  48.  
  49.     ''' <summary>
  50.     ''' Representa el tipo del simbolo: numerica, cadena o logica
  51.     ''' </summary>
  52.     ''' <value></value>
  53.     ''' <returns></returns>
  54.     ''' <remarks></remarks>
  55.     Public Property Tipo() As String
  56.         Get
  57.             Return _tipo
  58.         End Get
  59.         Set(ByVal value As String)
  60.             _tipo = value
  61.         End Set
  62.     End Property
  63.  
  64.     Private _valor As String
  65.  
  66.     ''' <summary>
  67.     ''' Valor del simbolo. Unicamente utilizado por las constantes
  68.     ''' </summary>
  69.     ''' <value></value>
  70.     ''' <returns></returns>
  71.     ''' <remarks></remarks>
  72.     Public Property Valor() As String
  73.         Get
  74.             Return _valor
  75.         End Get
  76.         Set(ByVal value As String)
  77.             _valor = value
  78.         End Set
  79.     End Property
  80.  
  81.     Private _tiposDeLosArgumentos As New List(Of String)
  82.  
  83.     ''' <summary>
  84.     ''' Solo utilizada por los simbolos de tipo función. Es una lista con los tipos de los
  85.     ''' argumentos de la función.
  86.     ''' </summary>
  87.     ''' <value></value>
  88.     ''' <returns></returns>
  89.     ''' <remarks></remarks>
  90.     Public ReadOnly Property TiposDeLosArgumentos() As List(Of String)
  91.         Get
  92.             Return _tiposDeLosArgumentos
  93.         End Get
  94.     End Property
  95.  
  96. End Class

El siguiente script tras pasar por el analizador semántico genera este árbol semántico:

variable numerica j .
j = 1 + 2 * j + 4 .

 


<Elemento Nombre="<SCRIPT>" Produccion="1">
    <Elemento Nombre="<SENTENCIAS>" Produccion="2">
        <Elemento Nombre="<SENTENCIA>" Produccion="5">
            <Elemento Nombre="<DECLARACIONVARIABLE>" Produccion="10">
                <Elemento Nombre="VARIABLE" Palabra="variable" Linea="1" Col="1"></Elemento>
                <Elemento Nombre="<TIPO>" Produccion="11" Tipo="NUMERICA">
                    <Elemento Nombre="NUMERICA" Palabra="numerica" Linea="1" Col="10"></Elemento>
                </Elemento>
                <Elemento Nombre="IDENTIFICADOR" Palabra="j" Linea="1" Col="19"></Elemento>
            </Elemento>
        </Elemento>
        <Elemento Nombre="." Palabra="." Linea="1" Col="21"></Elemento>
        <Elemento Nombre="<RESTO_SENTENCIAS>" Produccion="3">
            <Elemento Nombre="<SENTENCIAS>" Produccion="2">
                <Elemento Nombre="<SENTENCIA>" Produccion="7">
                    <Elemento Nombre="<ASIGNACION_O_LLAMADAAMETODO>" Produccion="22">
                        <Elemento Nombre="IDENTIFICADOR" Palabra="j" Linea="2" Col="1"></Elemento>
                        <Elemento Nombre="<RESTO_ASIGNACION_O_LLAMADAAMETODO>" Produccion="23" Tipo="NUMERICA">
                            <Elemento Nombre="=" Palabra="=" Linea="2" Col="3"></Elemento>
                            <Elemento Nombre="<EXPRESION>" Produccion="30" Tipo="NUMERICA">
                                <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                                    <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                        <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                            <Elemento Nombre="CTE_NUMERICA" Palabra="1" Linea="2" Col="5"></Elemento>
                                        </Elemento>
                                        <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                    </Elemento>
                                    <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="40" Tipo="NUMERICA">
                                        <Elemento Nombre="<OPERADORADITIVO>" Produccion="42">
                                            <Elemento Nombre="+" Palabra="+" Linea="2" Col="7"></Elemento>
                                        </Elemento>
                                        <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                                            <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                                <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                                    <Elemento Nombre="CTE_NUMERICA" Palabra="2" Linea="2" Col="9"></Elemento>
                                                </Elemento>
                                                <Elemento Nombre="<RESTO_TERMINO>" Produccion="46" Tipo="NUMERICA">
                                                    <Elemento Nombre="<OPERADORMULTIPLICACION>" Produccion="48">
                                                        <Elemento Nombre="*" Palabra="*" Linea="2" Col="11"></Elemento>
                                                    </Elemento>
                                                    <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                                        <Elemento Nombre="<OPERANDO>" Produccion="51" Tipo="NUMERICA">
                                                            <Elemento Nombre="IDENTIFICADOR" Palabra="j" Linea="2" Col="13"></Elemento>
                                                        </Elemento>
                                                        <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                                    </Elemento>
                                                </Elemento>
                                            </Elemento>
                                            <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="40" Tipo="NUMERICA">
                                                <Elemento Nombre="<OPERADORADITIVO>" Produccion="42">
                                                    <Elemento Nombre="+" Palabra="+" Linea="2" Col="15"></Elemento>
                                                </Elemento>
                                                <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                                                    <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                                        <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                                            <Elemento Nombre="CTE_NUMERICA" Palabra="4" Linea="2" Col="17"></Elemento>
                                                        </Elemento>
                                                        <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                                    </Elemento>
                                                    <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="41"></Elemento>
                                                </Elemento>
                                            </Elemento>
                                        </Elemento>
                                    </Elemento>
                                </Elemento>
                                <Elemento Nombre="<RESTO_EXPRESION>" Produccion="32"></Elemento>
                            </Elemento>
                        </Elemento>
                    </Elemento>
                </Elemento>
                <Elemento Nombre="." Palabra="." Linea="2" Col="19"></Elemento>
                <Elemento Nombre="<RESTO_SENTENCIAS>" Produccion="4"></Elemento>
            </Elemento>
        </Elemento>
    </Elemento>
    <Elemento Nombre="FIN_FICHERO" Palabra="FIN_SCRIPT" Linea="3" Col="1"></Elemento>
</Elemento

Ejemplos de errores detectados por el analizador semántico, mostrandose primero el script y a continuación el error detectado:

j = 1 + 2 * j + 4 .
ERROR: Identificador no declarado: j en línea 1 Columna 13

variable numerica j .
j = 1 + verdadero .
ERROR: Se esperaba un valor de tipo numérico o cadena tras el operador: + en la línea 2 Columna 7

si "a" = 3 entonces
   j = 4 .
fin si .
ERROR: No es posible realizar la comparación ya que los dos operandos son de tipos distintos. Línea 1 Columna 8

Estado del proyecto a 25/09/2006

Domingo 24 de Septiembre de 2006 a las 23:57

He finalizado el analizador semántico por lo que ya están terminados los tres analizadores (léxico, sintáctico y semántico).

El lenguaje de momento no contempla ámbitos para las variables ni tampoco arrays. Ambas características espero implementarlas en un futuro.

Lo próximo que desarrollaré será el generador de instrucciones, que creará las instrucciones a partir del árbol generado por el analizador semántico y el "tiempo de ejecución". Implementaré también algunas funciones del motor que pueden ser llamadas desde el script, como por ejemplo la escritura en fichero de log y por consola, que me será útil para depurar scripts. Cuando el motor esté más avanzado incluiré nuevas funciones para que puedan ser llamadas desde los scripts.

Durante unos cuantos días no podré dedicarle tiempo al proyecto, por lo que sufrirá un pequeño parón o ralentización temporal. Esto se debe a que me ha surgido un pequeño encargo profesional que tendré que realizar en el poco tiempo libre de que dispongo y que dedicaba al proyecto.

A lo largo de esta semana publicaré un par de artículos sobre el desarrollo del analizador semántico.

Analizador sintáctico (Parte II)

Viernes 22 de Septiembre de 2006 a las 23:58

Este artículo es la continuación de:

Analizador sintáctico (Parte I)

Tras comprobar que cumple la condición LL(1) pasamos a codificar el analizador sintáctico. Para automatizar el reconocimiento de los diferentes elementos creamos la clase producción que encapsulará la información de cada una de las producciones que definimos mediante la notación BNF:

VB.NET:
  1. Public Class Produccion
  2.  
  3.     Dim _parteIzquierda As String
  4.  
  5.     Public ReadOnly Property ParteIzquierda() As String
  6.         Get
  7.             Return _parteIzquierda
  8.         End Get
  9.     End Property
  10.  
  11.     Dim _parteDerecha() As String
  12.  
  13.     Public ReadOnly Property ParteDerecha() As String()
  14.         Get
  15.             Return _parteDerecha
  16.         End Get
  17.     End Property
  18.  
  19.     Dim _simbolosDirectores() As String
  20.  
  21.     Public ReadOnly Property SimbolosDirectores() As String()
  22.         Get
  23.             Return _simbolosDirectores
  24.         End Get
  25.     End Property
  26.  
  27.     Public Sub New(ByVal pParteIzquierda As String, ByVal pParteDerecha As String(), ByVal pSimbolosDirectores() As String)
  28.         _parteIzquierda = pParteIzquierda
  29.         _parteDerecha = pParteDerecha
  30.         _simbolosDirectores = pSimbolosDirectores
  31.     End Sub
  32.  
  33. End Class

El algoritmo del analizador sintáctico es bastante sencillo. Consiste básicamente en ir leyendo las palabras que recibimos del analizador léxico ver si van encajando en un orden valido para el lenguaje. Para ello utilizaremos una pila en la que inicialmente apilaremos el símbolo no terminal que da origen a cualquier secuencia valida, es decir el símbolo <SCRIPT> y leemos la primera palabra que nos ha proporcionado el analizador léxico, esta palabra será el símbolo por adelantado o S.A.

Después realizaremos un bucle del que saldremos cuando se produzca un error o se vacíe la pila y no queden más símbolos por leer de los que nos facilitó el analizador léxico.

Dentro del bucle evaluaremos el símbolo existente en la cima de la pila, si es un símbolo terminal entonces se pueden dar dos casos, que coincida con el símbolo por adelantado que hemos leído en cuyo caso ese símbolo se presenta en un orden correcto y procederemos a desapilar el elemento de la pila y a leer un nuevo S.A. (el siguiente de los entregados por el analizador léxico). En el caso de que no coincidan entonces la palabra no encaja en ninguna secuencia correcta y se trataría de un error sintáctico. Si el símbolo de la cima de la pila es un no terminal buscaremos si existe alguna producción que tenga por parte izquierda ese no terminal y por uno de sus símbolos directores el S.A. Si no existe ninguna producción estaremos ante un error sintáctico y si existe aplicamos la producción, lo cual consiste en desapilar la cima de la pila y apilar todos los elementos de la parte derecha de la producción empezando por el ultimo elemento para que quede el primer elemento en la dima de la pila. Además se añadirán dichos elementos de la parte derecha de la producción en el árbol sintáctico. En este punto finaliza el bucle.

El siguiente script:

variable numerica j .
constante numerica k = 3 .
j = 4 + 7 - 4 * k + 1 .
k = 2 > 4 + 1 .
si X = 3 entonces
j = 4 + 7 - 4 * k + 1 .
fin si .

Producirá las siguientes salidas:


	Aplicada producción: <SCRIPT> ::= <SENTENCIAS> FIN_FICHERO                               S.A. = VARIABLE
	Aplicada producción: <SENTENCIAS> ::= <SENTENCIA> . <RESTO_SENTENCIAS>                               S.A. = VARIABLE
	Aplicada producción: <SENTENCIA> ::= <DECLARACIONVARIABLE>                               S.A. = VARIABLE
	Aplicada producción: <DECLARACIONVARIABLE> ::= VARIABLE <TIPO> IDENTIFICADOR                               S.A. = VARIABLE
Reconocido: VARIABLE
	Aplicada producción: <TIPO> ::= NUMERICA                               S.A. = NUMERICA
Reconocido: NUMERICA
Reconocido: IDENTIFICADOR
Reconocido: .
	Aplicada producción: <RESTO_SENTENCIAS> ::= <SENTENCIAS>                               S.A. = CONSTANTE
	Aplicada producción: <SENTENCIAS> ::= <SENTENCIA> . <RESTO_SENTENCIAS>                               S.A. = CONSTANTE
	Aplicada producción: <SENTENCIA> ::= <DECLARACIONCONSTANTE>                               S.A. = CONSTANTE
	Aplicada producción: <DECLARACIONCONSTANTE> ::= CONSTANTE <RESTO_CONSTANTE>                               S.A. = CONSTANTE
Reconocido: CONSTANTE
	Aplicada producción: <RESTO_CONSTANTE> ::= NUMERICA IDENTIFICADOR = CTE_NUMERICA                               S.A. = NUMERICA
Reconocido: NUMERICA
Reconocido: IDENTIFICADOR
Reconocido: =
Reconocido: CTE_NUMERICA
Reconocido: .
	Aplicada producción: <RESTO_SENTENCIAS> ::= <SENTENCIAS>                               S.A. = IDENTIFICADOR
	Aplicada producción: <SENTENCIAS> ::= <SENTENCIA> . <RESTO_SENTENCIAS>                               S.A. = IDENTIFICADOR
	Aplicada producción: <SENTENCIA> ::= <ASIGNACION_O_LLAMADAAMETODO>                               S.A. = IDENTIFICADOR
	Aplicada producción: <ASIGNACION_O_LLAMADAAMETODO> ::= IDENTIFICADOR <RESTO_ASIGNACION_O_LLAMADAAMETODO>                               S.A. = IDENTIFICADOR
Reconocido: IDENTIFICADOR
	Aplicada producción: <RESTO_ASIGNACION_O_LLAMADAAMETODO> ::= = <EXPRESION>                               S.A. = =
Reconocido: =
	Aplicada producción: <EXPRESION> ::= <EXPRESIONSIMPLE> <RESTO_EXPRESION>                               S.A. = CTE_NUMERICA
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = +
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= <OPERADORADITIVO> <EXPRESIONSIMPLE>                               S.A. = +
	Aplicada producción: <OPERADORADITIVO> ::= +                               S.A. = +
Reconocido: +
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = -
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= <OPERADORADITIVO> <EXPRESIONSIMPLE>                               S.A. = -
	Aplicada producción: <OPERADORADITIVO> ::= -                               S.A. = -
Reconocido: -
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= <OPERADORMULTIPLICACION> <TERMINO>                               S.A. = *
	Aplicada producción: <OPERADORMULTIPLICACION> ::= *                               S.A. = *
Reconocido: *
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = IDENTIFICADOR
	Aplicada producción: <OPERANDO> ::= IDENTIFICADOR                               S.A. = IDENTIFICADOR
Reconocido: IDENTIFICADOR
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = +
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= <OPERADORADITIVO> <EXPRESIONSIMPLE>                               S.A. = +
	Aplicada producción: <OPERADORADITIVO> ::= +                               S.A. = +
Reconocido: +
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = .
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= _VACIO_                               S.A. = .
	Aplicada producción: <RESTO_EXPRESION> ::= _VACIO_                               S.A. = .
Reconocido: .
	Aplicada producción: <RESTO_SENTENCIAS> ::= <SENTENCIAS>                               S.A. = IDENTIFICADOR
	Aplicada producción: <SENTENCIAS> ::= <SENTENCIA> . <RESTO_SENTENCIAS>                               S.A. = IDENTIFICADOR
	Aplicada producción: <SENTENCIA> ::= <ASIGNACION_O_LLAMADAAMETODO>                               S.A. = IDENTIFICADOR
	Aplicada producción: <ASIGNACION_O_LLAMADAAMETODO> ::= IDENTIFICADOR <RESTO_ASIGNACION_O_LLAMADAAMETODO>                               S.A. = IDENTIFICADOR
Reconocido: IDENTIFICADOR
	Aplicada producción: <RESTO_ASIGNACION_O_LLAMADAAMETODO> ::= = <EXPRESION>                               S.A. = =
Reconocido: =
	Aplicada producción: <EXPRESION> ::= <EXPRESIONSIMPLE> <RESTO_EXPRESION>                               S.A. = CTE_NUMERICA
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = >
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= _VACIO_                               S.A. = >
	Aplicada producción: <RESTO_EXPRESION> ::= <OPERADORRELACIONAL> <EXPRESIONSIMPLE>                               S.A. = >
	Aplicada producción: <OPERADORRELACIONAL> ::= >                               S.A. = >
Reconocido: >
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = +
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= <OPERADORADITIVO> <EXPRESIONSIMPLE>                               S.A. = +
	Aplicada producción: <OPERADORADITIVO> ::= +                               S.A. = +
Reconocido: +
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = .
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= _VACIO_                               S.A. = .
Reconocido: .
	Aplicada producción: <RESTO_SENTENCIAS> ::= <SENTENCIAS>                               S.A. = SI
	Aplicada producción: <SENTENCIAS> ::= <SENTENCIA> . <RESTO_SENTENCIAS>                               S.A. = SI
	Aplicada producción: <SENTENCIA> ::= <CONDICIONAL>                               S.A. = SI
	Aplicada producción: <CONDICIONAL> ::= SI <EXPRESION> ENTONCES <SENTENCIAS> <RESTO_CONDICIONAL>                               S.A. = SI
Reconocido: SI
	Aplicada producción: <EXPRESION> ::= <EXPRESIONSIMPLE> <RESTO_EXPRESION>                               S.A. = IDENTIFICADOR
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = IDENTIFICADOR
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = IDENTIFICADOR
	Aplicada producción: <OPERANDO> ::= IDENTIFICADOR                               S.A. = IDENTIFICADOR
Reconocido: IDENTIFICADOR
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = =
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= _VACIO_                               S.A. = =
	Aplicada producción: <RESTO_EXPRESION> ::= <OPERADORRELACIONAL> <EXPRESIONSIMPLE>                               S.A. = =
	Aplicada producción: <OPERADORRELACIONAL> ::= =                               S.A. = =
Reconocido: =
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = ENTONCES
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= _VACIO_                               S.A. = ENTONCES
Reconocido: ENTONCES
	Aplicada producción: <SENTENCIAS> ::= <SENTENCIA> . <RESTO_SENTENCIAS>                               S.A. = IDENTIFICADOR
	Aplicada producción: <SENTENCIA> ::= <ASIGNACION_O_LLAMADAAMETODO>                               S.A. = IDENTIFICADOR
	Aplicada producción: <ASIGNACION_O_LLAMADAAMETODO> ::= IDENTIFICADOR <RESTO_ASIGNACION_O_LLAMADAAMETODO>                               S.A. = IDENTIFICADOR
Reconocido: IDENTIFICADOR
	Aplicada producción: <RESTO_ASIGNACION_O_LLAMADAAMETODO> ::= = <EXPRESION>                               S.A. = =
Reconocido: =
	Aplicada producción: <EXPRESION> ::= <EXPRESIONSIMPLE> <RESTO_EXPRESION>                               S.A. = CTE_NUMERICA
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = +
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= <OPERADORADITIVO> <EXPRESIONSIMPLE>                               S.A. = +
	Aplicada producción: <OPERADORADITIVO> ::= +                               S.A. = +
Reconocido: +
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = -
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= <OPERADORADITIVO> <EXPRESIONSIMPLE>                               S.A. = -
	Aplicada producción: <OPERADORADITIVO> ::= -                               S.A. = -
Reconocido: -
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= <OPERADORMULTIPLICACION> <TERMINO>                               S.A. = *
	Aplicada producción: <OPERADORMULTIPLICACION> ::= *                               S.A. = *
Reconocido: *
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = IDENTIFICADOR
	Aplicada producción: <OPERANDO> ::= IDENTIFICADOR                               S.A. = IDENTIFICADOR
Reconocido: IDENTIFICADOR
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = +
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= <OPERADORADITIVO> <EXPRESIONSIMPLE>                               S.A. = +
	Aplicada producción: <OPERADORADITIVO> ::= +                               S.A. = +
Reconocido: +
	Aplicada producción: <EXPRESIONSIMPLE> ::= <TERMINO> <RESTO_EXPRESIONSIMPLE>                               S.A. = CTE_NUMERICA
	Aplicada producción: <TERMINO> ::= <OPERANDO> <RESTO_TERMINO>                               S.A. = CTE_NUMERICA
	Aplicada producción: <OPERANDO> ::= CTE_NUMERICA                               S.A. = CTE_NUMERICA
Reconocido: CTE_NUMERICA
	Aplicada producción: <RESTO_TERMINO> ::= _VACIO_                               S.A. = .
	Aplicada producción: <RESTO_EXPRESIONSIMPLE> ::= _VACIO_                               S.A. = .
	Aplicada producción: <RESTO_EXPRESION> ::= _VACIO_                               S.A. = .
Reconocido: .
	Aplicada producción: <RESTO_SENTENCIAS> ::= _VACIO_                               S.A. = FIN
	Aplicada producción: <RESTO_CONDICIONAL> ::= FIN SI                               S.A. = FIN
Reconocido: FIN
Reconocido: SI
Reconocido: .
	Aplicada producción: <RESTO_SENTENCIAS> ::= _VACIO_                               S.A. = FIN_FICHERO
Reconocido: FIN_FICHERO

 

Y el siguiente árbol sintáctico:

 


<Elemento Nombre="<SCRIPT>" Produccion="1">
  <Elemento Nombre="<SENTENCIAS>" Produccion="2">
    <Elemento Nombre="<SENTENCIA>" Produccion="7">
      <Elemento Nombre="<ASIGNACION_O_LLAMADAAMETODO>" Produccion="22">
        <Elemento Nombre="IDENTIFICADOR" Palabra="miFuncion" Linea="1" Col="1"></Elemento>
        <Elemento Nombre="<RESTO_ASIGNACION_O_LLAMADAAMETODO>" Produccion="24">
          <Elemento Nombre="<PARAMETROS>" Produccion="26"></Elemento>
        </Elemento>
      </Elemento>
    </Elemento>
    <Elemento Nombre="." Palabra="." Linea="1" Col="11"></Elemento>
    <Elemento Nombre="<RESTO_SENTENCIAS>" Produccion="3">
      <Elemento Nombre="<SENTENCIAS>" Produccion="2">
        <Elemento Nombre="<SENTENCIA>" Produccion="7">
          <Elemento Nombre="<ASIGNACION_O_LLAMADAAMETODO>" Produccion="22">
            <Elemento Nombre="IDENTIFICADOR" Palabra="miFuncion" Linea="2" Col="1"></Elemento>
            <Elemento Nombre="<RESTO_ASIGNACION_O_LLAMADAAMETODO>" Produccion="24">
              <Elemento Nombre="<PARAMETROS>" Produccion="25">
                <Elemento Nombre="<UNOOMASPARAMETROS>" Produccion="27">
                  <Elemento Nombre="<EXPRESION>" Produccion="30" Tipo="NUMERICA">
                    <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                      <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                        <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                          <Elemento Nombre="CTE_NUMERICA" Palabra="1" Linea="2" Col="11"></Elemento>
                        </Elemento>
                        <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                      </Elemento>
                      <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="41"></Elemento>
                    </Elemento>
                    <Elemento Nombre="<RESTO_EXPRESION>" Produccion="32"></Elemento>
                  </Elemento>
                  <Elemento Nombre="<RESTO_UNOOMASPARAMETROS>" Produccion="28">
                    <Elemento Nombre="," Palabra="," Linea="2" Col="13"></Elemento>
                    <Elemento Nombre="<UNOOMASPARAMETROS>" Produccion="27">
                      <Elemento Nombre="<EXPRESION>" Produccion="30" Tipo="CADENA">
                        <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="CADENA">
                          <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="CADENA">
                            <Elemento Nombre="<OPERANDO>" Produccion="53" Tipo="CADENA">
                              <Elemento Nombre="CTE_CADENA" Palabra=""a"" Linea="2" Col="15"></Elemento>
                            </Elemento>
                            <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                          </Elemento>
                          <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="41"></Elemento>
                        </Elemento>
                        <Elemento Nombre="<RESTO_EXPRESION>" Produccion="32"></Elemento>
                      </Elemento>
                      <Elemento Nombre="<RESTO_UNOOMASPARAMETROS>" Produccion="28">
                        <Elemento Nombre="," Palabra="," Linea="2" Col="19"></Elemento>
                        <Elemento Nombre="<UNOOMASPARAMETROS>" Produccion="27">
                          <Elemento Nombre="<EXPRESION>" Produccion="30" Tipo="NUMERICA">
                            <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                              <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                  <Elemento Nombre="CTE_NUMERICA" Palabra="2" Linea="2" Col="21"></Elemento>
                                </Elemento>
                                <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                              </Elemento>
                              <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="41"></Elemento>
                            </Elemento>
                            <Elemento Nombre="<RESTO_EXPRESION>" Produccion="32"></Elemento>
                          </Elemento>
                          <Elemento Nombre="<RESTO_UNOOMASPARAMETROS>" Produccion="28">
                            <Elemento Nombre="," Palabra="," Linea="2" Col="23"></Elemento>
                            <Elemento Nombre="<UNOOMASPARAMETROS>" Produccion="27">
                              <Elemento Nombre="<EXPRESION>" Produccion="30" Tipo="CADENA">
                                <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="CADENA">
                                  <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="CADENA">
                                    <Elemento Nombre="<OPERANDO>" Produccion="53" Tipo="CADENA">
                                      <Elemento Nombre="CTE_CADENA" Palabra=""b"" Linea="2" Col="25"></Elemento>
                                    </Elemento>
                                    <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                  </Elemento>
                                  <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="41"></Elemento>
                                </Elemento>
                                <Elemento Nombre="<RESTO_EXPRESION>" Produccion="32"></Elemento>
                              </Elemento>
                              <Elemento Nombre="<RESTO_UNOOMASPARAMETROS>" Produccion="29"></Elemento>
                            </Elemento>
                          </Elemento>
                        </Elemento>
                      </Elemento>
                    </Elemento>
                  </Elemento>
                </Elemento>
              </Elemento>
            </Elemento>
          </Elemento>
        </Elemento>
        <Elemento Nombre="." Palabra="." Linea="2" Col="29"></Elemento>
        <Elemento Nombre="<RESTO_SENTENCIAS>" Produccion="3">
          <Elemento Nombre="<SENTENCIAS>" Produccion="2">
            <Elemento Nombre="<SENTENCIA>" Produccion="5">
              <Elemento Nombre="<DECLARACIONVARIABLE>" Produccion="10">
                <Elemento Nombre="VARIABLE" Palabra="variable" Linea="3" Col="1"></Elemento>
                <Elemento Nombre="<TIPO>" Produccion="11" Tipo="NUMERICA">
                  <Elemento Nombre="NUMERICA" Palabra="numerica" Linea="3" Col="10"></Elemento>
                </Elemento>
                <Elemento Nombre="IDENTIFICADOR" Palabra="j" Linea="3" Col="19"></Elemento>
              </Elemento>
            </Elemento>
            <Elemento Nombre="." Palabra="." Linea="3" Col="21"></Elemento>
            <Elemento Nombre="<RESTO_SENTENCIAS>" Produccion="3">
              <Elemento Nombre="<SENTENCIAS>" Produccion="2">
                <Elemento Nombre="<SENTENCIA>" Produccion="6">
                  <Elemento Nombre="<DECLARACIONCONSTANTE>" Produccion="14">
                    <Elemento Nombre="CONSTANTE" Palabra="constante" Linea="4" Col="1"></Elemento>
                    <Elemento Nombre="<RESTO_CONSTANTE>" Produccion="15">
                      <Elemento Nombre="NUMERICA" Palabra="numerica" Linea="4" Col="11"></Elemento>
                      <Elemento Nombre="IDENTIFICADOR" Palabra="k" Linea="4" Col="20"></Elemento>
                      <Elemento Nombre="=" Palabra="=" Linea="4" Col="22"></Elemento>
                      <Elemento Nombre="CTE_NUMERICA" Palabra="3" Linea="4" Col="24"></Elemento>
                    </Elemento>
                  </Elemento>
                </Elemento>
                <Elemento Nombre="." Palabra="." Linea="4" Col="26"></Elemento>
                <Elemento Nombre="<RESTO_SENTENCIAS>" Produccion="3">
                  <Elemento Nombre="<SENTENCIAS>" Produccion="2">
                    <Elemento Nombre="<SENTENCIA>" Produccion="7">
                      <Elemento Nombre="<ASIGNACION_O_LLAMADAAMETODO>" Produccion="22">
                        <Elemento Nombre="IDENTIFICADOR" Palabra="j" Linea="5" Col="1"></Elemento>
                        <Elemento Nombre="<RESTO_ASIGNACION_O_LLAMADAAMETODO>" Produccion="23" Tipo="NUMERICA">
                          <Elemento Nombre="=" Palabra="=" Linea="5" Col="3"></Elemento>
                          <Elemento Nombre="<EXPRESION>" Produccion="30" Tipo="NUMERICA">
                            <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                              <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                  <Elemento Nombre="CTE_NUMERICA" Palabra="4" Linea="5" Col="5"></Elemento>
                                </Elemento>
                                <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                              </Elemento>
                              <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="40" Tipo="NUMERICA">
                                <Elemento Nombre="<OPERADORADITIVO>" Produccion="42">
                                  <Elemento Nombre="+" Palabra="+" Linea="5" Col="7"></Elemento>
                                </Elemento>
                                <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                                  <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                    <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                      <Elemento Nombre="CTE_NUMERICA" Palabra="7" Linea="5" Col="9"></Elemento>
                                    </Elemento>
                                    <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                  </Elemento>
                                  <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="40" Tipo="NUMERICA">
                                    <Elemento Nombre="<OPERADORADITIVO>" Produccion="43">
                                      <Elemento Nombre="-" Palabra="-" Linea="5" Col="11"></Elemento>
                                    </Elemento>
                                    <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                                      <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                        <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                          <Elemento Nombre="CTE_NUMERICA" Palabra="4" Linea="5" Col="13"></Elemento>
                                        </Elemento>
                                        <Elemento Nombre="<RESTO_TERMINO>" Produccion="46" Tipo="NUMERICA">
                                          <Elemento Nombre="<OPERADORMULTIPLICACION>" Produccion="48">
                                            <Elemento Nombre="*" Palabra="*" Linea="5" Col="15"></Elemento>
                                          </Elemento>
                                          <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                            <Elemento Nombre="<OPERANDO>" Produccion="51" Tipo="NUMERICA">
                                              <Elemento Nombre="IDENTIFICADOR" Palabra="k" Linea="5" Col="17"></Elemento>
                                            </Elemento>
                                            <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                          </Elemento>
                                        </Elemento>
                                      </Elemento>
                                      <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="40" Tipo="NUMERICA">
                                        <Elemento Nombre="<OPERADORADITIVO>" Produccion="42">
                                          <Elemento Nombre="+" Palabra="+" Linea="5" Col="19"></Elemento>
                                        </Elemento>
                                        <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                                          <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                            <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                              <Elemento Nombre="CTE_NUMERICA" Palabra="1" Linea="5" Col="21"></Elemento>
                                            </Elemento>
                                            <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                          </Elemento>
                                          <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="41"></Elemento>
                                        </Elemento>
                                      </Elemento>
                                    </Elemento>
                                  </Elemento>
                                </Elemento>
                              </Elemento>
                            </Elemento>
                            <Elemento Nombre="<RESTO_EXPRESION>" Produccion="32"></Elemento>
                          </Elemento>
                        </Elemento>
                      </Elemento>
                    </Elemento>
                    <Elemento Nombre="." Palabra="." Linea="5" Col="23"></Elemento>
                    <Elemento Nombre="<RESTO_SENTENCIAS>" Produccion="3">
                      <Elemento Nombre="<SENTENCIAS>" Produccion="2">
                        <Elemento Nombre="<SENTENCIA>" Produccion="7">
                          <Elemento Nombre="<ASIGNACION_O_LLAMADAAMETODO>" Produccion="22">
                            <Elemento Nombre="IDENTIFICADOR" Palabra="k" Linea="6" Col="1"></Elemento>
                            <Elemento Nombre="<RESTO_ASIGNACION_O_LLAMADAAMETODO>" Produccion="23" Tipo="LOGICA">
                              <Elemento Nombre="=" Palabra="=" Linea="6" Col="3"></Elemento>
                              <Elemento Nombre="<EXPRESION>" Produccion="30" Tipo="LOGICA">
                                <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                                  <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                    <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                      <Elemento Nombre="CTE_NUMERICA" Palabra="2" Linea="6" Col="5"></Elemento>
                                    </Elemento>
                                    <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                  </Elemento>
                                  <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="41"></Elemento>
                                </Elemento>
                                <Elemento Nombre="<RESTO_EXPRESION>" Produccion="31" Tipo="NUMERICA">
                                  <Elemento Nombre="<OPERADORRELACIONAL>" Produccion="34">
                                    <Elemento Nombre=">" Palabra=">" Linea="6" Col="7"></Elemento>
                                  </Elemento>
                                  <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                                    <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                      <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                        <Elemento Nombre="CTE_NUMERICA" Palabra="4" Linea="6" Col="9"></Elemento>
                                      </Elemento>
                                      <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                    </Elemento>
                                    <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="40" Tipo="NUMERICA">
                                      <Elemento Nombre="<OPERADORADITIVO>" Produccion="42">
                                        <Elemento Nombre="+" Palabra="+" Linea="6" Col="11"></Elemento>
                                      </Elemento>
                                      <Elemento Nombre="<EXPRESIONSIMPLE>" Produccion="39" Tipo="NUMERICA">
                                        <Elemento Nombre="<TERMINO>" Produccion="45" Tipo="NUMERICA">
                                          <Elemento Nombre="<OPERANDO>" Produccion="52" Tipo="NUMERICA">
                                            <Elemento Nombre="CTE_NUMERICA" Palabra="1" Linea="6" Col="13"></Elemento>
                                          </Elemento>
                                          <Elemento Nombre="<RESTO_TERMINO>" Produccion="47"></Elemento>
                                        </Elemento>
                                        <Elemento Nombre="<RESTO_EXPRESIONSIMPLE>" Produccion="41"></Elemento>
                                      </Elemento>
                                    </Elemento>
                                  </Elemento>
                                </Elemento>
                              </Elemento>
                            </Elemento>
                          </Elemento>
                        </Elemento>
                        <Elemento Nombre="." Palabra="." Linea="6" Col="15"></Elemento>
                        <Elemento Nombre="<RESTO_SENTENCIAS>" Produccion="4"></Elemento>
                      </Elemento>
                    </Elemento>
                  </Elemento>
                </Elemento>
              </Elemento>
            </Elemento>
          </Elemento>
        </Elemento>
      </Elemento>
    </Elemento>
  </Elemento>
  <Elemento Nombre="FIN_FICHERO" Palabra="FIN_SCRIPT" Linea="7" Col="1"></Elemento>
</Elemento>

Para el siguiente script que contiene un error

variable numerica j .
constante numerica k = valor .

Se obtiene la siguiente salida:


	Aplicada producción: <SCRIPT> ::= <SENTENCIAS> FIN_FICHERO                               S.A. = VARIABLE
	Aplicada producción: <SENTENCIAS> ::= <SENTENCIA> . <RESTO_SENTENCIAS>                               S.A. = VARIABLE
	Aplicada producción: <SENTENCIA> ::= <DECLARACIONVARIABLE>                               S.A. = VARIABLE
	Aplicada producción: <DECLARACIONVARIABLE> ::= VARIABLE <TIPO> IDENTIFICADOR                               S.A. = VARIABLE
Reconocido: VARIABLE
	Aplicada producción: <TIPO> ::= NUMERICA                               S.A. = NUMERICA
Reconocido: NUMERICA
Reconocido: IDENTIFICADOR
Reconocido: .
	Aplicada producción: <RESTO_SENTENCIAS> ::= <SENTENCIAS>                               S.A. = CONSTANTE
	Aplicada producción: <SENTENCIAS> ::= <SENTENCIA> . <RESTO_SENTENCIAS>                               S.A. = CONSTANTE
	Aplicada producción: <SENTENCIA> ::= <DECLARACIONCONSTANTE>                               S.A. = CONSTANTE
	Aplicada producción: <DECLARACIONCONSTANTE> ::= CONSTANTE <RESTO_CONSTANTE>                               S.A. = CONSTANTE
Reconocido: CONSTANTE
	Aplicada producción: <RESTO_CONSTANTE> ::= NUMERICA IDENTIFICADOR = CTE_NUMERICA                               S.A. = NUMERICA
Reconocido: NUMERICA
Reconocido: IDENTIFICADOR
Reconocido: =
Se esperaba la palabra 'CTE_NUMERICA' y ha llegado la palabra 'valor' Linea: 2 Columna: 24

 

Primera parte de este artículo:

Analizador sintáctico (Parte I)