P
Peacemuschel
Gast
Hallo,
Ich bin noch ziemlich neu in C++ und muss als Hausaufgabe einen Top-Down Parser schreiben.
Eine Einzulesende Datei soll auf "Grammatikalische" korrektheit überprüft werden, und evtl. einen Syntax Error ausgeben.
Der Parser soll zuweisungen folgender Formen erlauben:
a: V=F(e,e);
e: V
| F(e,e)
s: a
| a s
V in {v1,v2,v3} sowie F in {f1,f2,f3}. Ich hoffe mal diese Angaben sind halbwegs verständlich.
Zuerst stell sich mir die Frage, wie ich | a s interpretieren soll, in meinem Code habe ich es Als a und s interpretiert.
Nun zu meinem Code:
Ich hoffe das ist ok so, da der Code etwas länger ist.
Mein Programm gibt mir nun allerdings immer einen Syntax Error aus, auch wenn ich etwas richtiges wie z.B. v1=f1(v1,v1); oder v2= f1(v1,f2(v2,v1)); einlese. Ich finde den Fehler einfach nicht.
Kann da mal jemand drüber gucken und mir helfen?
Danke,
Felix
Ich bin noch ziemlich neu in C++ und muss als Hausaufgabe einen Top-Down Parser schreiben.
Eine Einzulesende Datei soll auf "Grammatikalische" korrektheit überprüft werden, und evtl. einen Syntax Error ausgeben.
Der Parser soll zuweisungen folgender Formen erlauben:
a: V=F(e,e);
e: V
| F(e,e)
s: a
| a s
V in {v1,v2,v3} sowie F in {f1,f2,f3}. Ich hoffe mal diese Angaben sind halbwegs verständlich.
Zuerst stell sich mir die Frage, wie ich | a s interpretieren soll, in meinem Code habe ich es Als a und s interpretiert.
Nun zu meinem Code:
Code:
#include<iostream>
#include<fstream>
using namespace std;
bool v(ifstream& i) {
char c;
i >> c; cout << c;
if (c!= 'v') return false;
i >> c; cout << c;
if (c != '1' && c != '2' && c != '3' ) return false;
return true;
}
bool f(ifstream& i) {
char c;
i >> c; cout << c;
if (c!= 'f') return false;
i >> c; cout << c;
if (c != '1' && c != '2' && c != '3' ) return false;
return true;
}
bool e(ifstream& i) {
char c;
if (v(i)) return true;
else {
if (!f(i)) return false;
i >> c; cout << c;
if (c != '(') return false;
if (!e(i)) return false;
i >> c; cout << c;
if (c != ',') return false;
if (!e(i)) return false;
i >> c; cout << c;
if (c != ')') return false;
}
return true;
}
bool a(ifstream& i) {
char c;
if (!v(i)) return false;
i >> c; cout << c;
if (c != '=') return false;
if (!f(i)) return false;
i >> c; cout << c;
if (c != '(') return false;
if (!e(i)) return false;
i >> c; cout << c;
if (c != ',') return false;
if (!e(i)) return false;
i >> c; cout << c;
if (c != ')') return false;
i >> c; cout << c;
if (c != ';') return false;
return true;
}
bool s(ifstream& i) {
if (a(i)) return true;
if (!i.eof()) s(i);
return true;
}
int main(int argc, char* argv[]){
ifstream i(argv[1]);
if (!s(i)) cerr << "Syntax Error" << endl;
return 0;
}
Mein Programm gibt mir nun allerdings immer einen Syntax Error aus, auch wenn ich etwas richtiges wie z.B. v1=f1(v1,v1); oder v2= f1(v1,f2(v2,v1)); einlese. Ich finde den Fehler einfach nicht.
Kann da mal jemand drüber gucken und mir helfen?
Danke,
Felix
Zuletzt bearbeitet:
(Code aktualisiert)