Bei der lexikalischen Analyse, der ersten Phase eines Compilers, wird nicht nur eine Rechtschreibprüfung des Quelltextes durchgeführt, sondern aus den Java-Anweisungen wird auch ein Tokenstrom erzeugt, mit dem dann der Parser, der zweite Teil des Compilers, arbeiten kann. Ein solcher Tokenstrom besteht aus einer endlichen Abfolge von Token.
Ein Token beinhaltet zwei Informationen
Um welche Art von Zeichen handelt es sich überhaupt?
Die double-Zahl 17.45 wird beispielsweise vom Lexer in das Token "Zahl" umgewandelt, während der Bezeichner "alter" in das Token "Variable" umgewandelt wird.
Eine Java-Anweisung wie
alter = 25;
würde dann vielleicht in den Tokenstrom
Variable -> Zuweisung -> Zahl -> Semikolon
umgewandelt.
Mit diesem Tokenstrom könnte der Parser dann die syntaktische Korrektheit des Java-Befehls
alter = 25;
überprüfen.
Aber ein Token hat eine zweite Komponente, nämlich den Wert. Es ist ja nicht so, dass der Compiler den tatsächlichen Wert der Variable vergessen darf. Bei der Codeerzeugung, also beim eigentlichen Übersetzungsvorgang, muss ja der Wert der Variable wieder auftauchen. Also wird dieser Wert als zweite Komponente in dem Token gespeichert.
Der oben erwähnte Tokenstrom sieht also in Wirklichkeit so aus:
Variable ("alter") -> Zuweisung -> Zahl (25) -> Semikolon
Die Token Zuweisung und Semikolon benötigen keine zweite Komponente, da sie eindeutig sind. Es gibt in Java nur einen Zuweisungsoperator und nur ein Semikolon. Variablen und Zahlen dagegen gibt es jede Menge.