GetToken:
PUBLIC
PROC [l: Lexer]
RETURNS [token: Token] = {
IF l.tokenStack #
NIL
THEN {
token ¬ l.tokenStack.first;
l.afterLast ¬ token.after;
l.tokenStack ¬ l.tokenStack.rest;
l.beforeNext ¬ IF l.tokenStack # NIL THEN l.tokenStack.first.before ELSE l.GetIndex[l.in];
RETURN};
token.afterPrev ¬ l.afterLast;
token.before ¬ l.beforeNext;
IF l.in.EndOf[]
THEN {
token.kind ¬ tokenEOF;
token.rope ¬ NIL;
token.after ¬ token.before;
RETURN};
[token.kind, token.rope] ¬ l.in.GetCedarTokenRope[l.filterComments];
IF helpCirio THEN token.rope ¬ Rope.Flatten[token.rope];
token.after ¬ l.afterLast ¬ l.GetIndex[l.in];
[] ¬ l.in.SkipWhitespace[l.filterComments];
l.beforeNext ¬ l.GetIndex[l.in];
};
Start:
PROC = {
LoadIds[reservedWords, LIST["ABS", "ALL", "AND", "ANY", "APPLY", "ARRAY", "BASE", "BEGIN", "BROADCAST", "CEDAR", "CHECKED", "CODE", "COMPUTED", "CONS", "CONTINUE", "DECREASING", "DEFINITIONS", "DEPENDENT", "DESCRIPTOR", "DIRECTORY", "DO", "ELSE", "ENABLE", "END", "ENDCASE", "ENDLOOP", "ENTRY", "ERROR", "EXIT", "EXITS", "EXPORTS", "FINISHED", "FIRST", "FOR", "FORK", "FRAME", "FREE", "FROM", "GO", "GOTO", "IF", "IMPORTS", "IN", "INLINE", "INTERNAL", "ISTYPE", "JOIN", "LAST", "LENGTH", "LIST", "LOCKS", "LONG", "LOOP", "LOOPHOLE", "MACHINE", "MAX", "MIN", "MOD", "MONITOR", "MONITORED", "NARROW", "NEW", "NIL", "NOT", "NOTIFY", "NULL", "OF", "OPEN", "OR", "ORD", "ORDERED", "OVERLAID", "PACKED", "PAINTED", "POINTER", "PORT", "PRED", "PRIVATE", "PROC", "PROCEDURE", "PROCESS", "PROGRAM", "PUBLIC", "READONLY", "RECORD", "REF", "REJECT", "RELATIVE", "REPEAT", "RESTART", "RESUME", "RETRY", "RETURN", "RETURNS", "SAFE", "SELECT", "SEQUENCE", "SHARES", "SIGNAL", "SIZE", "START", "STATE", "STOP", "SUCC", "THEN", "THROUGH", "TO", "TRANSFER", "TRASH", "TRUSTED", "TYPE", "UNCHECKED", "UNCOUNTED", "UNSAFE", "UNTIL", "USING", "VAL", "VAR", "WAIT", "WHILE", "WITH", "ZONE"]];
LoadIds[predefinedTypes, LIST["ATOM", "BOOL", "BOOLEAN", "CARD", "CARDINAL", "CHAR", "INT", "INTEGER", "NAT", "REAL", "TEXT", "UNSPECIFIED", "WORD", "CARD16", "CARD32", "INT16", "INT32", "NAT15", "NAT31"]];
};