Ich versuche, Zusammenstellung und Interpretation Schritt für Schritt zu verstehen und ein Gesamtbild zu finden. Ich bin also auf eine Frage gekommen, als ich diesen Artikel gelesen habe: http://www.cs.man.ac.uk/~pjj/farrell/comp3.html
Es sagt :
Die nächste Stufe des Compilers heißt Parser. Dieser Teil des Compilers versteht die Grammatik der Sprache. Es ist dafür verantwortlich, Syntaxfehler zu identifizieren und ein fehlerfreies Programm in interne Datenstrukturen zu übersetzen, die in einer anderen Sprache interpretiert oder ausgeschrieben werden können.
Ich konnte jedoch nicht herausfinden, wie Tokenizer den angegebenen Stream, der den Syntaxfehler enthält, ordnungsgemäß token kann.
Es sollte dort hängen bleiben oder dem Parser falsche Informationen geben. Ich meine, ist das Tokenizing nicht auch eine Art Übersetzer?
So, wie es nur die lexikalisch beschädigten Codezeilen beim Tokenisieren überwindet.
Ein Beispiel für ein Token finden Sie oben im Link unter der Überschrift " The Tokenizer" .
Soweit ich weiß, scheint die Form des Tokens so zu sein, dass auch der Code-Token beschädigt wird, wenn etwas nicht stimmt.
Könnten Sie bitte mein Missverständnis klären?
and
oder entscheiden&&
oder etwas anderes. Es ist (meistens) getrennt und unterscheidet sich vom Parsen. Eine Optimierung (falls vorhanden) ist eine fast zufällige Nebenwirkung.Sie würden in der Regel die meisten Syntaxfehler von dem Parser, nicht die Lexer kommen erwarten.
Der Lexer würde einen Fehler erzeugen, wenn (und meistens nur, wenn) die Eingabe etwas enthält, das nicht als Token gekennzeichnet werden kann. In vielen Sprachen kann jedoch fast jede Zeichenfolge in Token verwandelt werden, sodass Fehler hier eher ungewöhnlich sind.
Der Parser generiert einen Fehler, wenn die Eingabe gültige Token enthält, diese Token jedoch nicht angeordnet sind, sodass sie gültige Anweisungen / Ausdrücke in der Zielsprache bilden. Dies ist in der Regel viel häufiger.
quelle
Tokenizer teilt den Zeichenstrom nur in Token auf. Vom Tokenizer POV ist dies vollständig gültig:
und übersetzt in etwas wie:
["1", MULTIPLY, MULTIPLY, "1"]
Nur der Parser kann solche Ausdrücke ablehnen - er weiß, dass der Multiplikationsoperator keinem anderen Multiplikationsoperator folgen kann. Zum Beispiel in JavaScript erzeugt dies:Es gibt Fehler, die vom Tokenizer erkannt werden können. Zum Beispiel unvollendete String-Literale:
"abc
oder ungültige Zahlen:0x0abcdefg
. Sie können jedoch weiterhin als Syntaxfehler gemeldet werden:Beachten Sie jedoch, dass das Token nicht erkannt wurde und als gemeldet wird
ILLEGAL
.quelle