yacc, applicando unica regola una volta
Domanda
Sto cercando di scrivere un guscio con yacc e Lex e sto correndo in alcuni problemi con i miei redirector I / O. Attualmente, posso usare il
Il mio codice regola è al di sotto, qualcuno mi può dare alcuni suggerimenti su come risolvere questo problema? Grazie!
io_mod:
iomodifier_opt io_mod
|
;
iomodifier_opt:
GREAT WORD {
printf(" Yacc: insert output \"%s\"\n", $2);
Command::_currentCommand._outFile = $2;
}
|
LESS WORD {
printf(" Yacc: insert input \"%s\"\n", $2);
Command::_currentCommand._inputFile = $2;
}
| /* can be empty */
;
EDIT:. Dopo aver parlato con il mio TA, ho imparato che non ho effettivamente bisogno di avere solo 1 modificatore per il mio comando e che io in realtà può avere più copie dello stesso redirezione I / O
Soluzione
Ci sono due approcci:
(1) Modificare la grammatica in modo che si può avere solo uno di ogni tipo di modificatore:
io_mod_opt: out_mod in_mod | in_mod out_mod | in_mod | out_mod | ;
(2) Modificare il gestore clausola per contare i modificatori e segnalare un errore se c'è più di una:
GREAT_WORD { if (already_have_output_file()) { error("too many output files: \"%s\"\n", $2) } else { /* record output file */ } }
Opzione (2) sembra destinato a portare a messaggi di errore migliori e una grammatica semplice.
Altri suggerimenti
C'è anche un terzo approccio - non preoccupatevi. Bash (sotto Cygwin) non genera un errore per:
ls > x > y
Si crea x e poi y e finisce la scrittura a.
Mi rendo conto che questo potrebbe essere solo un esercizio per imparare Lexx e yacc, ma per il resto la prima domanda è di chiedere perché che si desidera utilizzare Lexx e yacc? Qualsiasi consueto linguaggio di comando di shell ha una piuttosto semplice grammatica; cosa stai guadagnando di utilizzare un generatore LALR?
Bene, diversa complessità, difficoltà a generare buoni messaggi di errore, e alla rinfusa codice, voglio dire.