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:
-
Public Class Produccion
-
-
Dim _parteIzquierda As String
-
-
Public ReadOnly Property ParteIzquierda() As String
-
Get
-
Return _parteIzquierda
-
End Get
-
End Property
-
-
Dim _parteDerecha() As String
-
-
Public ReadOnly Property ParteDerecha() As String()
-
Get
-
Return _parteDerecha
-
End Get
-
End Property
-
-
Dim _simbolosDirectores() As String
-
-
Public ReadOnly Property SimbolosDirectores() As String()
-
Get
-
Return _simbolosDirectores
-
End Get
-
End Property
-
-
Public Sub New(ByVal pParteIzquierda As String, ByVal pParteDerecha As String(), ByVal pSimbolosDirectores() As String)
-
_parteIzquierda = pParteIzquierda
-
_parteDerecha = pParteDerecha
-
_simbolosDirectores = pSimbolosDirectores
-
End Sub
-
-
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)