parser.frm 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. IMPLEMENTATION MODULE -->modulename;
  2. (* Parser generated by Coco/R - assuming ISO IO library will be available. *)
  3. IMPORT -->scanner, FileIO;
  4. -->declarations
  5. CONST
  6. -->constants
  7. minErrDist = 2; (* minimal distance (good tokens) between two errors *)
  8. setsize = 16; (* sets are stored in 16 bits *)
  9. TYPE
  10. SymbolSet = ARRAY [0 .. maxT DIV setsize] OF BITSET;
  11. VAR
  12. symSet: ARRAY [0 .. -->symSetSize] OF SymbolSet; (*symSet[0] = allSyncSyms*)
  13. errDist: CARDINAL; (* number of symbols recognized since last error *)
  14. sym: CARDINAL; (* current input symbol *)
  15. PROCEDURE SemError (errNo: INTEGER);
  16. BEGIN
  17. IF errDist >= minErrDist THEN
  18. -->error
  19. END;
  20. errDist := 0;
  21. END SemError;
  22. PROCEDURE SynError (errNo: INTEGER);
  23. BEGIN
  24. IF errDist >= minErrDist THEN
  25. -->error
  26. END;
  27. errDist := 0;
  28. END SynError;
  29. PROCEDURE Get;
  30. VAR
  31. s: ARRAY [0 .. 31] OF CHAR;
  32. BEGIN
  33. REPEAT
  34. -->scanner.Get(sym);
  35. IF sym <= maxT THEN
  36. INC(errDist);
  37. ELSE
  38. -->pragmas
  39. END;
  40. UNTIL sym <= maxT
  41. END Get;
  42. PROCEDURE In (VAR s: SymbolSet; x: CARDINAL): BOOLEAN;
  43. BEGIN
  44. RETURN x MOD setsize IN s[x DIV setsize];
  45. END In;
  46. PROCEDURE Expect (n: CARDINAL);
  47. BEGIN
  48. IF sym = n THEN Get ELSE SynError(n) END
  49. END Expect;
  50. PROCEDURE ExpectWeak (n, follow: CARDINAL);
  51. BEGIN
  52. IF sym = n
  53. THEN Get
  54. ELSE SynError(n); WHILE ~ In(symSet[follow], sym) DO Get END
  55. END
  56. END ExpectWeak;
  57. PROCEDURE WeakSeparator (n, syFol, repFol: CARDINAL): BOOLEAN;
  58. VAR
  59. s: SymbolSet;
  60. i: CARDINAL;
  61. BEGIN
  62. IF sym = n
  63. THEN Get; RETURN TRUE
  64. ELSIF In(symSet[repFol], sym) THEN RETURN FALSE
  65. ELSE
  66. i := 0;
  67. WHILE i <= maxT DIV setsize DO
  68. s[i] := symSet[0, i] + symSet[syFol, i] + symSet[repFol, i]; INC(i)
  69. END;
  70. SynError(n); WHILE ~ In(s, sym) DO Get END;
  71. RETURN In(symSet[syFol], sym)
  72. END
  73. END WeakSeparator;
  74. PROCEDURE LexName (VAR Lex: ARRAY OF CHAR);
  75. BEGIN
  76. -->scanner.GetName(-->scanner.pos, -->scanner.len, Lex)
  77. END LexName;
  78. PROCEDURE LexString (VAR Lex: ARRAY OF CHAR);
  79. BEGIN
  80. -->scanner.GetString(-->scanner.pos, -->scanner.len, Lex)
  81. END LexString;
  82. PROCEDURE LookAheadName (VAR Lex: ARRAY OF CHAR);
  83. BEGIN
  84. -->scanner.GetName(-->scanner.nextPos, -->scanner.nextLen, Lex)
  85. END LookAheadName;
  86. PROCEDURE LookAheadString (VAR Lex: ARRAY OF CHAR);
  87. BEGIN
  88. -->scanner.GetString(-->scanner.nextPos, -->scanner.nextLen, Lex)
  89. END LookAheadString;
  90. PROCEDURE Successful (): BOOLEAN;
  91. BEGIN
  92. RETURN -->scanner.errors = 0
  93. END Successful;
  94. -->productions
  95. PROCEDURE Parse;
  96. BEGIN
  97. -->parseRoot
  98. END Parse;
  99. BEGIN
  100. errDist := minErrDist;
  101. -->initialization
  102. END -->modulename.
  103. -->definitionDEFINITION MODULE -->modulename;
  104. (* Parser generated by Coco/R *)
  105. PROCEDURE Parse;
  106. PROCEDURE Successful (): BOOLEAN;
  107. (* Returns TRUE if no errors have been recorded while parsing *)
  108. PROCEDURE SynError (errNo: INTEGER);
  109. (* Report syntax error errNo *)
  110. PROCEDURE SemError (errNo: INTEGER);
  111. (* Report semantic error errNo *)
  112. PROCEDURE LexString (VAR Lex: ARRAY OF CHAR);
  113. (* Retrieves Lex as exact spelling of current token *)
  114. PROCEDURE LexName (VAR Lex: ARRAY OF CHAR);
  115. (* Retrieves Lex as name of current token (capitalized if IGNORE CASE) *)
  116. PROCEDURE LookAheadName (VAR Lex: ARRAY OF CHAR);
  117. (* Retrieves Lex as exact spelling of lookahead token *)
  118. PROCEDURE LookAheadString (VAR Lex: ARRAY OF CHAR);
  119. (* Retrieves Lex as name of lookahead token (capitalized if IGNORE CASE) *)
  120. END -->modulename.