diff --git a/Hazard/Hazard/CParser.cpp b/Hazard/Hazard/CParser.cpp index b876f2f..227a181 100644 --- a/Hazard/Hazard/CParser.cpp +++ b/Hazard/Hazard/CParser.cpp @@ -8,7 +8,9 @@ using namespace std; #define Getc(s) getc(s) #define Ungetc(c) {ungetc(c,IP_Input); ugetflag=1;} - +extern unsigned int dimension; +extern unsigned int numElements; +extern bool KNF; // Adds a character to the string value void CParser::PushString(char c) @@ -48,14 +50,18 @@ void CParser::pr_tokentable() } //------------------------------------------------------------------------ -int CParser::yyparse() +int CParser::yyparse(PrimImplikantCollection* &pic, vector* &variables) { + bool KNFset = false; int tok; if(prflag)fprintf(IP_List,"%5d ",(int)IP_LineNumber); + /* * Go parse things! */ parsestate pState = P_START; + + while ((tok=yylex())!=0){ switch (pState) { @@ -74,7 +80,8 @@ int CParser::yyparse() switch(tok) { case IDENTIFIER: - printf("Variable %s",yylval.s.c_str()); + printf("Variable %s\n", yylval.s.c_str()); + variables->push_back(yylval.s.c_str()); break; case TERMS: pState = P_TERMS_KEY; @@ -85,10 +92,12 @@ int CParser::yyparse() switch(tok) { case STRING1: - printf("Term Key %s",yylval.s.c_str()); + printf("Term Key %s\n", yylval.s.c_str()); + pic->add(yylval.s.c_str()); break; case INTEGER1: - printf("Term Key %d",yylval.i); + printf("Term Key %d\n",yylval.i); + pic->add(yylval.i); break; case (int)'>': pState = P_TERMS_VALUE; @@ -101,13 +110,23 @@ int CParser::yyparse() case P_TERMS_VALUE: if (tok == INTEGER1) { - printf("Term Value %d",yylval.i); + if (!KNFset) + KNF = (yylval.i == 0); + else if ((yylval.i == 0) ^ KNF) + { + printf("*** FATAL ERROR *** You can only define either KNF or DNF!\n"); + return 1; + } + + printf("Term Value %d\n\n",yylval.i); pState = P_TERMS_KEY; } break; } - printf("\n"); } + + dimension = variables->size(); + numElements = (unsigned int)pow(2.0f, (int)dimension); return 0; } diff --git a/Hazard/Hazard/Cparser.h b/Hazard/Hazard/Cparser.h index 7c6e806..5ca4202 100644 --- a/Hazard/Hazard/Cparser.h +++ b/Hazard/Hazard/Cparser.h @@ -5,6 +5,8 @@ #pragma warning(disable:4786) #include #include +#include "PrimImplikantCollection.h" + using namespace std; #define Getc(s) getc(s) @@ -43,11 +45,11 @@ public: map IP_revToken_table; //reverse Tokendefinitions + int CParser::yyparse(PrimImplikantCollection* &pic, vector* &variables); //parser int CParser::yylex(); //lexial analyser void CParser::yyerror(char *ers); //error reporter int CParser::IP_MatchToken(string &tok); //checks the token void CParser::InitParse(FILE *inp,FILE *err,FILE *lst); - int CParser::yyparse(); //parser void CParser::pr_tokentable(); //test output for tokens void CParser::IP_init_token_table(); //loads the tokens void CParser::Load_tokenentry(string str,int index);//load one token diff --git a/Hazard/Hazard/Hazard.cpp b/Hazard/Hazard/Hazard.cpp index 49de994..d0e3101 100644 --- a/Hazard/Hazard/Hazard.cpp +++ b/Hazard/Hazard/Hazard.cpp @@ -8,27 +8,34 @@ #include "CParser.h" #include "PrimImplikant.h" #include "PrimImplikantCollection.h" +#include "Cell.h" + +using namespace std; + +unsigned int dimension = 0; +unsigned int numElements = 0; +bool KNF = false; int _tmain(int argc, _TCHAR* argv[]) { FILE * input; FILE * error; FILE * list; - fopen_s(&input, "input.txt", "r"); + fopen_s(&input, "..\\res\\input.txt", "r"); if (input == 0) { cout << "Fehler Inputdatei"; system("pause"); return -1; } - fopen_s(&error, "error.txt", "w"); + fopen_s(&error, "..\\res\\error.txt", "w"); if (error == 0) { cout << "Fehler Fehlerdatei"; system("pause"); return -1; } - fopen_s(&list, "list.txt", "w"); + fopen_s(&list, "..\\res\\list.txt", "w"); if (list == 0) { cout << "Fehler Listdatei"; @@ -36,15 +43,18 @@ int _tmain(int argc, _TCHAR* argv[]) return -1; } + PrimImplikantCollection* globalPIC = new PrimImplikantCollection(); + vector* variables = new vector(); + CParser parser; parser.IP_init_token_table(); parser.pr_tokentable(); parser.InitParse(input, error, list); - parser.yyparse(); + if (parser.yyparse(globalPIC, variables) != 0) + return 1; system("pause"); - PrimImplikantCollection pic; - pic.add(7); + /*pic.add(7); pic.add("0x1"); pic.add("100"); pic.add("00x"); @@ -54,19 +64,26 @@ int _tmain(int argc, _TCHAR* argv[]) PrimImplikant prim13("0x1"); PrimImplikant prim4("100"); PrimImplikant prim4567("1xx"); - pic.add(prim4567); + pic.add(prim4567);*/ - for (int p = 0; p < 8; p++) + /*for (int p = 0; p < numElements; p++) { //printf("Pos %d: prim7=%d, prim13=%d, prim4=%d, prim4567=%d, pic=%d\n", p, prim7.valueAt(p), prim13.valueAt(p), prim4.valueAt(p), prim4567.valueAt(p), pic.valueAt(p)); printf("Pos %d: Matching collections: ", p); - vector matchingPIs = pic.primImplikantenAt(p); - for (vector::iterator i = matchingPIs.begin(); i < matchingPIs.end(); i++) + PrimImplikantCollection matchingPIs = globalPIC->primImplikantenAt(p); + for (int i = 0; i < matchingPIs.size(); i++) //cout << i->name < ", "; - printf("%s, ", i->name.c_str()); + printf("%s, ", matchingPIs[i]->name.c_str()); cout << endl; - } + }*/ + vector cells; + cells.resize(numElements); + for (int i = 0; i < numElements; i++) + { + cells[i] = new Cell(i, globalPIC); + printf("Pos %2d: %d\n", i, cells[i]->value); + } system("pause"); return 0; diff --git a/Hazard/Hazard/Hazard.vcxproj b/Hazard/Hazard/Hazard.vcxproj index ab44f0a..10fce30 100644 --- a/Hazard/Hazard/Hazard.vcxproj +++ b/Hazard/Hazard/Hazard.vcxproj @@ -79,7 +79,8 @@ - + + diff --git a/Hazard/Hazard/Hazard.vcxproj.filters b/Hazard/Hazard/Hazard.vcxproj.filters index 19d8c5e..e1340cd 100644 --- a/Hazard/Hazard/Hazard.vcxproj.filters +++ b/Hazard/Hazard/Hazard.vcxproj.filters @@ -30,7 +30,10 @@ Headerdateien - + + Headerdateien + + Headerdateien diff --git a/Hazard/Hazard/input.txt b/Hazard/Hazard/input.txt deleted file mode 100644 index 574db0a..0000000 --- a/Hazard/Hazard/input.txt +++ /dev/null @@ -1,6 +0,0 @@ -Variables: a, b, c, d -Terms: -"0010">1 -7>1 -1234>1 -"0123">1 \ No newline at end of file diff --git a/Hazard/Hazard/error.txt b/Hazard/res/error.txt similarity index 100% rename from Hazard/Hazard/error.txt rename to Hazard/res/error.txt diff --git a/Hazard/res/input.txt b/Hazard/res/input.txt index 574db0a..d03ea75 100644 --- a/Hazard/res/input.txt +++ b/Hazard/res/input.txt @@ -2,5 +2,6 @@ Variables: a, b, c, d Terms: "0010">1 7>1 -1234>1 -"0123">1 \ No newline at end of file +14>1 +"01xx">1 +"x000">1 \ No newline at end of file diff --git a/Hazard/Hazard/list.txt b/Hazard/res/list.txt similarity index 100% rename from Hazard/Hazard/list.txt rename to Hazard/res/list.txt