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 in Ordnung und in beliebiger Reihenfolge verwenden, aber mein Problem ist, ich zweimal ohne Fehler umleiten kann, wie „ls> log> log2“

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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top