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;
}
Exemple #2
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);
  }
}