Domanda

Questo è un follow-up domanda da Grammatica: differenza tra una verso il basso in alto e in basso?

Ho capito da questa domanda che:

  • la grammatica in sé non è top-down o bottom-up, il parser è
  • ci sono le grammatiche che può essere analizzato da uno ma non l'altro
  • (grazie Jerry Coffin

Quindi, per questa grammatica (tutte le possibili formule matematiche):

    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 

Questa sarebbe leggibile da un basso alto e in basso fino parser?

Potresti dire che questo è un top-down di grammatica o di un basso verso l'alto la grammatica (o nessuno)?


sto chiedendo perché ho una domanda compiti a casa che chiede:

  

"Write top-down e bottom-up grammatiche per la lingua che consiste di tutti ..." (domanda diversa)

Non sono sicuro se questo può essere corretto in quanto sembra che non v'è alcuna cosa come un top-down e bottom-up la grammatica. Qualcuno potrebbe chiarire?

È stato utile?

Soluzione

che la grammatica è stupido, perché unisce Lexing e l'analisi come uno. Ma ok, è un esempio accademico.

La cosa con fondi-up e top-down è che è ha casi d'angolo speciali che sono difficili da realizzare con voi normale avanti 1 look. probabilmente Penso che si dovrebbe verificare se ha dei problemi e cambiare la grammatica.

Per capire la grammatica ho scritto un EBNF corretta

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'; 

In particolare mi non mi piace la regola digits: digits digits. Non è chiaro dove le prime cifre inizia e la seconda estremità. Vorrei implementare la regola come

digits:
    '0' |
    digit |
    digits digit;

Un altro problema è number: '0' | digit digits; Questo conflitto con digits: '0' e digits: digit;. È un dato di fatto che è duplicato. Vorrei cambiare le regole per (rimozione cifre):

number:
    '0' |
    digit |
    digit zero_digits;

zero_digits:
    zero_digit |
    zero_digits zero_digit;

zero_digit:
    '0' |
    digit;

Questo rende la grammatica LR1 (ricorsiva sinistra con uno sguardo in avanti) e il contesto libero. Questo è quello che normalmente dare ad un generatore di parser, come bisonti. E dal momento che il bisonte è Bottoms Up, questo è un input valido per un parser di fondo-up.

Per un approccio top-down, almeno per ricorsiva decente, ricorsiva sinistra è un po 'un problema. È possibile utilizzare di nuovo rotolo, se vi piace, ma per questi si desidera una grammatica (ricorsiva destra uno sguardo al futuro) RR1. Per fare questo scambio i ricorsioni:

zero_digits:
    zero_digit |
    zero_digit zero_digits;

Non sono sicuro se questo risposte che domanda. Credo che la domanda è mal formulata e fuorviante; e scrivo parser per vivere ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top