Re: Macro ändert Pointernamen
Verfasst: 06.03.2019 02:29
Das einzige was in diesem Zusammenhang relevant ist, ist dein erster Satz und das ist falsch. Ein Lexer kann durchaus auf den vorhergehenden Token zurückblicken oder auf das folgende Zeichen (ein folgender Token ist ja noch nicht erstellt, ein Beispiel in Pb wäre das Tilde-Zeichen) vorausschauen und daraus Rückschlüsse ziehen. Weiter unten hast du einen Link auf einen Wiki-Artikel gesetzt, ich empfehle dir, diesen auch zu lesen.Sicro hat geschrieben:Ein Lexer prüft keine vorherigen oder nachfolgenden Tokens. Er arbeitet überhaupt nicht mit Tokens, sondern erstellt sie nur, und zwar aus Zeichenfolgen, die einem bestimmtem Muster verlaufen.Josh hat geschrieben:Nein, das ist sehr wohl die Aufgabe des Lexers.
Der Parser verarbeitet danach nur noch die Tokens und keine einzelnen Zeichen mehr.
Ja, aber wenn du einem Token einen Tokentyp zuordnest, dann solltest du es richtig machen und nicht (wie von dir weiter unten angegeben) das Sternchen einfach als Operator kennzeichnen, obwohl so ca. eine 50/50 Chance besteht, dass es falsch ist. Nochmals, das Sternchen bei einem Pointer ist in Pb Bestandteil des Bezeichners und KEIN Operator. '*AnyPointer' ist EIN Token.Sicro hat geschrieben:Korrekt. Ich behaupte, aber nirgends was anderes.Josh hat geschrieben:Ein Lexer ordnet den Tokens zu, ob es sich um einen Bezeichner, Operator, Literal, Trennzeichen oder sonst was handelt.
Das stimmt, dem Lexer ist der Syntax ziemlich egal, so stört es den Lexer in keinster Weise, ob eine öffnende Klammer auch eine schließende Klammer hat, oder ob ein 'Procedure' auch ein 'EndProcedure' hat. Aber was der Lexer benötigt um einen Token RICHTIG zu erstellen, das holt er sich aus dem Kontext der Befehlszeile (wie oben von mir nach dem ersten Zitat bereits beschrieben).Sicro hat geschrieben:Dem Lexer ist es egal, ob die Syntax des Codes stimmt oder nicht. Er erstellt einfach die Tokens, ohne irgendetwas Weiteres zu prüfen. Das, was du im Zitat schreibst, prüft der Parser, nicht der Lexer.Josh hat geschrieben:Da 'a' nur ein Bezeichner sein kann, kann kein weiterer Bezeichner folgen und somit ist das '*' ein Operator und 'b' in weiterer Folge wieder ein Bezeichner.
Und warum sollte das einer tun? Naja, wenn es sich einer absichtlich schwer machen will, dann kann er es natürlich auch so machen und unnötige (und später im Parser extrem störende) Leerzeichen-Token einfügen um anschließend im Parser Fehler des Lexers auszubügeln zu können.Sicro hat geschrieben:Es ist nicht so üblich, dass Lexer bei Leerzeichen Tokens erstellen, aber ausgeschlossen ist es nicht.Josh hat geschrieben:Alles andere wäre auch widersinnig. Der Parser könnte z.B. nicht mehr erkennen, dass bei 'a = b + * c' ein Syntax-Fehler auszugeben ist, da der Parser von Leerzeichen/Tabs nichts mehr weiß.
Hier kannst du es nachlesen: https://en.wikipedia.org/wiki/Lexical_analysis
Die deutsche Version des Wikipedia-Artikels ist leider nicht so umfangreich beschrieben.
In dem Wikipedia-Artikel findest du die relevanten Textstellen, wenn die Textsuchfunktion des Browsers mit "whitespace" fütterst.
[bezeichner_a] [operator_=] [bezeichner_b] [operator_+] [operator_*] [leerzeichen] [bezeichner_c]
"c" ist somit keine Pointer-Variable, weil zwischen "*" und Bezeichner kein Leerzeichen sein darf.
Zwischen den anderen Tokens können natürlich ebenfalls Leerzeichen-Tokens sein, habe ich jetzt aber der einfachheitshalber mal weggelassen, weil der Parser selber entscheiden kann, ob er das Leerzeichen-Token an dieser Position berücksichtigt oder ignoriert.