yacc, die Anwendung der Regel nur einmal
Frage
Ich versuche, eine Schale mit yacc und lex zu schreiben, und ich renne in einige Probleme mit meinem E / A-Redirector. Derzeit kann ich die Operatoren
Meine Regel Code ist unten, kann mir jemand gibt einige Tipps, wie dieses Problem beheben? Dank!
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:. Nach meinem TA sprechen, habe ich gelernt, dass ich nicht eigentlich nur ein Modifikator für meinen Befehl haben muß und dass ich tatsächlich mehrere Kopien der gleichen E / A-Umleitung
Lösung
Es gibt zwei Ansätze:
(1) ändern Sie die Grammatik, so dass Sie nur eine von jeder Art von Modifier können:
io_mod_opt: out_mod in_mod | in_mod out_mod | in_mod | out_mod | ;
(2) Ändern Sie die Klausel Handler die Modifikatoren zu zählen und einen Fehler melden, wenn es mehr als eine ist:
GREAT_WORD { if (already_have_output_file()) { error("too many output files: \"%s\"\n", $2) } else { /* record output file */ } }
Option (2) scheint wahrscheinlich bessere Fehlermeldungen und eine einfachere Grammatik führen.
Andere Tipps
Es gibt auch einen dritten Ansatz - ärgern Sie sich nicht. Bash (unter Cygwin) erzeugt keinen Fehler für:
ls > x > y
Es schafft x und y dann und endet bis zu y zu schreiben.
Ich weiß, dies könnte nur eine Übung lexx und yacc zu lernen, aber ansonsten ist die erste Frage stellen Warum wollen Sie lexx und yacc benutzen? All übliche Shell-Befehl Sprache hat eine ziemlich einfache Grammatik; was gewinnen Sie einen LALR Generator verwenden?
Nun, anders als die Komplexität, die Schwierigkeit zu erzeugen gute Fehlermeldungen und Code bulk, meine ich.