Josh hat geschrieben:Nein, das ist sehr wohl die Aufgabe des Lexers.
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.
Der Parser verarbeitet danach nur noch die Tokens und keine einzelnen Zeichen mehr.
Josh hat geschrieben:Ein Lexer ordnet den Tokens zu, ob es sich um einen Bezeichner, Operator, Literal, Trennzeichen oder sonst was handelt.
Korrekt. Ich behaupte, aber nirgends was anderes.
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.
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: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ß.
Es ist nicht so üblich, dass Lexer bei Leerzeichen Tokens erstellen, aber ausgeschlossen ist es nicht.
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.