Grammatica: differenza tra un verso il basso in alto e in fondo? (Esempio)
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?
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 ??p>
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 ...