:: Estas en: Inicio
-- PROLETOOL --

Ayuda


Introducción

[ Inicio ]

Proletool es una herramienta, de uso por internet, para facilitar el aprendizaje/enseñanza de la asignatura Procesadores de Lenguajes. Ha sido diseñada y desarrollada en la Escuela Superior de Informática de la Universidad de Castilla-La Mancha por el profesor J.J. Castro-Schez, y el equipo formado por P.A. Santos, J. Santos, R. Miguel y D. Arenal. Esta herramienta permite que los usuarios (estudiantes/profesores) puedan formular problemas sobre construcción de analizadores léxicos y sintácticos ascendentes (SLR1, LR1, LALR1) y descendentes (LL1), así como, si lo desea, plantear soluciones para los mismos. La herramienta analizará los problemas presentados y los corregirá, y en el caso de que se hayan presentado soluciones, también chequeará como de correctas son. Esta información será empleada para proporcionar un feedback que oriente al usuario en la realización de más ejercicios en función de los errores cometidos. Además, Proletool también posee un módulo que permite experimentar con los analizadores construidos realizando simulaciones de análisis de cadenas, de este modo se pretende facilitar la comprensión de su funcionamiento. Su arquitectura funcional es la que se muestra a continuación:

El mecanismo de comunicación con la herramienta Proletool es un lenguaje formal que se describe a continuación.

Lenguaje Proletool

Descripción general del lenguaje Proletool

Características del lenguaje.

[ Inicio ]

El lenguaje Proletool es un lenguaje formal que ha sido diseñado y propuesto para permitir la comunicación con la herramienta del mismo nombre. Este lenguaje es libre de contexto para la generación de infinitas cadenas de entrada, esto significa que se podrán plantear a la herramienta infinitos ejercicios/soluciones. El lenguaje es "case sensitive", es decir se distingue entre minúsculas y mayúsculas.

Descripción EBNF del lenguaje

[ Inicio ]

La descripción EBNF del lenguaje de entrada de PROLETOOL es la siguiente:

   PROLETOOL ::= {LEXERS_DEF} [GLOBAL_BLK] EXERCISES [SOLUTIONS]

   LEXERS_DEF ::= lexer id ’%{’ DATA_LEXER ’%}’

   DATA_LEXER ::= TOKEN_DEF {TOKEN_DEF}

   TOKEN_DEF ::=  id ’:=’ regexp ’;’

   GLOBAL_BLK ::=  global ’{’ GLOBAL_BODY ’}’

   GLOBAL_BODY ::= [ANALYSIS_DEC] SYMBOL_DECS GLOBAL_SENT

   ANALYSIS_DEC ::= analysis TYPE_ANALYSIS’;’ [TYPE_ANALYSIS ’;’] [TYPE_ANALYSIS ’;’] 
                   [TYPE_ANALYSIS ’;’]

   TYPE_ANALYSIS ::= LL1 | SLR1 | LR1 | LALR1

   SYMBOL_DECS ::= {TERMINAL_DEC | NONTERMINAL_DEC}

   TERMINAL_DEC ::= terminal id {’,’ id} ’;’

   NONTERMINAL_DEC ::= nonterminal id {’,’ id} ’;’

   GLOBAL_SENT ::= {GROUP_SENT}

   GROUP_SENT ::= id ’=’ ’{’ RULE_SENT ’}’

   RULE_SENT ::= {GRAM_RULE}

   GRAM_RULE ::= id ’:=’ (RIGHT_PART | ’;’)

   RIGHT_PART ::= SYMBOLS {’|’ SYMBOLS} ( ’;’ | ’|’ ’;’)

   SYMBOLS ::= (id | char_iq) {(id | char_iq)}

   EXERCISES ::= EXERCISE {EXERCISE}

   EXERCISE ::= (grammar | exercise) id ’{’ LOCAL_BODY ’}’

   LOCAL_BODY ::= [ANALYSIS_DEC] LOCAL_SIMB_DEC SENT_LOCALES

   LOCAL_SIMB_DEC ::= USE_LEXER {NONTERMINAL_DEC} | {SYMBOL_DECS}

   USE_LEXER ::= use id ’;’

   LOCAL_BODY ::= LOCAL_SEBT {LOCAL_SENT}

   LOCAL_SENT ::= RULE_SENT | USE_GROUP

   USE_GROUP ::= id ’;’

   SOLUTIONS ::= SOLUTION {SOLUTION}

   SOLUTION ::= solution id ’{’ PARTS ’}’

   PARTS ::= [NULLABLE] [FIRSTS] [LOOKAHEAD] [D_PARSING_TAB] {A_PARSING_TAB}

   NULLABLE ::= nullables ’{’ id { ’,’ id } ’}’

   FIRSTS ::= firsts ’{’ DEC_SYMBOL_BLK {DEC_SYMBOL_BLK} ’}’

   FOLLOWERS ::= followers ’{’ DEC_SYMBOL_BLK {DEC_SYMBOL_BLK} ’}’

   LOOKAHEAD ::= lookaheads ’{’ LKH_GRAM_RULE {LKH_GRAM_RULE} ’}’ 

   D_PARSING_TAB ::= ll1_parsing_table ’{’ TAB_CELL {TAB_CELL} ’}’ 

   A_PARSING_TAB ::= TYPE ’{’ ACTION_TAB GOTO_TAB ’}’

   TYPE ::= slr1_parsing_table | lr1_parsing_table | lalr1_parsing_table 

   ACTION_TAB ::= action_table ’{’ { ’[’ STATE ’,’ id ’]’ ’=’ ACTION ’;’ } ’}’

   GOTO_TAB ::= goto_table ’{’ { ’[’ STATE ’,’ id ’]’ ’=’ STATE ’;’ } ’}’

   ACTION ::= ’r’ GRAM_RULE_MUMBER | ’r’ STATE | accept | error

   DEC_SYMBOL_BLK ::= id ’=’ ’{’ (id | ’$’) { ’,’ (id | ’$’)} ’}’ ’;’ 

   LKH_GRAM_RULE ::=  GRAM_RULE_MUMBER ’=’ ’{’ (id | ’$’) { ’,’ (id | ’$’)} ’}’ ’;’

   GRAM_RULE_MUMBER ::= number 

   STATE ::= number 

   TAB_CELL ::= ’[’ id ’,’ id ’]’ ’=’ (number ’;’ | ’{’ number { ’,’ number } ’}’ ’;’)

Descripción del vocabulario del lenguaje

[ Inicio ]

Los elementos (tokens) que conforman el vocabulario del lenguaje Proletool son los siguientes:

Estructura de un archivo válido

[ Inicio ]

Un archivo válido tiene cuatro secciones: definición de analizadores léxicos, definición global, definición de ejercicios, propuesta de soluciones.
  //  Zona de definición de analizadores léxicos

  lexer lexer1
  %{
     ...
  %}
  
  lexer lexer2
  %{
     ... 
  %}

  ...

  //  Fin de zona de definición de analizadores léxicos
  
  //  Zona de definición global

  global
  {
    ...
  }
  
  // Fin de zona de definición global

  //  Zona de definición de ejercicios
  
  grammar gramatica1
  {
    ...
  }
  
  grammar gramatica2
  {
    ...
  }

  ...

  //  Fin de zona de definición de ejercicios

  // Zona de propuesta de soluciones

  solution gramatica1
  {
    ...
  }
  
  solution gramatica2
  {
    ...
  }

  ...

  //  Fin de zona de propuesta de soluciones
 
A continuación se mostrará brevemente cual es el contenido de cada parte: La zona de definición de analizadores léxicos, global y propuesta de soluciones es opcional, pero debe haber como mínimo un ejercicio declarado en la zona de definición de ejercicios. Dentro del cuerpo de las declaraciones globales y gramáticas locales se puede poner lo mismo a excepción de los grupos de producciones, que ya se explicará en otro apartado.

Resolución del ámbito de los símbolos.

[ Inicio ]

Todos los símbolos declarados globalmente, son accesibles desde todas las gramáticas locales, es decir si se declaran globalmente no hace falta volver a declararlos localmente. Lo que no se puede hacer es, en un mismo ambito definir dos veces el mismo símbolo. Ejemplo:
  global {
    nonterminal A, B, C;
    terminal    a, b;

    // no se puede declarar dos veces un símbolo esto seria erroneo
    terminal a, B;
  }

  grammar gram_1
  {
      // no hace falta declarar A, a, b ya que estan declarados globalmente.
      A := a b;
  }
Si se declara un símbolo globalmente y este se vuelve a declarar localmente, no pasa nada, tiene más prioridad el local. Claro si al declararlo de forma local es del mismo tipo no pasa nada, pero si se declara localmente de un tipo diferente al global tiene más precedencia el local. Ejemplo:
  global
  {
    // en la parte global se declara como no terminal
    nonterminal A;
  }

  grammar gram_1
  {
      nonterminal S;

      // esta delaracion tiene mas prioridad que la global
      // por lo tanto 'A' es un terminal.
      terminal A;

      S := A;
  }
El nombre de una gramática es un símbolo global, si se vuelve a declarar localmente, por ejemplo como un terminal no pasa nada, siempre tiene más precedencia la declaración local.

Todos los símbolos declarados localmente en una gramática no interfieren en otra gramática y se pueden volver a declarar. Ejemplo:.
  grammar gram_1
  {
    terminal uno, dos;
  }

  grammar gram_2
  {
    /* esto no generea conflicto al ser gramáticas distintas */
    terminal uno, dos;
  }

Formato de las producciones

[ Inicio ]

Una parte fundamental del lenguaje en dos zonas del lenguaje (Definición Global y Definición de Ejercicios) es la escritura de producciones o reglas gramaticales, es por ello por lo que se presta especial atención a la forma en la que se definen. Una producción tiene dos partes: Aspectos a destacar en la escritura de las producciones: Antes de poder utilizar un símbolo en una producción hay que declararlo. Si se quiere se pueden repetir producciones no se genera ningún conflicto. Ejemplo:
   global
   {
       nonterminal A, B, C;
       terminal    a, b, c;

       // esto es un grupo.
       prods_globales =
       {
           A := a c | b;
           B := a;

           // no hace falta poner espacios, cuando se utilizan 
           // caracteres entrecomillados. Además como ya se ha comentado, 
           // no hace falta declarar el terminal '+'
           B := a'+'b;

           // no pasa nada simplemente se ignoran, y se dará un aviso.
           B := a;
           B := a;
           B := a;
       }
   }

Zona de definición de analizadores léxicos

Introducción

[ Inicio ]

Con el objetivo de facilitar la simulación de las gramáticas, se permite de manera opcional la definición de analizadores léxicos, que actuarán como reconocedores de los terminales usados en las definiciones de los ejercicios que se incluyen en la zona de definición de ejercicios. En un archivo se puede incluir y utilizar uno o varios analizadores léxicos.

Formato de una definición léxica

[ Inicio ]

La definición de un analizador léxico, o lexer, se ajusta a la siguiente estructura:
  lexer identificador_lexer
  %{
      tokens
      { 
        identificador_token := expresion_regular;
        identificador_token := expresion_regular;
        ...
      }
      pass lista_identificadores; //opcional
  %}
 
Donde cada elemento tiene el siguiente significado:

Utilización de un lexer

[ Inicio ]

Para poder usar en un ejercicio un analizador léxico definido en esta zona, deberá indicarse explícitamente por medio de la orden: use identificador_lexer ;. Se deben tener en cuenta las siguientes consideraciones cuando se utilize un lexer:
Un ejemplo de lo dicho anteriormente es el siguiente:
  
  lexer globalLexer
  %{
      tokens
      {
        //definicion de los tokens.
      }
  %}
  
  global
  {
    ...
  }
  grammar gramatica_local
  {
   analysis LALR1; 
   use globalLexer;
   nonterminal Uno, Dos;
   ... 
  }
  
  grammar gramatica_local2
  {
   analysis LALR1; 
   use globalLexer;
   ... 
  }
  
  grammar gramatica_local3
  {
   use globalLexer;
   nonterminal Uno, Dos;
   ... 
  }
  
  grammar gramatica_local4
  {
   use globalLexer;
   ... 
  }  
  

Expresiones regulares válidas

[ Inicio ]

Una expresión regular válida se puede definir como: Dentro de la definición de una expresión regular no se permiten el carácter de salto de línea(\n) o el de retorno de carro(\r).

Si a y b son dos expresiones regulares válidas están permitidas las siguientes operaciones: La forma en el que se resolverán los casos en los cuales varias expresiones regulares reconozcan la misma cadena de entrada será por el orden de definición. La primera expresión regular definida tendrá prioridad sobre las demás.

Un ejemplo de definición y utilización completo de un lexer es el siguiente:

lexer calcLexer 
%{
	tokens
	{
		id      := [a-zA-Z]+;
        	num     := -?[0-9][0-9]*;
		MAS     := "+";
		MENOS   := "-";
		POR     := "*";
		DIV     := "/";
		PAR_IZ  := "(";
		PAR_DE  := ")";
		nulos   := [ \r\n\t];
	}
	
	pass nulos;
%}

grammar calc
{
    analysis    LALR1;
    use calcLexer;
    nonterminal E, T, F;

    E := E MAS T | E MENOS T | T;
    T := T POR F | T DIV F | F;
    F := PAR_IZ E PAR_DE;
    F := id | num;
}  

AFDs asociados a la expresiones regulares

[ Inicio ]

Si se defíne un lexer y se compila la gramática, es posible ver gráficamente los AFDs asociados a los tokens pulsando el botón Ver AFDs.

Zona de definición global

Introducción

[ Inicio ]

En esta zona se definen símbolos, tanto terminales como no terminales, y grupos de producciones identificados que pueden ser usados en la definición de ejercicios. De esta forma, se simplifica la escritura de ejercicios similares, pero obliga a tener en cuenta el ámbito de visibilidad de las declaraciones. Ver resolución del ámbito ya explicado anteriormente.

Formato de una definición global

[ Inicio ]

En el cuerpo de la parte global lo primero que se pone es el tipo de análisis a realizar, este se declara poniendo la palabra reservada analysis seguida de una lista con los análisis que se quiere realizar. Esta lista no puede ser vacía y como máximo se pueden declarar 4 tipos de análisis. Ejemplo:
   global {
     // se ha elegido el analisis LL1 y LR1.
     analysis LL1, LR1;
   }
La declaración del tipo de análisis sólo se puede hacer una vez (en cada gramática o globalmente). Además es opcional, si se quiere no hace falta ponerla, por defecto se realizará un análisis LL1. Los tipos válidos de análisis son: LL1, SLR1, LR1, LALR1.
Otro elemento que se puede declarar son los símbolos de los ejercicios, que pueden ser terminales y no terminales. Su declaración es opcional. Además, no importa el orden en que se declaren, y ésta si se puede repetir varias veces.
  global {
     terminal    a, b, c, d;
     nonterminal A, J, P;

     // no importa el orden y se puede poner mas de uno
     nonterminal Uno, Dos, Tres;
     terminal    k, l;
  }
Como se puede ver la declaración de terminales esta precedida de la palabra reservada 'terminal', y los no terminales de la palabra 'nonterminal'. Ejemplo resumen de la parte de declaraciones:
  global {
     analysis LL1, SLR1;
     nonterminal A, J, P;
     terminal a, b, c, d;
  }
También se pueden declarar conjuntos de producciones, a los que se les asigna un identificador que luego podrá ser invocado en la definición de un ejercicio.
  global {
      analysis    LL1;
      nonterminal Z, N, A, C, H;
      terminal    b, c, j, t, k, h, n, z;

      prod_comunes = {
          N := b k | c H;
          A := h N | z;
          H := n   | k;
      }
  }

  grammar gram_no_ll1 {
      Z := b N A c | N c | b j | c A | t;
      prod_comunes; //  Uso del conjunto previamente declarado
  }

Zona de definición de ejercicios

Introducción

[ Inicio ]

En esta zona se especifican los ejercicios que se desean resolver. Proletool resuelve ejercicios sobre generación de analizadores léxicos y analizadores sintácticos descendentes y ascendentes, mostrando las tablas de análisis generadas, así como la información que permite construírlas.

Formato de una definición de ejercicio

[ Inicio ]

Un ejercicio es una especificación de una gramática libre de contexto, G=(V, T, P, S), donde V es el conjunto de símbolos no terminales, T el conjunto de símbolos terminales, P el conjunto de producciones de la gramática, y S es el símbolo inicial de la gramática, a la que se le asocia uno o varios tipos de análisis sintáctico (LL1, SLR1, LR1, LALR1). En esta zona se pueden especificar tantos ejercicios como se deseen.
En el cuerpo de la parte de ejercicios lo primero que se pone es el tipo de análisis a realizar. Este se declara poniendo la palabra reservada analysis seguida de una lista con los análisis que se quiere realizar (LL1, SLR1, LR1, LALR1). Esta lista puede ser vacía si se declara globalmente. Después se pueden declarar los símbolos terminales y no terminales, en el orden que se quieran y en tantas líneas como se consideren. Su declaración es también opcional si se declara globalmente. También se puede usar un analizador léxico como ya se ha explicado anteriormente. Para finalizar, se especifican las producciones de la gramática. Ejemplo:
  grammar gramatica_1 {
      analysis    LR1, LALR1;
      nonterminal S, C;
      terminal    c, d;

      S := C C;
      C := c C | d;
  }
Hay que destacar que el símbolo inicial de la gramática, o axioma, no es necesario declararlo, porque por defecto se considera que es el primer no terminal de la parte izquierda de la primera producción declarada. En el ejemplo anterior, el axioma sería la S.

Zona de propuesta de soluciones

Introducción

[ Inicio ]

En esta zona se define la propuesta de las soluciones, tanto para la información básica (anulables, iniciales y seguidores), como para los análisis descendente (símbolos de predicción y tabla LL1), y ascendente (tablas SLR1, LR1 y LALR1).

Formato de una propuesta de solución

[ Inicio ]

Una solución está formada por 4 partes: gramática (de la cuál es la que se propone la solución), propuesta de solución de información básica, de análisis descendente y de análisis ascendente:
  solution gramatica_1 { // gramática
  
      // Información básica
      
      nullables{
      	  ...
      }
      
      firsts{
          ...
      }
      
      followers{
          ...
      }
      
      // Fin información básica
      
      // Análisis Descendente
      
      lookaheads{
          ...
      }
      
      ll1_parsing_table{
          ...
      }
      
      // Fin analisis descendente
      
      // Análisis ascendente
      
      slr1_parsing_table{
          ....
      }
      
      lr1_parsing_table{
          ....
      }
      
      lalr1_parsing_table{
          ....
      }
      
      //Fin análisis ascendente
  }

Salida de la herramienta Proletool

Símbolos especiales

[ Inicio ]

En la generación del informe aparecen algunos símbolos especiales que no han sido especificados en la gramática. El significado de los mismos es el siguiente:

Mensajes de salida del compilador

[ Inicio ]

Aquí se muestran mensajes de salida generados desde el compilador. Estos pueden ser de los siguientes:

Barra de navegación de soluciones de ejercicios

[ Inicio ]
La primera información que aparece, (tras mostrar los errores o warnings, si se han cometido), es una tabla de navegación como la que aparece a continuación:

Gramáticas compiladas
Gramatica_1
   Tabla de análisis LL(1)
Conjunto de estados SLR(1) Diagrama Tabla de análisis SLR(1)
Informe de Resultados

Con ella podemos acceder rápidamente a las distintas partes de los resultados obtenidos de la compilación.

Gramática

[ Inicio ]

Cuando se genera el informe se copia en dicho informe la gramática de la cual proviene el análisis. El formato puede que no sea el mismo, porque las producciones que se declaran con el símbolo '|', se separan y se pone una debajo de la otra. Por ejemplo al escribir estas producciones:
        Z := d | X Y Z;
        Y := c | ;
        X := Y | a;
En el informe las producciones, aparecerían sin el símbolo '|' y numeradas según el orden de declaración.

Información básica

[ Inicio ]

Al generar las tablas de análisis siempre se genera información básica: anulables, iniciales y seguidores. Esta información es de gran utilidad, y además facilita el encontrar errores y por ejemplo ver la causa de conflictos.
Si no se ha especificado la parte de solución, un ejemplo de salida es el que se muestra a continuación. La primera tabla es de los anulables, donde se muestra la lista de los símbolos anulables. La segunda es de los iniciales, donde se muestra para cada no terminal, su lista de iniciales:
Anulables
A B C

No terminalIniciales
A f d e c a
B b c
C c

Si se ha especificado la solución, entonces se muestra, en los anulables, la lista de acertados (tick verde), no indicados (admiración naranja) y fallados (cruz roja). En iniciales y seguidores, se muestra, por cada no terminal, los acertados, no indicados y fallados. La unión de los campos de aciertos y no indicados conforman la solución real. Ejemplo, en el que la primera tabla pertenece a los anulables, y la segunda a los seguidores:

Solución
AcertadosNo indicadosFallados
C B A

Solución
No terminalAcertadosNo indicadosFallados
A $
B $ b a
C f e c $ b
D b c $
E $

Análisis sintáctico descendente

[ Inicio ]

Si se ha decidido hacer un análisis sintáctico descendente, entonces aparecerán los símbolos de predicción y la tabla de análisis LL1. Si no se ha especificado la solución de ninguno de ambos, entonces, los símbolos de predicción se mostrarán por cada producción de la gramática, y la tabla LL1, en las filas están los no terminales y en las columnas los terminales. La cabecera de la tabla se ordena por orden alfabético, dejando al siempre al final el símbolo '$'. En caso de haber más de una producción, el fondo será rojo, debido a que existe un conflicto. Ejemplo, primero símbolos de predicción, después, tabla LL1:

ProducciónSímbolos de Predicción
A-> C C c $
A-> C E c e f
A-> D B d
A-> a B a
B-> λ $
B-> C c $
B-> b b
C-> λ c e f $
C-> c c
D-> d d
E-> e e
E-> f f

a b c d e f $
A A-> a B
  A-> C E
A-> C C
A-> D B
A-> C E
A-> C E
A-> C C
B   B-> b
B-> C
      B-> λ
B-> C
C     C-> λ
C-> c
  C-> λ
C-> λ
C-> λ
D       D-> d
     
E         E-> e
E-> f
 

Si se han indicado las soluciones, entonces las tablas tendrán el aspecto que se ve a continuación. La tabla de símbolos de predicción sigue la filosofía de la información básica, mientras que en la tabla LL1 se muestra cada producción de un color. El verde es una producción correctamente colocada, naranja es aquélla que no ha sido indicada y roja, que se ha fallado. La unión de las verdes y naranjas forma la solución. Ejemplo:

Solución
ProduccionAcertadosNo indicadosFallados
A-> a B a
A-> D B d
A-> C E c e f
B-> b b
B-> C c $
B-> λ $

a b c d e f $
A A-> a B
A-> D B
  A-> C E
A-> C C
A-> a B
A-> D B
A-> C E
A-> C E
A-> C C
B A-> C E
B-> b
A-> D B
B-> C
A-> C E
      B-> λ
B-> C
C A-> C C
  C-> λ
C-> c
  C-> λ
C-> λ
C-> λ
D       D-> d
     
E         E-> e
E-> f
 

Análisis sintáctico ascendente

[ Inicio ]

Cuando se especifica que se realice algún análisis ascendente, se muestran 2 tipos de información: el autómata (en forma de tabla y gráfico) y la tabla de análisis.
El autómata se da de forma tabular. Donde cada entrada de esta tabla representa un estado de autómata. Dentro del estado están los items de dicho estado donde en estos items se da la siguiente información (de izquierda a derecha): Un ejemplo, de autómata especificado en forma tabular se puede ver en la siguiente tabla.


Posteriormente se muestra el autómata en forma de gráfico, para que sea más visual.
A continuación, si no se ha especificado la solución, se muestra la tabla de análisis sintáctico ascendente. Las columnas se dividen en dos partes (están sombreadas de color diferente), la primera de ella es la tabla de acción y esta ordenada por orden alfabético. El ultimo símbolo de la esta parte siempre es el símbolo final '$'. Un ejemplo, de ello se puede ver en la siguiente tabla:

a b c $ A B C
0 d2
d4
d6
r5
r7
1
3
5
1       aceptar
     
2   d4
d6
r5
r7
  7
5
3       r2
     
4       r3
     
5       r4
     
6       r6
     
7       r1
     


La otra es la parte de Ir_A, y también esta ordenada por orden alfabético.
El significado de los símbolos dentro de la tabla son: Al igual que en la descendente si hay un conflicto, la casilla conflictiva se marcará en rojo.
Cuando se producen conflictos, estos se muestran marcando la casilla conflictiva en rojo.
Si se ha indicado la solución a la tabla, entonces se muestra siguiendo los mismos criterios que en el análisis descendente: de color verde los aciertos, naranja aquéllo no indicado (que junto con los verdes, forman la solución) y rojo los datos erróneos. Ejemplo:

a b c $ A B C
0 d2
d3
d4
d6
r9
r5
r7
r9
1
3
5
4
1       aceptar
     
2   d4
d6
r5
r7
  7
5
3       r2
     
4       r3
     
5       r4
     
6       r6
     
7       r1
     

Hay que tener una serie de consideraciones a la hora de comparar los resultados obtenidos a mano con los dados por la herramienta.
Lo primero a destacar es que el símbolo inicial de la gramática es el no terminal de la parte izquierda de la primera producción de la gramática.

Otro aspecto importante es conocer la forma en que en los análisis ascendentes se generan los estados del autómata, ya que dos tablas de análisis pueden ser equivalentes y no parecerlo porque se ha podido numerar de forma diferente los estados que se han utilizado para generar dicha tabla. Para facilitar la comprobación de ejercicios se va a seguir una convención única en la generación del autómata de reconocimiento.

Los estados se van numerando en el orden natural, como si el análisis se hiciera manualmente. Cuando se tiene un estado y se le van a calcular las transiciones a otros estados los items dentro de dicho estados están ordenado de la siguiente forma:
  1. Primero los items que proceden de una transición desde otro estado. Si hay varios, estos se ordenan por el orden en que la producción relacionada con el item aparece en la gramática.
  2. Después están los items calculados a partir del cierre de los items iniciales. El orden en que se va calculando el cierre es desde la parte superior del estado hasta la inferior. Los items con la misma parte izquierda calculados en el cierre si hay varios se ordenan entre ellos por el orden en que aparece su producción asicioada en la gramática.
Las transiciones se van calculando en el orden en que están puestos los items dentro del estado. Por ejemplo, si tuviéramos la siguiente gramática:
        1: E =>
        E + T 2: E =
        > T 3: T
        = > ( E ) 4:
        T = > id
Parte del autómata que se generaría se puede ver en la siguiente figura.

Del estado 0 visto en la figura anterior podemos destacar lo siguiente: La forma en que se ha generado estos estados se repite con todos los estados.

En resumen la ordenación es como si el calculo del autómata se hiciera manualmente, sabiendo la forma en que siempre el sistema genera los estados, si nosotros al hacer los ejercicios manualmente los hacemos de esta forma, después será más fácil comprobar los resultados de nuestros propios ejercicios.

Barra de navegación de resultados y recomendaciones

[ Inicio ]

Al finalizar la visualización de la solución de la gramática, si se ha especificado su solución, entonces se mostrarán los resultados obtenidos, de aciertos y fallos cometidos, así como recomendaciones dependiendo de los errores cometidos. Inicialmente hay una tabla de navegación para moverse por los distintos resultados de forma rápida:

Informe de Resultados
Prueba
Información Básica
Anulables
Iniciales
Seguidores
A. Sint. Descendente
Símbolos de Predicción
Tabla LL1
A. Sint. Ascendente
Tabla SLR1
Recomendaciones Tutor

Por un lado se puede acceder a los resultados de las soluciones, divididos en información básica, análisis sintáctico descendente y ascendente. Con el botón ver, podemos acceder directamente a la tabla de la solución equivalente para comprobar los datos. Abajo de la tabla hay un enlace a las recomendaciones que se dan para la compilación realizada.

Resultados y recomendaciones

[ Inicio ]

Las tablas de resultados muestran 3 columnas (menos en análisis sintáctico ascendente): el tipo de resultado, los aciertos y los fallos cometidos sobre ese tipo. En análisis ascendente se muestran los tipos de resultados y si ha acertado o no en dicho tipo. Se dividen en secciones, separando información básica de análisis sintácticos, y a su vez éstos divididos en sus partes correspondientes. Un ejemplo es esta tabla, de parte de los iniciales, y otra de parte de un análisis sintáctico SLR1:

TipoAciertosFallos
Cálculo de los iniciales de un no terminal, cuando la producción que lo define comienza por un terminal.12
Cálculo de los iniciales de un no terminal, cuando la producción que lo define comienza por un no terminal que no es anulable.00
Cálculo de los iniciales de un no terminal, cuando la producción que lo define comienza por un no terminal anulable y el inicial pertenece a ese no terminal.12
Cálculo de los iniciales de un no terminal, cuando la producción que lo define comienza por un no terminal anulable y el inicial no pertenece a ese no terminal.00
Cálculo de los iniciales de un no terminal. Se han indicado símbolos iniciales que no lo son.0

TipoResultado
Construir la Tabla de análisis ascendente SLR1 (parte de acción), al calcular los estados del autómata que reconoce prefijos viables.Sí
Construir la Tabla de análisis ascendente SLR1 (parte de acción), al determinar los símbolos que producen transición.Sí
Construir la Tabla de análisis ascendente SLR1 (parte de acción), al tratar el símbolo delimitador de fin de cadena (dolar), no hay reducciones/desplazamientos asociados a dicho símbolo.No
Construir la Tabla de análisis ascendente SLR1 (parte de acción), al calcular el primer estado del autómata que reconoce prefijos viables.Sí
Construir la Tabla de análisis ascendente SLR1 (parte de ir a), al no determinar bien los símbolos que producen cambio de estado tras una reducción.Sí
Construir la Tabla de análisis ascendente SLR1 (parte de acción). Se han indicado acciones erróneas.Sí
Construir la Tabla de análisis ascendente SLR1 (parte de ir a). Se han indicado cambios de estado erróneos.Sí
Warning al construir la Tabla de análisis ascendente SLR1 (parte de acción). Se han omitido desplazamientos. Sí
Warning al construir la Tabla de análisis ascendente SLR1 (parte de acción). Se han omitido reducciones.Sí
Warning al construir la Tabla de análisis ascendente SLR1 (parte de acción). Se han omitido error o el estado de aceptación de la cadena analizada.Sí
Warning al construir la Tabla de análisis ascendente SLR1 (parte de ir a). Se han omitido cambios de estado.Sí
Construir la Tabla de análisis ascendente SLR1. Se comenten errores a la hora de construir la Tabla.Sí

La causa por la cuál no se evalúa más exhaustivamente los análisis sintácticos ascendentes es por la gran cantidad de información de la que precisan, por lo que se ha reducido para no hacer necesario introducir toda la información.
Por cada fallo cometido se da una recomendación al final, indicando el tipo de fallo y unos ejercicios a realizar que ayudarán en dicho ejemplo:

TipoEjercicios
Fallo en el cálculo de los anulables de un símbolo no terminal, cuando éste tiene una producción a la cadena vacía. ll1_1
Fallo en el cálculo de los iniciales de un no terminal, cuando la producción que lo define comienza por un terminal. ll1_1
Fallo en el cálculo de seguidores de un no terminal, cuando el no terminal aparece en la parte derecha de una producción y a su derecha no hay nada o todo lo que hay se puede anular. ll1_1
Fallo en el cálculo de los símbolos de predicción de una producción, cuando su parte derecha comienza por un terminal. ll1_1 , ll1_2


Experimentación con la salida generada

Simulación

[ Inicio ]
Para simular desde el informe generado al compilar, hay que darle al botón donde pone simular. Una vez estes en dicha ventana, sólo hay que escribir el texto de entrada y darle a simular.

Otro aspecto a resaltar es el formato del texto de entrada a simular. Sólo se puede introducir los terminales declarados en la gramática y los símbolos especiales. Un ejemplo, con esta gramática:
  grammar calc
  {
      analysis    LALR1;
      nonterminal E, T, F;
      terminal    id;

      E := E '+' T | E '-' T | T;
      T := T '*' F | T '/' F | F;
      F := '(' E ')';
      F := id;
  }
Los únicos terminales permitidos son: id, +, -, /, (, ).
Por ejemplo un texto a simular podría ser el siguiente:
    (id + id) / id
Como se puede ver aunque en la gramática el simbolo +, va entrecomillado, cuando se introduce en el simulador estos símbolos no se ponen entre comillas.

Simulación paso a paso

[ Inicio ]

Para simular paso a paso desde el informe generado al compilar, primero hay que pulsar el botón Simular Step. Se abrirá a continuación una ventana, en la que sólo hay que escribir un texto de entrada y pulsar el botón simular.

Ejemplo de entorno de simulación para gramáticas LL1

[ Inicio ]

En este entorno y utilizando los botones de simulación o el método abreviado podrá simular paso a paso las gramáticas LL1.




Ejemplo de entorno de simulación para gramáticas SLR1, LR1, LALR1

[ Inicio ]

En este entorno y por medio de los botones de simulación o método abreviado se pueden simular paso a paso las gramáticas SLR1, LR1, LALR1.




Botones de simulación

[ Inicio ]

Los botones de simulación realizan las siguientes acciones:

Los botones prev, next, reset y end, actualizan el estado de todas las tablas de simulación y el arból sintáctico (si se esta visualizando)

Para finalizar, introduciendo un número y pulsando enter en la caja de texto Ir a el índice de simulación se posicionaría en la entrada especificada de la tabla pila/entrada.

Teclas de acceso rápido

[ Inicio ]

Con el objeto de facilitar el proceso de simulación, se han definido métodos abreviados de teclado. Los métodos abreviados se clásifican según el navegador que se este utilizando:


Firefox

Internet Explorer


Conocimientos adquiridos

[ Inicio ]
Conforme un usuario va realizando compilaciones en las que ha especificado una solución, sus resultados se han ido registrando. Utilizando esta información, se calcula, por cada tipo de problema, cómo va evolucionando. Esta información se puede observar en el menú de la izquierda, en la opción de Resultados. Aquí, cada usuario podrá ver una tabla, en la que se muestran los tipos de problema, los aciertos y fallos recientes (de las últimas 5 compilaciones), los aciertos y fallos históricos, una evaluación (de rojo a verde, rojo indica una mala evaluación, verde, buena) y unos ejemplosd de recomendación, si fueren necesarios. Ejemplo:

RecienteHistórico
DescripciónAciertosFallosAciertosFallosEvaluaciónRecomendación
Información Básica Anulables Fallo en el cálculo de los anulables de un símbolo no terminal, cuando éste tiene una producción a la cadena vacía.4040
Vas muy bien
Fallo en el cálculo de los anulables de un símbolo no terminal, cuando éste se hace anulable por una producción en la que todos los símbolos de la derecha son no terminales y éstos son anulables.0404
No hay ejemplos
Iniciales Fallo en el cálculo de los iniciales de un no terminal, cuando la producción que lo define comienza por un terminal.8484
No hay ejemplos
Fallo en el cálculo de los iniciales de un no terminal, cuando la producción que lo define comienza por un no terminal anulable y el inicial pertenece a ese no terminal.120120
Vas muy bien
Fallo en el cálculo de los iniciales de un no terminal, cuando la producción que lo define comienza por un no terminal anulable y el inicial no pertenece a ese no terminal.0404
No hay ejemplos
Seguidores Fallo en el cálculo de los seguidores de un no terminal, cuando el no terminal aparece en la parte derecha de una producción con un símbolo terminal a su derecha.4040
Vas muy bien
Fallo en el cálculo de seguidores de un no terminal, cuando el no terminal aparece en la parte derecha de una producción y a su derecha no hay nada o todo lo que hay se puede anular.4444
No hay ejemplos
Fallo en el cálculo de seguidores de un no terminal. Se han indicado símbolos seguidores que no lo son.0808
No hay ejemplos
Análisis Descendente Símbolos de Predicción Fallo en el cálculo de los símbolos de predicción de una producción, cuando su parte derecha comienza por un terminal.8484
No hay ejemplos
Fallo en el cálculo de los símbolos de predicción de una producción, cuando su parte derecha comienza por un no terminal anulable y no indica sus iniciales.4848
No hay ejemplos
Fallo en el cálculo de los símbolos de predicción de una producción, cuando su parte derecha comienza por un no terminal anulable y el símbolo indicado no pertenece a este.4040
Vas muy bien
Fallo en el cálculo de los símbolos de predicción de una producción, cuando los símbolos de su parte derecha son todos anulables.0808
No hay ejemplos
Fallo en el cálculo de los símbolos de predicción de una producción. Se han indicado símbolos de predicción que no lo son.012012
No hay ejemplos
Tabla LL1 Fallo al rellenar la Tabla de análisis LL1, al manejar producciones que comienzan por terminal.0808
No hay ejemplos
Fallo al rellenar la Tabla de análisis LL1, al manejar producciones que comienzan por un no terminal anulable, olvidando sus iniciales.8484
No hay ejemplos
Fallo al rellenar la Tabla de análisis LL1, al manejar producciones que comienzan por un no terminal anulable y no pertenece a este.4444
No hay ejemplos
Fallo al rellenar la Tabla de análisis LL1, al manejar producciones en los que todos los símbolos de la parte derecha son anulables.0808
No hay ejemplos
Fallo al rellenar la Tabla de análisis LL1. Ha cometido errores al rellenar la tabla.024024
No hay ejemplos
Análisis Ascendente Tabla SLR1 Fallo al construir la Tabla de análisis ascendente SLR1 (parte de acción), al calcular los estados del autómata que reconoce prefijos viables.0404
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente SLR1 (parte de acción), al determinar los símbolos que producen transición.0404
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente SLR1 (parte de acción), al tratar el símbolo delimitador de fin de cadena (dolar), no hay reducciones/desplazamientos asociados a dicho símbolo.4040
Vas muy bien
Fallo al construir la Tabla de análisis ascendente SLR1 (parte de acción), al calcular el primer estado del autómata que reconoce prefijos viables.0404
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente SLR1 (parte de ir a), al no determinar bien los símbolos que producen cambio de estado tras una reducción.0404
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente SLR1 (parte de acción). Se han indicado acciones erróneas.0404
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente SLR1 (parte de ir a). Se han indicado cambios de estado erróneos.0404
No hay ejemplos
Warning al construir la Tabla de análisis ascendente SLR1 (parte de acción). Se han omitido desplazamientos. 0404
No hay ejemplos
Warning al construir la Tabla de análisis ascendente SLR1 (parte de acción). Se han omitido reducciones.0404
No hay ejemplos
Warning al construir la Tabla de análisis ascendente SLR1 (parte de acción). Se han omitido error o el estado de aceptación de la cadena analizada.0404
No hay ejemplos
Warning al construir la Tabla de análisis ascendente SLR1 (parte de ir a). Se han omitido cambios de estado.0404
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente SLR1. Se comenten errores a la hora de construir la Tabla.0404
No hay ejemplos
Tabla LR1 Fallo al construir la Tabla de análisis ascendente LR1 (parte de acción), al calcular los estados del autómata que reconoce prefijos viables.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LR1 (parte de acción), al determinar los símbolos que producen transición.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LR1 (parte de acción), al tratar el símbolo delimitador de fin de cadena (dolar), no hay reducciones/desplazamientos asociados a dicho símbolo.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LR1 (parte de acción), al calcular el primer estado del autómata que reconoce prefijos viables.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LR1 (parte de ir a), al no determinar bien los símbolos que producen cambio de estado tras una reducción.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LR1 (parte de acción). Se han indicado acciones erróneas.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LR1 (parte de ir a). Se han indicado cambios de estado erróneos.0101
No hay ejemplos
Warning al construir la Tabla de análisis ascendente LR1 (parte de acción). Se han omitido desplazamientos. 0101
No hay ejemplos
Warning al construir la Tabla de análisis ascendente LR1 (parte de acción). Se han omitido reducciones.0101
No hay ejemplos
Warning al construir la Tabla de análisis ascendente LR1 (parte de acción). Se han omitido error o el estado de aceptación de la cadena analizada.0101
No hay ejemplos
Warning al construir la Tabla de análisis ascendente LR1 (parte de ir a). Se han omitido cambios de estado.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LR1. Se comenten errores a la hora de construir la Tabla.0101
No hay ejemplos
Tabla LALR1 Fallo al construir la Tabla de análisis ascendente LALR1 (parte de acción), al calcular los estados del autómata que reconoce prefijos viables.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LALR1 (parte de acción), al determinar los símbolos que producen transición.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LALR1 (parte de acción), al tratar el símbolo delimitador de fin de cadena (dolar), no hay reducciones/desplazamientos asociados a dicho símbolo.1010
Vas muy bien
Fallo al construir la Tabla de análisis ascendente LALR1 (parte de acción), al calcular el primer estado del autómata que reconoce prefijos viables.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LALR1 (parte de ir a), al no determinar bien los símbolos que producen cambio de estado tras una reducción.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LALR1 (parte de acción). Se han indicado acciones erróneas.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LALR1 (parte de ir a). Se han indicado cambios de estado erróneos.0101
No hay ejemplos
Warning al construir la Tabla de análisis ascendente LALR1 (parte de acción). Se han omitido desplazamientos. 0101
No hay ejemplos
Warning al construir la Tabla de análisis ascendente LALR1 (parte de acción). Se han omitido reducciones.0101
No hay ejemplos
Warning al construir la Tabla de análisis ascendente LALR1 (parte de acción). Se han omitido error o el estado de aceptación de la cadena analizada.0101
No hay ejemplos
Warning al construir la Tabla de análisis ascendente LALR1 (parte de ir a). Se han omitido cambios de estado.0101
No hay ejemplos
Fallo al construir la Tabla de análisis ascendente LALR1. Se comenten errores a la hora de construir la Tabla.0101
No hay ejemplos


Cómo se hizo Proletool

[ Inicio ]
Tecnologías utilizadas en PROLETOOL: