next up previous contents
Next: A.1.3 El bosque compartido Up: A.1 El análisis no Previous: A.1.1 El núcleo de

Un ejemplo sencillo

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 tex2html_wrap_inline13393, según la siguiente gramática tex2html_wrap_inline13257 en la que tex2html_wrap_inline13251 es el símbolo inicial, las letras minúsculas son los componentes léxicos y las letras mayúsculas los no terminales:


tabular6488

En la figura A.1 se muestra el autómata LALR(1) reconocedor de la gramática tex2html_wrap_inline13257. 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:


tabular6504

  figure6508
Figure A.1: Autómata LALR(1) reconocedor de la gramática tex2html_wrap_inline13257.

Al comenzar, el algoritmo añade automáticamente el item tex2html_wrap_inline13465 (en Earley sería el item asociado a tex2html_wrap_inline13467]). 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 tex2html_wrap_inline13469 pasamos al item tex2html_wrap_inline13471gif 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 tex2html_wrap_inline13479, el primer item del itemset tex2html_wrap_inline13481 correspondiente al componente léxico en la posición 1gif. Este item en Earley estaría asociado a tex2html_wrap_inline13483; 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 tex2html_wrap_inline13491, el primer item del itemset tex2html_wrap_inline13493 correspondiente al componente léxico en la posición 2gif. 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 posiblegif.

  table6575
Table: Desarrollo para la entrada w = abdetex2html_wrap_inline13505 en la gramática tex2html_wrap_inline13257.

En el estado 2, aplicando el operador predictor con la regla R2, obtendríamos tex2html_wrap_inline13511, en Earley asociado a tex2html_wrap_inline13513). El segundo y tercer elemento de tex2html_wrap_inline13515 se deben a que hasta el momento en este estado tan sólo se ha reconocido la entrada hasta bgif y a que el itemset que contiene el primer componente léxico derivado de b es tex2html_wrap_inline13481gif.

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 tex2html_wrap_inline13511.

Ahora podemos aplicar el operador completer para obtener tex2html_wrap_inline13535. Con ello hemos reconocido el no terminal C en el itemset tex2html_wrap_inline13493gif. 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 tex2html_wrap_inline13545 que estaría asociado en Earley a tex2html_wrap_inline13547 ; 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 tex2html_wrap_inline13553 que es el primer item del itemset tex2html_wrap_inline13555gif. 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 tex2html_wrap_inline13561 asociado según el algoritmo de Earley a tex2html_wrap_inline13563; 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 tex2html_wrap_inline13569. Este item estaría asociado en Earley a tex2html_wrap_inline13571, 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 tex2html_wrap_inline13493, el item resultante es tex2html_wrap_inline13579 que en Earley estaría asociado a tex2html_wrap_inline13581 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 tex2html_wrap_inline13587, se obtiene el item tex2html_wrap_inline13589 que en Earley estaría asociado a tex2html_wrap_inline13591 con lo que estamos en condiciones de realizar un scanner sobre el delimitador final de la cadenagif. Por su parte, el reconocedor LALR(1) indica una transición al estado 8.

Al realizar el scanner de tex2html_wrap_inline13505 obtenemos el item tex2html_wrap_inline13601. La regla asociada según Earley sería tex2html_wrap_inline13603, que indica el reconocimiento de toda la cadena de entrada. Efectivamente, el autómata indica que con tex2html_wrap_inline13505 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 tex2html_wrap_inline13263, 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].


next up previous contents
Next: A.1.3 El bosque compartido Up: A.1 El análisis no Previous: A.1.1 El núcleo de

Miguel A. Alonso Pardo
Thu Nov 20 16:47:01 CET 1997