Wie finde ich raus, wann ich eine Klammerung brauch und wann nicht?



  • Hallo,

    wie kann man herausfinden ob man für einen bestimmten Ausdruck eine Klammerung brauch oder nicht? Ich möchte sicher damit umgehen und nicht immer ausprobieren, ob es hinhaut. 🙂





  • ah, die Tabelle hatte ich früher schonmal gesehen.

    Aber was heißt jetzt binär und unär im Zusammenhang mit den Operatoren? Das ist mir noch nicht so ganz klar.



  • die unären Operatoren binden am allerstärksten.

    Bei -2 ist '-' der unäre Operator. ------2 müsste auch gehen, wenn ich mich nicht täusche 🙂
    Auf jeden Fall werden diese von RECHTS nach LINKS ausgewertet. Das ist eine wichtige Besonderheit.



  • Also nochmal genauer:

    binär = zwei operanden (a-b, a&b), unär = ein operand (&x, -a).

    Ausweertungsrichtung ist (glaub ich 🤡 ) die Assoziativität, und de rparser ist "greedy", d.h. nimmt immer soviel wie möglich in ein token.

    d.h. z.B. das (---x) geparst wird als (-(--x))



  • peterchen schrieb:

    und de rparser ist "greedy", d.h. nimmt immer soviel wie möglich in ein token.
    d.h. z.B. das (---x) geparst wird als (-(--x))

    1. hier gehts um den Scanner, nicht um den Parser, aber das nur am Rande
    2. falsches Beispiel, greedy heißt, dass das als -- - x erkannt wird (was bei den Standardoperatoren ein Semantikfehler ist)


  • scannt/Parst der von links? ich dachte von rechts wenn er rechts-assoziativ ist...
    naja, man lernt halt nicht aus 😉



  • peterchen schrieb:

    scannt/Parst der von links?

    Er parst von links oben nach rechts unten. Was ist daran verwunderlich?



  • Naja, eigentlich fängt er die Datei beim ersten Byte an und hört beim letzten Byte auf 😉 Dabei scannt er wie gesagt "gierig". Bei ---a gibt es ja theoretisch 3 Möglichkeiten, wie es zu interpretieren ist, entweder - - - a, oder - -- a, oder -- - a. Anstatt jetzt aber alle durchzuprobieren und am Ende die zu nehmen, die am sinnvollsten ist, frißt er einfach so weit wie er kommt, und sieht dann weiter (als Kommentar immer die "Denkblasen" des Scanners):
    1. '-' // das könnte ein minus sein, aber auch ein --, -=, -> oder ->* Operator, mal sehen
    2. '-' // muss der -- Operator sein, gibt nichts anderes was mit -- anfängt
    3. '-' // das könnte ein minus sein, aber (siehe 1.)
    4. 'a' // "-a" ergibt keinen Sinn, Zeichen zurückstellen, ein Minus erkennen
    5. 'a' nochmal // Anfang eines Bezeichners oder Schlüsselworts

    6. ...

    Der Parser kommt jetzt und versucht da eine Struktur hereinzubringen ... danach weiss er, dass das eine Präfix-Dekrement-Operation eines Ausdrucks ist, der eine arithmetische Negation eines Ausdrucks ist, der sich aus der Variablen a ergibt.

    Jetzt müßte irgendwann eine Phase kommen, in der sämtliche Ausdrücke auf ihre Typen hin überprüft werden. Angenommen, a ist ein primitiver Datentyp, dann wird der Compiler hier feststellen, dass -a ein rvalue ist, auf das der -- Operator nicht angewendet werden kann. An der Stelle entsteht damit endlich die Fehlermeldung: "non-lvalue in decrement"



  • Thanks Bashar


Log in to reply