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 gli operatori fine e in qualsiasi ordine, ma il mio problema è che posso reindirizzare due volte con nessun errore, come ad esempio "ls> Registro> log2"

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

È stato utile?

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.

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