Expresiones aritméticas transformación gramatical

9

En el artículo Parsing Expressions by Recursive Descent de Theodore Norvell (1999), el autor comienza con la siguiente gramática para expresiones aritméticas:

E --> E "+" E | E "-" E | "-" E | E "*" E | E "/" E | E "^" E | "(" E ")" | v

lo cual es bastante malo, porque es ambiguo y recursivo a la izquierda. Entonces comienza a eliminar la recursión izquierda de él, y su resultado es como tal:

E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^"
U --> "-"

Pero no puedo entender cómo llegó a este resultado. Cuando trato de eliminar la recursividad izquierda, lo hago de la siguiente manera:

  1. Primero, agrupé las producciones que no han dejado recursividad en un grupo, y otras (recursivas a la izquierda) en otro grupo:

    E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E     // L-recursive
    E --> v | "(" E ")" | "-" E
  2. A continuación, los nombro y factor para manipulaciones más fáciles:

    E --> E B E  // L-recursive; B stands for "Binary operator"
    E --> P  // not L-recursive; P stands for "Primary Expression"
    P --> v | "(" E ")" | U E   // U stands for "Unary operator"
    B --> "+" | "-" | "*" | "/" | "^"
    P --> "-"

    Ahora solo necesito lidiar con las dos primeras producciones, que ahora son más fáciles de manejar.

  3. Reescribo esas dos primeras producciones comenzando desde la producción no L-recursiva (que es simplemente P, la expresión primaria) y siguiendo por la cola opcional T, que defino como el resto de la producción original menos el primer no terminal recursivo izquierdo (es decir, solo B E) seguido de la cola T, o que podría estar vacío:

    E --> P T
    T --> B E T |

    (tenga en cuenta la alternativa vacía para la cola).

  4. Estas dos producciones ahora las puedo reescribir en EBNF así:

    E --> P {B E}

    que es casi lo que obtiene el autor, pero tengo en Elugar de Pallí dentro del patrón de repetición cero o más (la Cola). Las otras producciones me dan lo mismo que él tiene:

    P --> v | "(" E ")" | U E
    B -> "+" | "-" | "*" | "/" | "^"
    U -> "-"

    pero aquí también tengo en Elugar de Pen la primera producción para P.

Entonces, mi pregunta es: ¿qué me estoy perdiendo? ¿Qué transformación algebraica en la sintaxis necesito proceder ahora para obtener la misma forma exacta que obtiene el autor? Intenté sustituciones por E, pero solo me lleva a bucles. Sospecho que necesito sustituirlo Pde alguna manera E, pero no conozco ninguna transformación legal que lo justifique. ¿Quizás sabes cuál es el último paso que falta?

SasQ
fuente
Considere usar LaTeX para formatear. Ver aquí para una introducción . (Vea aquí una discusión sobre la idoneidad de LaTeX en este caso).
Raphael

Respuestas:

8

El paso que falta:

E --> P T
T --> B E T |

reescribe E en T:

E --> P T
T --> B P T T | 

Simplifica T:

E --> P T
T --> B P T | 

Equivalente a:

E --> P T
T --> {B P}

Y ahi estas.

kena
fuente
1
Gracias por una buena respuesta :-) Ahora veo lo que me he perdido: lo sustituí al revés y ese fue el problema. Pero aún no entiendo una pequeña pieza: ¿Cómo sabes que puedes fusionar los Ts juntos en uno T? ¿Hay alguna regla para eso? (Sospecho que podría ser de alguna manera similar a la regla en la lógica algebraica booleana que dice "aa = a".)
SasQ
Por cierto, ¿por qué esta publicación se ha movido aquí desde cstheory.sx y cuál es la diferencia? Me gustaría saber para evitar errores en el futuro.
SasQ
2
@SasQ CSTheory es solo para preguntas de nivel de investigación en informática teórica, consulte las preguntas frecuentes de CSTheory para más detalles.
Juho
1
TXTTεXTXTεLL=LLεL+L+L+
@Raphael: ¿Tiene eso algo que ver con la regla de idempotencia *? Vi en "Dragon Book" (3.3, p.91) eso x** = x*. ¿Es esa la misma regla que usaste?
SasQ