Moin Tom,
also ich würde es, stilisiert, so angehen:
Delphi-Quellcode:
while i <= length(sBuffer) do begin
case sBuffer[i] of
'a'..'z' : begin // Bezeichner möglich
// alle Zeichen aus dem Buffer auslesen, bis zum ersten Auftreten
// eines Zeichens, dass nicht in einem Bezeichner vorkommen kann
// Hierbei i entsprechend hochzählen (muss am Ende den Index des letzten
// gültigen Zeichens enthalten
// Jetzt kann geprüft werden, ob es sich nun um ein Keyword oder eine Variable
// handelt, und der Wert entsprechend weggeschrieben werden.
end;
';',',' : begin // Delimiter
// Kann direkt als Token geschrieben werden
end;
'/' : begin // Evtl. beginnt hier ein Kommentar
if i < length(sBuffer) then begin
// folgt ein * ?
// Ja, dann bis */ suchen, sonst direkt / übernehmen
end else begin
// i = Bufferlänge => Es kann kein Kommentar sein
end;
end;
#32,#10,#13,#09 :; // Whitespace, es gibt nichts zu tun
end;
inc(i);
end;
Das nur einmal als grobes Beispiel. Das Auslesen eines Bezeichners sollte auch nicht direkt in der Schleife geschehen, sondern als Funktion ausgelagert werden, die, beispielsweise, als DEA ausgeführt ist, um einen gültigen Bezeichner zu extrahieren.
Unter dem Begriff "Zustandsautomat" kannst Du auch einiges als Erklärung für einen DEA finden.
Vielleicht kannst Du für CSS auch so etwas finden, wie die Referenz für C bzw. C++, z.B. bei MS.
Dort werden die verschiedenen Phasen eines Compilerdurchlaufes in Einzelheiten beschrieben.
BTW:
Ein Token setzt sich, i.d.R., aus zwei Teilen zusammen, nämlich Symbol und Attribut, wobei letzteres nur bei Variablen Werten erforderlich ist.
Beispielweise könnte das Token für Addition als (+,) dargestellt werden, da hier nur das Symbol interessiert, wohingegen das Token für eine Variable als (var,MyVar) dargestellt werden kann, wobei var das Symbol für eine Variable im allgemeinen steht, und MyVar den Namen des Bezeichners angibt.