C++ Parsen: Das Komma

DragonTEC

Komplett-PC-Aufrüster(in)
Hi,

ich bau grade einen C++ Parser (bitte nehmt das einfach so hin.. ich mag keine diskusionen nach dem motto "nimm doch den oder den" hören.. DANKE! :P ) und soweit läuft das auch alles, allerdings komm ich mit diesem blöden komma nicht klar, weil es sowohl als operator, als auch als seperator genutzt werden kann..

mit operatoren is das alles kein problem, allerdings weiß ich nicht, wie wo und wann ich diese seperatoren parsen soll..

momentan mach ich folgendes:

0. alles mögliche erkennen, wörter, zahlen, sonderzeichen bla..
1. reserved words erkennen
2. klammern sortieren
3. typen erkennen und in symboltable schreiben
4. variablen und operatoren auflösen anhand der symboltable

Wenn ich jetzt aber ein 'int a=0, b=1;' hab, weiß ich nicht, wie und wann ich das auflösen soll.. um a und b vernünftig als variblen zu erkennen müsste das in 3 geschehen, aber ohne die operatorauflösung aus 4. krieg ich das nicht generisch geparst.. aber wenn ich es erst in 4. mache fehlen mir die initialisierungen als einträge in der symboltable..

Über ne konstruktive idee dazu wär ich :hail:
 
Dann lass es doch einfach nicht zu, dass "," auch ein Operator ist, sondern nimm anstelledessen einen "." - somit vermeidest du eine Doppeldeutigkeit und der Ausdruck ließe sich anhand deiner Regeln parsen.

MFG
 
okay, vielleicht falsch verstanden: ich baue keinen Parser in C++ (okay, das auch, aber nebensächlich), sondern FÜR C++.. das heißt, ich will C++-Quelltexte parsen.. diese abstruse Komma-Regelung ist so im C++ standard festgeschrieben und daher geht es nicht um meine regeln, sondern die nativen c und c++ regeln (und soweit ich weiß hat java das gleiche prinzip).. also is einfaches umdefinieren hier wohl nicht drin..
 
Ich verstehe immer noch nicht, was du für ein Problem hast, bzw. was du den Kommaoperator nennst. Für mich separiert ein Komma im Code immer zwei Objekte (ich fasse mal Datentypen in Objekte ein), diese können implizit oder Explizit definiert sein. Bei impliziter Definition musst du halt intelligent entscheiden, was es für ein Objekt ist.
 
hey, du verfolgst mich! ;)

also, in c++ gibts das komma auch als operator.. für beispiele siehe hier: Comma operator - Wikipedia, the free encyclopedia

problem ist jetzt folgendes:
eigentlich wollte ich alles nach dem pattern TYP UNKNWON_WORD in eine symboltable als variable schreiben (mal vereinfacht ausgedrückt..) und dann im nächsten schritt alle operatoren durchjagen.. also

1) int a = 1;
2) variable(a) = 1;
3) zuweisung(variable(a),1)

nun hab ich aber das problem, das mit der methode folgendes passieren würde:

1) int a=1,b=2;
2) variable(a)=1,unknown_word(b)=2;
3) zuweisung(var(a),1),zuweisung(unknown_word(b),2)
4) komma(zuweisung(var(a),1),zuweisung(unknown_word(b),2))

das heißt, ich krieg alle folgenden variablen nicht aufgelöst..
wenn ich allerdings die kommas schon vorher auflösen würde, hätte ich dann fuckup bei allem, wo , kein seperator sondern operator wäre..

daher bräuchte ich jetzt am liebsten 2 BNFs für den unterschiedlichen einsatz von kommas als operator und seperator in c++ :ugly:
 
Kein Wunder, dass ich nicht direkt daran gedacht habe habe. Das ist ja wohl mal übelst schlechter Stil. (Lesbar, aber wer bitte macht so etwas?)

Ein Ansatz für wäre, dass du mit einem Buffer arbeitest. Bis etwas abgeschlossen wird, bleiben die alten Dinge dort halt stehen.

Code:
int i = a += 2, a + b , c++;
Selbst dieser Müll kann damit sequenziell interpretiert werden, weil zwischendurch das a+=2 nur in den Buffer kommt, dann aber selbst nicht gespeichert wird.
Code:
gehe in den int-handling-modus, definiere i, speichere in i
    erhöhe a um 2, addiere a und b (das letztere wird als erstmögliches in i gespeichert, beendet das vorangegangene speichern in i, das noch ‚gewartet‘ hat)
erhöhe c um 1
 
Zurück