Moved from FILE* to fstream
This commit is contained in:
parent
b77e4e0127
commit
1325c11caa
5 changed files with 103 additions and 59 deletions
|
@ -3,6 +3,9 @@
|
|||
#include <vector>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include "PrimImplikantCollection.h"
|
||||
#include "CParser.h"
|
||||
using namespace std;
|
||||
|
@ -56,7 +59,7 @@ int CParser::yyparse(PrimImplikantCollection* &pic, vector<string>* &variables)
|
|||
{
|
||||
bool KNFset = false;
|
||||
int tok;
|
||||
if(prflag)fprintf(IP_List,"%5d ", IP_LineNumber);
|
||||
if(prflag) *IP_List << setw(5) << setfill('0') << IP_LineNumber;
|
||||
|
||||
/*
|
||||
* Go parse things!
|
||||
|
@ -82,11 +85,11 @@ int CParser::yyparse(PrimImplikantCollection* &pic, vector<string>* &variables)
|
|||
switch(tok)
|
||||
{
|
||||
case IDENTIFIER:
|
||||
fprintf(IP_List, "Variable %s\n", yylval.s.c_str());
|
||||
*IP_List << "Variable " << yylval.s << endl;
|
||||
variables->push_back(yylval.s.c_str());
|
||||
break;
|
||||
case TERMS:
|
||||
fprintf(IP_List, "\n", yylval.s.c_str());
|
||||
*IP_List << endl;
|
||||
pState = P_TERMS_KEY;
|
||||
break;
|
||||
}
|
||||
|
@ -95,11 +98,11 @@ int CParser::yyparse(PrimImplikantCollection* &pic, vector<string>* &variables)
|
|||
switch(tok)
|
||||
{
|
||||
case STRING1:
|
||||
fprintf(IP_List, "Term Key %s\n", yylval.s.c_str());
|
||||
*IP_List << "Term Key " << yylval.s << endl;
|
||||
pic->add(yylval.s.c_str());
|
||||
break;
|
||||
case INTEGER1:
|
||||
fprintf(IP_List, "Term Key %d\n", (unsigned int)yylval.i);
|
||||
*IP_List << "Term Key " << (unsigned int)yylval.i << endl;
|
||||
pic->add(yylval.i);
|
||||
break;
|
||||
case (int)'>':
|
||||
|
@ -120,14 +123,14 @@ int CParser::yyparse(PrimImplikantCollection* &pic, vector<string>* &variables)
|
|||
}
|
||||
else if ((yylval.i == 0) ^ KNF)
|
||||
{
|
||||
fprintf(IP_Error, "*** FATAL ERROR *** You can only define either KNF or DNF!\n");
|
||||
fprintf(IP_Error, "In line %3d: %s>%i\n", (int)IP_LineNumber, pic->back()->name.c_str(), yylval.i);
|
||||
fprintf(IP_Error, "In line %3d: Defined was: %s, but now shall be changed to %s\n\n", (int)IP_LineNumber, KNF ? "KNF" : "DNF", KNF ? "DNF" : "KNF");
|
||||
printf("*** FATAL ERROR *** You can only define either KNF or DNF!\n");
|
||||
*IP_Error << "*** FATAL ERROR *** You can only define either KNF or DNF!" << endl;
|
||||
*IP_Error << "In line " << setw(3) << setfill('0') << IP_LineNumber << ": " << pic->back()->name << '>' << yylval.i << endl;
|
||||
*IP_Error << "In line " << setw(3) << setfill('0') << IP_LineNumber << ": Defined was: " << (KNF ? "KNF" : "DNF") << " but now shall be changed to " << (KNF ? "DNF" : "KNF") << endl << endl;
|
||||
cout << "*** FATAL ERROR *** You can only define either KNF or DNF!" << endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
fprintf(IP_List, "Term Value %d\n\n",yylval.i);
|
||||
*IP_List << "Term Value " << yylval.i << endl << endl;
|
||||
pState = P_TERMS_KEY;
|
||||
}
|
||||
break;
|
||||
|
@ -148,16 +151,16 @@ int CParser::yyparse(PrimImplikantCollection* &pic, vector<string>* &variables)
|
|||
* It is passed two file streams, the first is where the input comes
|
||||
* from; the second is where error messages get printed.
|
||||
*/
|
||||
void CParser::InitParse(FILE *inp,FILE *err,FILE *lst)
|
||||
void CParser::InitParse(ifstream &inp, ofstream &err, ofstream &lst)
|
||||
|
||||
{
|
||||
|
||||
/*
|
||||
* Set up the file state to something useful.
|
||||
*/
|
||||
IP_Input = inp;
|
||||
IP_Error = err;
|
||||
IP_List = lst;
|
||||
IP_Input = &inp;
|
||||
IP_Error = &err;
|
||||
IP_List = &lst;
|
||||
|
||||
IP_LineNumber = 1;
|
||||
ugetflag=0;
|
||||
|
@ -175,9 +178,8 @@ void CParser::InitParse(FILE *inp,FILE *err,FILE *lst)
|
|||
* preceeded by the current filename and line number.
|
||||
*/
|
||||
void CParser::yyerror(char *ers)
|
||||
|
||||
{
|
||||
fprintf(IP_Error,"line %d: %s\n",IP_LineNumber,ers);
|
||||
*IP_Error << "In line " << setw(3) << setfill('0') << IP_LineNumber << ": " << ers << endl;
|
||||
}
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
|
@ -202,7 +204,7 @@ int CParser::yylex()
|
|||
{
|
||||
//Locals
|
||||
int c;
|
||||
lexstate s;
|
||||
lexstate s = L_START;
|
||||
/*
|
||||
* Keep on sucking up characters until we find something which
|
||||
* explicitly forces us out of this function.
|
||||
|
@ -210,11 +212,12 @@ int CParser::yylex()
|
|||
yytext = "";
|
||||
yylval.s = "";
|
||||
yylval.i = 0;
|
||||
for (s = L_START; 1;){
|
||||
c = Getc(IP_Input);
|
||||
while(!IP_Input->eof())
|
||||
{
|
||||
c = (*IP_Input).get();
|
||||
yytext = yytext + (char)c;
|
||||
if(!ugetflag) {
|
||||
if(c != EOF)if(prflag)fprintf(IP_List,"%c",c);
|
||||
if(c != EOF && prflag) *IP_List << c;
|
||||
}else ugetflag = 0;
|
||||
switch (s){
|
||||
//Starting state, look for something resembling a token.
|
||||
|
@ -228,7 +231,7 @@ int CParser::yylex()
|
|||
if (c == '\n'){
|
||||
IP_LineNumber += 1;
|
||||
if(prflag)
|
||||
fprintf(IP_List,"%5d ",(int)IP_LineNumber);
|
||||
*IP_List << setw(3) << setfill('9') << IP_LineNumber;
|
||||
s = L_START;
|
||||
yytext = "";
|
||||
}
|
||||
|
@ -252,14 +255,14 @@ int CParser::yylex()
|
|||
else if(c == '*')
|
||||
s = L_TEXT_COMMENT;
|
||||
else{
|
||||
Ungetc(c);
|
||||
return('/'); /* its the division operator not a comment */
|
||||
(*IP_Input).unget();
|
||||
return '/'; // its the division operator not a comment
|
||||
}
|
||||
break;
|
||||
case L_LINE_COMMENT:
|
||||
if ( c == '\n'){
|
||||
s = L_START;
|
||||
Ungetc(c);
|
||||
(*IP_Input).unget();
|
||||
}
|
||||
yytext = "";
|
||||
break;
|
||||
|
@ -286,7 +289,7 @@ int CParser::yylex()
|
|||
if (isdigit(c)){
|
||||
break;
|
||||
}else {
|
||||
Ungetc(c);
|
||||
(*IP_Input).unget();
|
||||
yylval.s = yytext.substr(0,yytext.size()-1);
|
||||
yylval.i = atoi(yylval.s.c_str());
|
||||
return (INTEGER1);
|
||||
|
@ -301,7 +304,7 @@ int CParser::yylex()
|
|||
case L_IDENT:
|
||||
if (isalpha(c) || isdigit(c) || c == '_')
|
||||
break;
|
||||
Ungetc(c);
|
||||
(*IP_Input).unget();
|
||||
yytext = yytext.substr(0,yytext.size()-1);
|
||||
yylval.s = yytext;
|
||||
if (c = IP_MatchToken(yytext)){
|
||||
|
@ -342,9 +345,10 @@ int CParser::yylex()
|
|||
PushString((char)c);
|
||||
break;
|
||||
default:
|
||||
fprintf(IP_Error, "*** FATAL ERROR *** Wrong case label in yylex\n");
|
||||
fprintf(IP_Error, "In line %3d: state %i", IP_LineNumber, s);
|
||||
printf("***Fatal Error*** Wrong case label in yylex\n");
|
||||
*IP_Error << "*** FATAL ERROR *** Wrong case label in yylex" << endl;
|
||||
*IP_Error << "In line " << setw(3) << setfill('0') << IP_LineNumber << ": state " << s << endl;
|
||||
cout << "***Fatal Error*** Wrong case label in yylex" << endl;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -35,9 +35,9 @@ public:
|
|||
string s; //structure
|
||||
int i;
|
||||
}yylval;
|
||||
FILE *IP_Input; //Input File
|
||||
FILE *IP_Error; //Error Output
|
||||
FILE *IP_List; //List Output
|
||||
ifstream* IP_Input; //Input File
|
||||
ofstream* IP_Error; //Error Output
|
||||
ofstream* IP_List; //List Output
|
||||
int IP_LineNumber; //Line counter
|
||||
int ugetflag; //checks ungets
|
||||
int prflag; //controls printing
|
||||
|
@ -48,14 +48,14 @@ public:
|
|||
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);
|
||||
void CParser::InitParse(ifstream &inp,ofstream &err,ofstream &lst);
|
||||
int CParser::yyparse(PrimImplikantCollection* &pic, vector<string>* &variables); //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
|
||||
void CParser::PushString(char c); //Used for dtring assembly
|
||||
CParser(){IP_LineNumber = 1;ugetflag=0;prflag=0;}; //Constructor
|
||||
CParser(FILE * input, FILE * error, FILE * list)
|
||||
CParser(ifstream &input, ofstream &error, ofstream &list)
|
||||
{
|
||||
this->IP_init_token_table();
|
||||
this->InitParse(input, error, list);
|
||||
|
|
|
@ -20,35 +20,46 @@ bool fileChosen = false;
|
|||
char fnInput[256];
|
||||
|
||||
|
||||
int open_files(FILE * &input, FILE * &error, FILE * &list)
|
||||
int open_files(ifstream &input, ofstream &error, ofstream &list, ofstream &wt)
|
||||
{
|
||||
if (fileChosen == true) // don't reopen files
|
||||
return 9;
|
||||
|
||||
GetCurrentDirectory(sizeof(fnInput), fnInput);
|
||||
|
||||
if (error == NULL)
|
||||
if (!error.is_open())
|
||||
{
|
||||
char fnError[256];
|
||||
strcpy_s(fnError, (string(fnInput) + "\\res\\errorParser.txt").c_str());
|
||||
fopen_s(&error, fnError, "a");
|
||||
if (error == NULL)
|
||||
error.open(fnError, ofstream::out|ofstream::app);
|
||||
if (!error.is_open())
|
||||
{
|
||||
perror("Fehler beim Öffnen der Fehlerdatei");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (list == NULL)
|
||||
if (!list.is_open())
|
||||
{
|
||||
char fnLists[256];
|
||||
strcpy_s(fnLists, (string(fnInput) + "\\res\\listParser.txt").c_str());
|
||||
fopen_s(&list, fnLists, "w");
|
||||
if (list == NULL)
|
||||
list.open(fnLists, ofstream::out|ofstream::trunc);
|
||||
if (!list.is_open())
|
||||
{
|
||||
perror("Fehler beim Öffnen der Listdatei");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (!wt.is_open())
|
||||
{
|
||||
char fnWt[256];
|
||||
strcpy_s(fnWt, (string(fnInput) + "\\res\\Wertetabelle.txt").c_str());
|
||||
wt.open(fnWt, ofstream::out|ofstream::trunc);
|
||||
if (!wt.is_open())
|
||||
{
|
||||
perror("Fehler beim Öffnen der Wertetabellendatei");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
strcpy_s(fnInput, (string(fnInput) + "\\res\\input.txt").c_str());
|
||||
|
||||
|
@ -72,10 +83,10 @@ int open_files(FILE * &input, FILE * &error, FILE * &list)
|
|||
}
|
||||
fileChosen = true;
|
||||
|
||||
if (input != NULL)
|
||||
fclose(input);
|
||||
fopen_s(&input, fnInput, "r");
|
||||
if (input == NULL)
|
||||
if (input.is_open())
|
||||
input.close();
|
||||
input.open(fnInput, ifstream::in);
|
||||
if (!input.is_open())
|
||||
{
|
||||
perror("Fehler beim Lesen der Inputdatei");
|
||||
return 1;
|
||||
|
@ -92,11 +103,12 @@ void pause()
|
|||
|
||||
void user_main(void)
|
||||
{
|
||||
FILE * input = NULL, * error = NULL, * list = NULL;
|
||||
ifstream fInput;
|
||||
ofstream fError, fList, fWt;
|
||||
KV* kv;
|
||||
while(1)
|
||||
{
|
||||
switch(open_files(input, error, list))
|
||||
switch(open_files(fInput, fError, fList, fWt))
|
||||
{
|
||||
case 1: // some error
|
||||
fileChosen = false;
|
||||
|
@ -114,8 +126,9 @@ void user_main(void)
|
|||
PrimImplikantCollection* globalPIC = new PrimImplikantCollection();
|
||||
vector<string>* variables = new vector<string>();
|
||||
|
||||
rewind(input);
|
||||
CParser* parser = new CParser(input, error, list);
|
||||
fInput.clear();
|
||||
fInput.seekg(0, fInput.beg);
|
||||
CParser* parser = new CParser(fInput, fError, fList);
|
||||
int parseFailure = parser->yyparse(globalPIC, variables);
|
||||
delete parser;
|
||||
|
||||
|
@ -128,15 +141,17 @@ void user_main(void)
|
|||
error += buf;
|
||||
error += ")";
|
||||
perror(error.c_str());
|
||||
fError << error << endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
// initialize Cells
|
||||
CellCollection* allCells = new CellCollection(globalPIC);
|
||||
|
||||
|
||||
|
||||
fWt.seekp(0, fWt.beg);
|
||||
// print Wertetabelle and KV of imported data
|
||||
Wertetabelle* wt = new Wertetabelle(allCells, variables);
|
||||
Wertetabelle* wt = new Wertetabelle(allCells, variables, fWt);
|
||||
wt->Print();
|
||||
|
||||
kv = new KV(globalPIC, allCells, 30,variables);
|
||||
|
@ -174,7 +189,10 @@ void user_main(void)
|
|||
if (kv != NULL)
|
||||
delete kv;
|
||||
kv = NULL;
|
||||
_fcloseall();
|
||||
fInput.close();
|
||||
fList.close();
|
||||
fError.close();
|
||||
fWt.close();
|
||||
fileChosen = false;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -22,19 +22,30 @@ void Wertetabelle::Print()
|
|||
cout << "| "; // => |
|
||||
cout << setfill(' ') << setw((uint)ceil(log10((float)numElements))) << i; // => 4
|
||||
cout << " |"; // => |
|
||||
*fot << "| "; // => |
|
||||
*fot << setfill(' ') << setw((uint)ceil(log10((float)numElements))) << i; // => 4
|
||||
*fot << " |"; // => |
|
||||
this->printI(i); // => 0 1 0 0
|
||||
cout << "| "; // => |
|
||||
cout << ((*this->cells)[i]->value ^ KNF); // => 1
|
||||
cout << " |"; // => |
|
||||
*fot << "| "; // => |
|
||||
*fot << ((*this->cells)[i]->value ^ KNF); // => 1
|
||||
*fot << " |"; // => |
|
||||
this->printPrimImplikanten(i); // => 0 0x1 4
|
||||
cout << endl; // ==> | 4 | 0 1 0 0 | 1 | 0 0x1 4
|
||||
*fot << endl; // ==> | 4 | 0 1 0 0 | 1 | 0 0x1 4
|
||||
|
||||
if (i > 0 && i % 15 == 0 && numElements - i > 5) // reprint header so you dont have to scroll
|
||||
this->printI(i); // => 0 1 0 0
|
||||
this->printPrimImplikanten(i); // => 0 0x1 4
|
||||
|
||||
if (i > 0 && i % 31 == 0 && numElements - i > 5) // reprint header so you dont have to scroll
|
||||
//cout << this->makeHeader() << endl;
|
||||
printHeader();
|
||||
}
|
||||
|
||||
cout << string(this->width, '-') << endl;
|
||||
*fot << string(this->width, '-') << endl;
|
||||
}
|
||||
|
||||
string Wertetabelle::makeHeader()
|
||||
|
@ -65,6 +76,10 @@ void Wertetabelle::printHeader()
|
|||
cout << string(this->width, '-') << endl; // repeat '-' several times => ---------------------
|
||||
cout << row2 << endl; // print header row => | a bärchen c d | y | PrimtImpl.
|
||||
cout << string(this->width, '-') << endl; // repeat '-' several times => ---------------------
|
||||
|
||||
*fot << string(this->width, '-') << endl; // repeat '-' several times => ---------------------
|
||||
*fot << row2 << endl; // print header row => | a bärchen c d | y | PrimtImpl.
|
||||
*fot << string(this->width, '-') << endl; // repeat '-' several times => ---------------------
|
||||
}
|
||||
|
||||
void Wertetabelle::printI(uint i)
|
||||
|
@ -78,13 +93,18 @@ void Wertetabelle::printI(uint i)
|
|||
row = string((uint)ceil(padding[j]) + 1, ' ') + iAtJ + string((uint)floor(padding[j]), ' ') + row;
|
||||
}
|
||||
cout << row;
|
||||
*fot << row;
|
||||
}
|
||||
|
||||
void Wertetabelle::printPrimImplikanten(unsigned int i)
|
||||
void Wertetabelle::printPrimImplikanten(uint i)
|
||||
{
|
||||
cout << ' ';
|
||||
*fot << ' ';
|
||||
Cell* cell = cells->at(i);
|
||||
|
||||
for (unsigned int pi = 0; pi < cell->primImplikanten.size(); pi++) // for every PrimImplikant in Cell
|
||||
for (uint pi = 0; pi < cell->primImplikanten.size(); pi++) // for every PrimImplikant in Cell
|
||||
{
|
||||
cout << cell->primImplikanten[pi]->name << " ";
|
||||
*fot << cell->primImplikanten[pi]->name << " ";
|
||||
}
|
||||
}
|
|
@ -3,7 +3,7 @@
|
|||
#include "stdafx.h"
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include "PrimImplikant.h"
|
||||
#include "Cell.h"
|
||||
#include "CellCollection.h"
|
||||
|
@ -18,22 +18,24 @@ class Wertetabelle
|
|||
public:
|
||||
void Print();
|
||||
|
||||
Wertetabelle(CellCollection* cells, vector<string>* variables)
|
||||
Wertetabelle(CellCollection* cells, vector<string>* variables, ofstream &fWt)
|
||||
{
|
||||
this->cells = cells;
|
||||
this->variables = variables;
|
||||
this->fot = &fWt;
|
||||
}
|
||||
|
||||
private:
|
||||
string makeHeader();
|
||||
void printHeader();
|
||||
void printI(unsigned int i);
|
||||
void printPrimImplikanten(unsigned int i);
|
||||
void printI(uint i);
|
||||
void printPrimImplikanten(uint i);
|
||||
|
||||
CellCollection* cells;
|
||||
vector<string>* variables;
|
||||
vector<float> padding;
|
||||
uint width;
|
||||
ofstream* fot;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue