Interpreterbau - Ein Anfang
-
Ok gut, das mit dem früher aussteigen wegen Fehlern macht Sinn. Allerdings will ich sowieso alle Fehler finden (und in einer Liste speichern), daher werd ich das dann wohl erst in der Analyser-Phase machen.
-
happystudent schrieb:
Ok gut, das mit dem früher aussteigen wegen Fehlern macht Sinn. Allerdings will ich sowieso alle Fehler finden (und in einer Liste speichern), daher werd ich das dann wohl erst in der Analyser-Phase machen.
Du wirst feststellen, dass das gar nicht so einfach sein kann. Denn manche Fehler bedingen andere Fehler, die wieder andere Fehler bedingen, etc.
-
Vielen Dank für den Artikel!
Leider schaffe ich es, trotz der guten Beschreibung und weiteren Posts, nicht den Code um eine Potenzoperator zu erweitern.
Kann bitte jemand die nötigen Änderungen für die Erweiterung um den Potenzoperator "^" posten.
Bisher habe ich nur die Funktion pow() eingebaut. Für ein neues Projekt möchte ich aber Formeln die in Excel vorhanden sind verwenden...
-
Unverschämt schrieb:
Vielen Dank für den Artikel!
Leider schaffe ich es, trotz der guten Beschreibung und weiteren Posts, nicht den Code um eine Potenzoperator zu erweitern.
Kann bitte jemand die nötigen Änderungen für die Erweiterung um den Potenzoperator "^" posten.
Bisher habe ich nur die Funktion pow() eingebaut. Für ein neues Projekt möchte ich aber Formeln die in Excel vorhanden sind verwenden...
falls du es auf gleicher Ebene wie Multiplikation/Division anordnen willst, ginge es z.B. so:
Syntaxdefinition:
Multiplikation = (Klammer) { ("*" | "/" | "^") (Klammer) } ;
Parser:
// Multiplikation = (Klammer) { ("*" | "/") (Klammer) } ; int Parser::multiplikation() { int res = klammer(); while (myTok.equal(TT_MUL) || myTok.equal(TT_DIV) || myTok.equal(TT_POW)) { switch (myTok.getType()) { case TT_MUL: getNextToken(); res *= klammer(); break; case TT_DIV: getNextToken(); res /= klammer(); break; case TT_POW: // Scanner muss TT_POW (also ^) erkennen getNextToken(); res = my_pow(res,klammer()); // my_pow führt x^y aus break; } } return res; }
... so in etwa könnte es funktionieren.
-
Besser du erstellst dafür eine weitere Funktion, denn der Operator hat ohnehin die höchste Priorität.
Ungetestet, aber das Konzept sollte dafur klar werden. Es ist eigentlich recht simpel, wenn man es einmal verstanden hat.
int Parser::multiplikation() { int res = pow(); while (myTok.equal(TT_MUL) || myTok.equal(TT_DIV)) { switch (myTok.getType()) { case TT_MUL: getNextToken(); res *= pow(); break; case TT_DIV: getNextToken(); res /= pow(); break; } } return res; } // Multiplikation = (Klammer) { ("*" | "/") (Klammer) } ; int Parser::pow() { int res = klammer(); while (myTok.equal(TT_POW)) { switch (myTok.getType()) { case TT_POW: getNextToken(); res = std::pow(res, klammer()); break; } } return res; }
-
Danke gfhfghfgh!
Kannst Du bitte auch noch die Definitionen von Parser::start und Parser::klammer posten?
-
Danke gfhfghfgh!
Kannst Du bitte auch noch die Definitionen von Parser::start und Parser::klammer posten?
-
Danke gfhfghfgh!
Kannst Du bitte auch noch die Definitionen von Parser::start und Parser::klammer posten?
-
Hast du den Artikel wirklich gelesen? Denn klammer und start sind doch aus dem Artikel bekannt.
Du musst danach nur noch der Scanner anppassen und um die Definitionen für TT_POW erweitern und auch getNextToken für '^' erweitern. Anschließend sollte es so funktionieren.
-
Ein Objekt „Chef“ verändert durch einen direkten Zugriff auf die Eigenschaft „Gehalt“ eines Objekts „Mitarbeiter“ den Wert der Eigenschaft „Gehalt“. Wie bewerten Sie diesen Zugriff aus Sicht der Objektorientierung? Welche Alternativen gibt es?
könnte jemand bitte mir weiterhelfen? Danke
-
Hallo Zusammen,
ich bin über diesen Artikel auf das Forum gestoßen, leider ist der Quellcode nicht mehr downloadbar.
Die Links zeigen ins Leere.
Es wäre toll, wenn jemand die Dateien nochmal hochladen würde.Danke schonmal.
J-B-G
-
@j-b-g Hier die korrigierten Links:
-
@dravere Super, danke!