Ich glaube, Du hast einen Denkfehler.
Verwende drei Operationen:
GetChar:
Liefert das nächste Zeichen. Bei Zeilenende liefert die Funktion ein ' '. Bei TAB auch.
Wenn es den Beginn eines Kommentars sieht (Lookahead!) dann überspringt die Funktion alles bis zum Ende des Kommentars.
Anstelle des Kommentars wird ein ' ' geliefert.
SkipSpaces:
Geht bis zum nächsten Zeichen <> ' '. Verwendet GetChar.
GetToken:
Liefert einen String bestehen aus den Zeichen bis zum nächsten Terminalsymbol.
Danach mit SkipSpaces weiterhüpfen.
Das reicht.
Delphi-Quellcode:
Function TwoWords (ParserTree : TParserTree) : Boolean;
Begin
if GetToken.TokenType = tkWord then begin
// Remember current word;
If GetToken.TokenType = tkWord then begin
// Success - we've found two words in a row
...
exit;
end;
Raise ParserError('Expected a word here')
end;
Raise ParserError('Expected a word here')
End;
Du bist beim Parsen etwas eingeschränkt, weil Du den Parser mit den paar Operationen nicht dazu bringen kannst, nach einem Syntaxfehler wieder so aufzusetzen, das alle Fehler gefunden werden. Aber das ist -soweit ich mich entsinne- eh nicht trivial.