| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- IMPLEMENTATION MODULE -->modulename;
- (* Parser generated by Coco/R - assuming ISO IO library will be available. *)
- IMPORT -->scanner, FileIO;
- -->declarations
- CONST
- -->constants
- minErrDist = 2; (* minimal distance (good tokens) between two errors *)
- setsize = 16; (* sets are stored in 16 bits *)
- TYPE
- SymbolSet = ARRAY [0 .. maxT DIV setsize] OF BITSET;
- VAR
- symSet: ARRAY [0 .. -->symSetSize] OF SymbolSet; (*symSet[0] = allSyncSyms*)
- errDist: CARDINAL; (* number of symbols recognized since last error *)
- sym: CARDINAL; (* current input symbol *)
- PROCEDURE SemError (errNo: INTEGER);
- BEGIN
- IF errDist >= minErrDist THEN
- -->error
- END;
- errDist := 0;
- END SemError;
- PROCEDURE SynError (errNo: INTEGER);
- BEGIN
- IF errDist >= minErrDist THEN
- -->error
- END;
- errDist := 0;
- END SynError;
- PROCEDURE Get;
- VAR
- s: ARRAY [0 .. 31] OF CHAR;
- BEGIN
- REPEAT
- -->scanner.Get(sym);
- IF sym <= maxT THEN
- INC(errDist);
- ELSE
- -->pragmas
- END;
- UNTIL sym <= maxT
- END Get;
- PROCEDURE In (VAR s: SymbolSet; x: CARDINAL): BOOLEAN;
- BEGIN
- RETURN x MOD setsize IN s[x DIV setsize];
- END In;
- PROCEDURE Expect (n: CARDINAL);
- BEGIN
- IF sym = n THEN Get ELSE SynError(n) END
- END Expect;
- PROCEDURE ExpectWeak (n, follow: CARDINAL);
- BEGIN
- IF sym = n
- THEN Get
- ELSE SynError(n); WHILE ~ In(symSet[follow], sym) DO Get END
- END
- END ExpectWeak;
- PROCEDURE WeakSeparator (n, syFol, repFol: CARDINAL): BOOLEAN;
- VAR
- s: SymbolSet;
- i: CARDINAL;
- BEGIN
- IF sym = n
- THEN Get; RETURN TRUE
- ELSIF In(symSet[repFol], sym) THEN RETURN FALSE
- ELSE
- i := 0;
- WHILE i <= maxT DIV setsize DO
- s[i] := symSet[0, i] + symSet[syFol, i] + symSet[repFol, i]; INC(i)
- END;
- SynError(n); WHILE ~ In(s, sym) DO Get END;
- RETURN In(symSet[syFol], sym)
- END
- END WeakSeparator;
- PROCEDURE LexName (VAR Lex: ARRAY OF CHAR);
- BEGIN
- -->scanner.GetName(-->scanner.pos, -->scanner.len, Lex)
- END LexName;
- PROCEDURE LexString (VAR Lex: ARRAY OF CHAR);
- BEGIN
- -->scanner.GetString(-->scanner.pos, -->scanner.len, Lex)
- END LexString;
- PROCEDURE LookAheadName (VAR Lex: ARRAY OF CHAR);
- BEGIN
- -->scanner.GetName(-->scanner.nextPos, -->scanner.nextLen, Lex)
- END LookAheadName;
- PROCEDURE LookAheadString (VAR Lex: ARRAY OF CHAR);
- BEGIN
- -->scanner.GetString(-->scanner.nextPos, -->scanner.nextLen, Lex)
- END LookAheadString;
- PROCEDURE Successful (): BOOLEAN;
- BEGIN
- RETURN -->scanner.errors = 0
- END Successful;
- -->productions
- PROCEDURE Parse;
- BEGIN
- -->parseRoot
- END Parse;
- BEGIN
- errDist := minErrDist;
- -->initialization
- END -->modulename.
- -->definitionDEFINITION MODULE -->modulename;
- (* Parser generated by Coco/R *)
- PROCEDURE Parse;
- PROCEDURE Successful (): BOOLEAN;
- (* Returns TRUE if no errors have been recorded while parsing *)
- PROCEDURE SynError (errNo: INTEGER);
- (* Report syntax error errNo *)
- PROCEDURE SemError (errNo: INTEGER);
- (* Report semantic error errNo *)
- PROCEDURE LexString (VAR Lex: ARRAY OF CHAR);
- (* Retrieves Lex as exact spelling of current token *)
- PROCEDURE LexName (VAR Lex: ARRAY OF CHAR);
- (* Retrieves Lex as name of current token (capitalized if IGNORE CASE) *)
- PROCEDURE LookAheadName (VAR Lex: ARRAY OF CHAR);
- (* Retrieves Lex as exact spelling of lookahead token *)
- PROCEDURE LookAheadString (VAR Lex: ARRAY OF CHAR);
- (* Retrieves Lex as name of lookahead token (capitalized if IGNORE CASE) *)
- END -->modulename.
|