Para aclarar en lo posible el funcionamiento de los analizadores sintácticos generados por ICE, usaremos un ejemplo tomado de [Vilares 93].
Se trata de analizar la entrada , según la siguiente gramática en la que es el símbolo inicial, las letras minúsculas son los componentes léxicos y las letras mayúsculas los no terminales:
En la figura A.1 se muestra el autómata LALR(1) reconocedor de la gramática . En [Aho et al. 90] se encuentra una buena descripción de cómo construir reconocedores de este tipo. Como la gramática es ambigua, en el estado 2 se producen 3 conflictos reducción-reducción. Esto se traduce en el ejemplo en tres derivaciones válidas para reconocer la entrada abdc, que son las siguientes:
Figure A.1: Autómata LALR(1) reconocedor de la gramática .
Al comenzar, el algoritmo añade automáticamente el item (en Earley sería el item asociado a ]). En la tabla A.1 se muestran los items involucrados en el proceso de análisis de nuestra entrada. En este momento estamos en el estado inicial 0 del autómata LALR(1).
Del item pasamos al item aplicando una operación predictor.
Ya que el punto está justo antes de la a y el siguiente componente léxico de entrada es precisamente a, aplicamos el operador scanner según Earley, con lo que obtenemos , el primer item del itemset correspondiente al componente léxico en la posición 1. Este item en Earley estaría asociado a ; a su vez, la máquina LALR(1) indica una transición al estado 1 con a. Por tanto, el estado actual es el estado 1.
Como el punto está justo antes de b y el siguiente componente léxico en la entrada es b, aplicamos la operación scanner con lo que obtenemos , el primer item del itemset correspondiente al componente léxico en la posición 2. Como el reconocedor LALR(1) indica una transición al estado 2 con b, el estado actual pasa a ser el estado 2.
En este estado se produce un triple conflicto de reducción, ya que se puede reducir indistintamente por las reglas R2, R3 y R4 para reconocer la cadena de entrada. YACC, que implemeta un reconocedor determinista LALR(1), resolvería este conflicto reduciendo por la primera regla e ignorando el resto. Sin embargo ICE, debido a su carácter no determinista, es capaz de tratar con ambigüedades como ésta y crear una estructura que representa los tres posibles árboles de análisis sintáctico con la mayor compartición posible.
Table: Desarrollo para la entrada w = abde en la gramática .
En el estado 2, aplicando el operador predictor con la regla R2, obtendríamos , en Earley asociado a ). El segundo y tercer elemento de se deben a que hasta el momento en este estado tan sólo se ha reconocido la entrada hasta b y a que el itemset que contiene el primer componente léxico derivado de b es .
El proceso que se seguiría a partir de aquí en caso elegir las reglas R3 o R4 para aplicar con predictor es análogo al que se va a mostrar a continuación. Es por ello que no se van a explicar esos dos caminos alternativos, ya que se alargaría demasiado el ejemplo y realmente no aportan nada nuevo a la comprensión del proceso.
En la situación actual, aplicamos el operador predictor con la regla R5 para volver a obtener .
Ahora podemos aplicar el operador completer para obtener . Con ello hemos reconocido el no terminal C en el itemset . Como la máquina LALR(1) indica que con C hay una transición al estado 3, éste pasa a ser el estado actual.
Al aplicar el operador predictor obtenemos que estaría asociado en Earley a ; como el punto está justo delante de la d y el siguiente componente léxico en la entrada es precisamente d, aplicamos la operación scanner con lo que obtenemos que es el primer item del itemset . El estado actual pasa a ser el 6 ya que así lo indica una transición el reconocedor LALR.
En el estado 6 aplicamos otra vez scanner para reconocer e y obtener el item asociado según el algoritmo de Earley a ; el autómata LALR, por su parte, indica una transición al estado 13.
Ahora, según el algoritmo de Earley deberíamos realizar una operación completer. Para ello se utiliza el puntero de retroceso . Sin embargo, el significado del puntero de retroceso en ICE es diferente al que tiene en Earley. ICE, a diferencia de Earley, utiliza las transiciones de tipo 4 para regresar al estado donde se aplicó el predictor de F (el estado 3) y genera un item que indica el reconocmiento de F en ese estado con el mismo puntero de retroceso que cuando se hizo el predictor. El item obtenido tiene por tanto la forma . Este item estaría asociado en Earley a , por lo que a su vez ahora se debe relizar la operación completer para reconocer B.
Como el predictor para B se hizo en el estado 2 con puntero de retroceso , el item resultante es que en Earley estaría asociado a con lo cual se debe realizar el completer para reconocer A.
Debido a que la operación predictor para A tuvo lugar en el estado 0 y que el puntero de retroceso utilizado en ella había sido , se obtiene el item que en Earley estaría asociado a con lo que estamos en condiciones de realizar un scanner sobre el delimitador final de la cadena. Por su parte, el reconocedor LALR(1) indica una transición al estado 8.
Al realizar el scanner de obtenemos el item . La regla asociada según Earley sería , que indica el reconocimiento de toda la cadena de entrada. Efectivamente, el autómata indica que con se debe realizar una transición al estado 9, que es un estado de aceptación, con lo cual finaliza el proceso.
La descripción que se ha realizado aquí del ejemplo es diferente a la contenida en [Vilares 93] ya que se ha tratado sobre todo de facilitar la comprensión rehuyendo de los estrictos formalismos de las transiciones en , aunque para conseguirlo se haya tenido que tomar una más que discutible asimilación del comportamiento de ICE al del algoritmo Earley con el añadido de un autómata LALR(1). La descripción completamente formal puede encontrarse en [Vilares 93].