?? parser.frm
字號(hào):
UNIT -->modulename;
(* Parser generated by Coco/R (Pascal version) *)
INTERFACE
PROCEDURE Parse;
FUNCTION Successful : BOOLEAN;
(* Returns TRUE if no errors have been recorded while parsing *)
PROCEDURE SynError (errNo: INTEGER);
(* Report syntax error with specified errNo *)
PROCEDURE SemError (errNo: INTEGER);
(* Report semantic error with specified errNo *)
PROCEDURE LexString (VAR Lex : STRING);
(* Retrieves Lex as exact spelling of current token *)
PROCEDURE LexName (VAR Lex : STRING);
(* Retrieves Lex as name of current token (capitalized if IGNORE CASE) *)
PROCEDURE LookAheadString (VAR Lex : STRING);
(* Retrieves Lex as exact spelling of lookahead token *)
PROCEDURE LookAheadName (VAR Lex : STRING);
(* Retrieves Lex as name of lookahead token (capitalized if IGNORE CASE) *)
IMPLEMENTATION
USES -->scanner
-->declarations
CONST
-->constants
minErrDist = 2; (* minimal distance (good tokens) between two errors *)
setsize = 16; (* sets are stored in 16 bits *)
TYPE
BITSET = SET OF 0 .. 15;
SymbolSet = ARRAY [0 .. maxT DIV setsize] OF BITSET;
VAR
symSet: ARRAY [0 .. -->symSetSize] OF SymbolSet; (*symSet[0] = allSyncSyms*)
errDist: INTEGER; (* number of symbols recognized since last error *)
sym: INTEGER; (* current input symbol *)
PROCEDURE SemError (errNo: INTEGER);
BEGIN
IF errDist >= minErrDist THEN BEGIN
-->error
END;
errDist := 0;
END;
PROCEDURE SynError (errNo: INTEGER);
BEGIN
IF errDist >= minErrDist THEN BEGIN
-->error
END;
errDist := 0;
END;
PROCEDURE Get;
VAR
s: STRING;
BEGIN
REPEAT
-->scanner.Get(sym);
IF sym <= maxT THEN
INC(errDist)
ELSE BEGIN
-->pragmas
END;
UNTIL sym <= maxT
END;
FUNCTION _In (VAR s: SymbolSet; x: INTEGER): BOOLEAN;
BEGIN
_In := x MOD setsize IN s[x DIV setsize];
END;
PROCEDURE Expect (n: INTEGER);
BEGIN
IF sym = n THEN Get ELSE SynError(n);
END;
PROCEDURE ExpectWeak (n, follow: INTEGER);
BEGIN
IF sym = n
THEN Get
ELSE BEGIN
SynError(n); WHILE NOT _In(symSet[follow], sym) DO Get;
END
END;
FUNCTION WeakSeparator (n, syFol, repFol: INTEGER): BOOLEAN;
VAR
s: SymbolSet;
i: INTEGER;
BEGIN
IF sym = n
THEN BEGIN Get; WeakSeparator := TRUE; EXIT; END
ELSE IF _In(symSet[repFol], sym) THEN BEGIN WeakSeparator := FALSE; exit END
ELSE BEGIN
i := 0;
WHILE i <= maxT DIV setsize DO BEGIN
s[i] := symSet[0, i] + symSet[syFol, i] + symSet[repFol, i]; INC(i)
END;
SynError(n); WHILE NOT _In(s, sym) DO Get;
WeakSeparator := _In(symSet[syFol], sym)
END
END;
PROCEDURE LexName (VAR Lex : STRING);
BEGIN
-->scanner.GetName(-->scanner.pos, -->scanner.len, Lex)
END;
PROCEDURE LexString (VAR Lex : STRING);
BEGIN
-->scanner.GetString(-->scanner.pos, -->scanner.len, Lex)
END;
PROCEDURE LookAheadName (VAR Lex : STRING);
BEGIN
-->scanner.GetName(-->scanner.nextPos, -->scanner.nextLen, Lex)
END;
PROCEDURE LookAheadString (VAR Lex : STRING);
BEGIN
-->scanner.GetString(-->scanner.nextPos, -->scanner.nextLen, Lex)
END;
FUNCTION Successful : BOOLEAN;
BEGIN
Successful := -->scanner.errors = 0
END;
-->productions
PROCEDURE Parse;
BEGIN
-->parseRoot
END;
BEGIN
errDist := minErrDist;
-->initialization
END. (* -->modulename *)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -