Analizador sintáctico (Parte II)

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)

 

One Response to “Analizador sintáctico (Parte II)”

  1. _dgoQ Says:

    Buen codigo! Esto es lo equivalente a un Automata de Pila ya implementado. Ahora bien… el modulo y/o definicion del BNF con sus respectivos Directores, en donde la describes, ¿en un archivo texto, XML…?

Leave a Reply

Antispam. Escriba la palabra 'hola' (sin comillas)