2010-07-05 35 views
7

Esta es una pregunta de seguimiento de Grammar: difference between a top down and bottom up?Gramática: ¿diferencia entre arriba hacia abajo y hacia abajo? (Ejemplo)

que entiendo de esa pregunta que:

  • la gramática en sí no es de arriba hacia abajo o de abajo hacia arriba, el analizador es
  • hay gramáticas que se puedan analizar por uno pero no el otro
  • (gracias Jerry Coffin

Así que para esta gramática (todo el POS fórmulas matemáticas posibles):

E -> E T E 
    E -> (E) 
    E -> D 

    T -> + | - | * |/

    D -> 0 
    D -> L G 

    G -> G G  
    G -> 0 | L 

    L -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

¿Podría ser leído por un analizador descendente y ascendente?

¿Podría decir que es una gramática descendente o una gramática ascendente (o ninguna)?


Me pregunto porque tengo una pregunta tareas que pregunta:

"Escritura de arriba hacia abajo y de abajo hacia arriba gramáticas de la lengua consiste en todo ..." (pregunta diferente)

No estoy seguro de si esto puede ser correcto ya que parece que no existe una gramática de arriba hacia abajo y de abajo hacia arriba. ¿Alguien podría aclarar?

+0

¿Pueden responder la pregunta completa? Tal vez algo se aclarará. –

+0

Tal vez sería útil buscar lo que el libro de texto define como una gramática "descendente". Creo que los analizadores de arriba hacia abajo solo fallan cuando hacen algo así como el descenso recursivo en lugar de una técnica similar a la amplitud de búsqueda (por ejemplo, los bordes de la cola para intentar). – gatoatigrado

Respuesta

5

Esa gramática es estúpida, ya que une el lexing y el análisis como uno solo. Pero está bien, es un ejemplo académico.

La cosa con la parte inferior hacia arriba y hacia arriba es que tiene fundas de esquina especiales que son difíciles de implementar con usted normal 1 mirada hacia adelante. Probablemente creo que debes verificar si tiene algún problema y cambiar la gramática.

Para entender que la gramática EBNF escribí una adecuada

expr: 
    expr op expr | 
    '(' expr ')' | 
    number; 

op: 
    '+' | 
    '-' | 
    '*' | 
    '/'; 

number: 
    '0' | 
    digit digits; 

digits: 
    '0' | 
    digit | 
    digits digits; 

digit: 
    '1' | 
    '2' | 
    '3' | 
    '4' | 
    '5' | 
    '6' | 
    '7' | 
    '8' | 
    '9'; 

En especial no me gusta la regla digits: digits digits. No está claro dónde comienzan los primeros dígitos y el segundo finaliza. Yo pondría en práctica la regla como

digits: 
    '0' | 
    digit | 
    digits digit; 

Otro problema es number: '0' | digit digits; Esto entra en conflicto con digits: '0' y digits: digit;. De hecho, eso está duplicado. Me gustaría cambiar las reglas para (eliminación de dígitos):

number: 
    '0' | 
    digit | 
    digit zero_digits; 

zero_digits: 
    zero_digit | 
    zero_digits zero_digit; 

zero_digit: 
    '0' | 
    digit; 

Esto hace que la gramática LR1 (recursiva por la izquierda, con una mirada hacia el futuro) y libre de contexto. Esto es lo que normalmente le daría a un generador de analizador sintáctico, como el bisonte. Y como bison está en la parte inferior, esta es una entrada válida para un analizador de abajo hacia arriba.

Para un enfoque de arriba hacia abajo, al menos para el recursivo decente, el recursivo izquierdo es un problema. Puede usar la función de retrotracción, si lo desea, pero para estos desea una gramática RR1 (recursivo derecho una mirada hacia adelante).Para hacer eso, cambie las recursiones:

zero_digits: 
    zero_digit | 
    zero_digit zero_digits; 

No estoy seguro de que la respuesta a su pregunta. Creo que la pregunta está mal formulada y es engañosa; y escribo analizadores para ganarse la vida ...

Cuestiones relacionadas