yaccpar 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. YYSys: module
  2. {
  3. FD: adt
  4. {
  5. fd: int;
  6. };
  7. fildes: fn(fd: int): ref FD;
  8. fprint: fn(fd: ref FD, s: string, *): int;
  9. };
  10. yysys: YYSys;
  11. yystderr: ref YYSys->FD;
  12. YYFLAG: con -1000;
  13. # parser for yacc output
  14. yytokname(yyc: int): string
  15. {
  16. if(yyc > 0 && yyc <= len yytoknames && yytoknames[yyc-1] != nil)
  17. return yytoknames[yyc-1];
  18. return "<"+string yyc+">";
  19. }
  20. yystatname(yys: int): string
  21. {
  22. if(yys >= 0 && yys < len yystates && yystates[yys] != nil)
  23. return yystates[yys];
  24. return "<"+string yys+">\n";
  25. }
  26. yylex1(yylex: ref YYLEX): int
  27. {
  28. c : int;
  29. yychar := yylex.lex();
  30. if(yychar <= 0)
  31. c = yytok1[0];
  32. else if(yychar < len yytok1)
  33. c = yytok1[yychar];
  34. else if(yychar >= YYPRIVATE && yychar < YYPRIVATE+len yytok2)
  35. c = yytok2[yychar-YYPRIVATE];
  36. else{
  37. n := len yytok3;
  38. c = 0;
  39. for(i := 0; i < n; i+=2) {
  40. if(yytok3[i+0] == yychar) {
  41. c = yytok3[i+1];
  42. break;
  43. }
  44. }
  45. if(c == 0)
  46. c = yytok2[1]; # unknown char
  47. }
  48. if(yydebug >= 3)
  49. yysys->fprint(yystderr, "lex %.4ux %s\n", yychar, yytokname(c));
  50. return c;
  51. }
  52. YYS: adt
  53. {
  54. yyv: YYSTYPE;
  55. yys: int;
  56. };
  57. yyparse(yylex: ref YYLEX): int
  58. {
  59. if(yydebug >= 1 && yysys == nil) {
  60. yysys = load YYSys "$Sys";
  61. yystderr = yysys->fildes(2);
  62. }
  63. yys := array[YYMAXDEPTH] of YYS;
  64. yyval: YYSTYPE;
  65. yystate := 0;
  66. yychar := -1;
  67. yynerrs := 0; # number of errors
  68. yyerrflag := 0; # error recovery flag
  69. yyp := -1;
  70. yyn := 0;
  71. yystack:
  72. for(;;){
  73. # put a state and value onto the stack
  74. if(yydebug >= 4)
  75. yysys->fprint(yystderr, "char %s in %s", yytokname(yychar), yystatname(yystate));
  76. yyp++;
  77. if(yyp >= len yys)
  78. yys = (array[len yys * 2] of YYS)[0:] = yys;
  79. yys[yyp].yys = yystate;
  80. yys[yyp].yyv = yyval;
  81. for(;;){
  82. yyn = yypact[yystate];
  83. if(yyn > YYFLAG) { # simple state
  84. if(yychar < 0)
  85. yychar = yylex1(yylex);
  86. yyn += yychar;
  87. if(yyn >= 0 && yyn < YYLAST) {
  88. yyn = yyact[yyn];
  89. if(yychk[yyn] == yychar) { # valid shift
  90. yychar = -1;
  91. yyp++;
  92. if(yyp >= len yys)
  93. yys = (array[len yys * 2] of YYS)[0:] = yys;
  94. yystate = yyn;
  95. yys[yyp].yys = yystate;
  96. yys[yyp].yyv = yylex.lval;
  97. if(yyerrflag > 0)
  98. yyerrflag--;
  99. if(yydebug >= 4)
  100. yysys->fprint(yystderr, "char %s in %s", yytokname(yychar), yystatname(yystate));
  101. continue;
  102. }
  103. }
  104. }
  105. # default state action
  106. yyn = yydef[yystate];
  107. if(yyn == -2) {
  108. if(yychar < 0)
  109. yychar = yylex1(yylex);
  110. # look through exception table
  111. for(yyxi:=0;; yyxi+=2)
  112. if(yyexca[yyxi] == -1 && yyexca[yyxi+1] == yystate)
  113. break;
  114. for(yyxi += 2;; yyxi += 2) {
  115. yyn = yyexca[yyxi];
  116. if(yyn < 0 || yyn == yychar)
  117. break;
  118. }
  119. yyn = yyexca[yyxi+1];
  120. if(yyn < 0){
  121. yyn = 0;
  122. break yystack;
  123. }
  124. }
  125. if(yyn != 0)
  126. break;
  127. # error ... attempt to resume parsing
  128. if(yyerrflag == 0) { # brand new error
  129. yylex.error("syntax error");
  130. yynerrs++;
  131. if(yydebug >= 1) {
  132. yysys->fprint(yystderr, "%s", yystatname(yystate));
  133. yysys->fprint(yystderr, "saw %s\n", yytokname(yychar));
  134. }
  135. }
  136. if(yyerrflag != 3) { # incompletely recovered error ... try again
  137. yyerrflag = 3;
  138. # find a state where "error" is a legal shift action
  139. while(yyp >= 0) {
  140. yyn = yypact[yys[yyp].yys] + YYERRCODE;
  141. if(yyn >= 0 && yyn < YYLAST) {
  142. yystate = yyact[yyn]; # simulate a shift of "error"
  143. if(yychk[yystate] == YYERRCODE)
  144. continue yystack;
  145. }
  146. # the current yyp has no shift onn "error", pop stack
  147. if(yydebug >= 2)
  148. yysys->fprint(yystderr, "error recovery pops state %d, uncovers %d\n",
  149. yys[yyp].yys, yys[yyp-1].yys );
  150. yyp--;
  151. }
  152. # there is no state on the stack with an error shift ... abort
  153. yyn = 1;
  154. break yystack;
  155. }
  156. # no shift yet; clobber input char
  157. if(yydebug >= 2)
  158. yysys->fprint(yystderr, "error recovery discards %s\n", yytokname(yychar));
  159. if(yychar == YYEOFCODE) {
  160. yyn = 1;
  161. break yystack;
  162. }
  163. yychar = -1;
  164. # try again in the same state
  165. }
  166. # reduction by production yyn
  167. if(yydebug >= 2)
  168. yysys->fprint(yystderr, "reduce %d in:\n\t%s", yyn, yystatname(yystate));
  169. yypt := yyp;
  170. yyp -= yyr2[yyn];
  171. # yyval = yys[yyp+1].yyv;
  172. yym := yyn;
  173. # consult goto table to find next state
  174. yyn = yyr1[yyn];
  175. yyg := yypgo[yyn];
  176. yyj := yyg + yys[yyp].yys + 1;
  177. if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)
  178. yystate = yyact[yyg];
  179. case yym {
  180. $A
  181. }
  182. }
  183. return yyn;
  184. }