int interpretiere(Kommando k, int forkexec) { int status; switch (k->typ) { case K_LEER: return 0; case K_EINFACH: return interpretiere_einfach(k, forkexec); case K_SEQUENZ: { Liste l = k->u.sequenz.liste; while (!listeIstleer(l)) { status = interpretiere((Kommando) listeKopf(l), forkexec); l = listeRest(l); } } return status; case K_PIPE: { Liste l = k->u.sequenz.liste; status = interpretiere_pipeline(l, forkexec); } return status; case K_UND: { Liste l = k->u.sequenz.liste; while (!listeIstleer(l)) { status = interpretiere((Kommando) listeKopf(l), forkexec); if(status < 0) { /* fputs("Fehler, fehler\n", stderr); */ break; } l = listeRest(l); } } return status; case K_ODER: { Liste l = k->u.sequenz.liste; while (!listeIstleer(l)) { status = interpretiere((Kommando) listeKopf(l), forkexec); if(status >= 0) { /* fputs("Fehler, fehler\n", stderr); */ break; } l = listeRest(l); } } return status; default: fputs("unbekannter Kommandotyp, Bearbeitung nicht implementiert\n", stderr); break; } return 0; }
void Parser::naechsteZeile() { std::fstream OPCodes; OPCodes.open(Pfad, std::ios::in); //öffnen des Lesestreams //Springen zur richtigen Zeile und auslesen for (int i = 0; i < aktuelleZeile; i++) { std::getline(OPCodes, Zeile); //Auslesen in die Variable Zeile } //-- //Umwandlung von lowercase in uppercase for (unsigned int i = 0; i < Zeile.length(); i++) { Zeile[i] = toupper(Zeile[i]); } //-- //aktuellenZeilen Counter erhöhen, falls das Ende der txt noch nicht erreicht wurde if( !OPCodes.eof() ) { //cout << Zeile << endl; //Debugausgabe aktuelleZeile++; } else { //cout << "EOF" << endl; //Debugausgabe } //-- //Unterscheidung ob zu interprätierender Text oder das Ende der Datei vorhanden ist if (!OPCodes.eof()) { //Einsprung in die interpretiere Funktion interpretiere(Zeile); } else { //bei Ende der Datei (Case -1 vorweggenommen) befehl.setBefehlNr(-1); } //-- OPCodes.close(); }
int main(int argc, char *argv[]){ int zeigen=0, ausfuehren=1; int status, i; init_signalbehandlung(); yydebug=0; for(i=1; i<argc; i++){ if (!strcmp(argv[i],"--zeige")) zeigen=1; else if (!strcmp(argv[i],"--noexec")) ausfuehren=0; else if (!strcmp(argv[i],"--yydebug")) yydebug=1; else { fprintf(stderr, "Aufruf: %s [--zeige] [--noexec] [--yydebug]\n", argv[0]); exit(1); } } wsp=wortspeicherNeu(); while(1){ int res; fputs(">> ", stdout); fflush(stdout); res=yyparse(); if(res==0){ if(zeigen) kommandoZeigen(k); if(ausfuehren) status=interpretiere(k, 1); if(zeigen) fprintf(stderr, "Status: %d\n", status); kommandoLoeschen(k); } else { fputs("Fehlerhaftes Kommando\n", stderr); } wortspeicherLeeren(wsp); } }