skeleton-2.0.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. # jay skeleton
  2. # character in column 1 determines outcome...
  3. # # is a comment
  4. # . is copied
  5. # t is copied as //t if -t is set
  6. # other lines are interpreted to call jay procedures
  7. .// created by jay 0.7 (c) 1998 [email protected]
  8. .
  9. .#if NET_2_0
  10. .
  11. prolog ## %{ ... %} prior to the first %%
  12. .
  13. . /** error output stream.
  14. . It should be changeable.
  15. . */
  16. . internal System.IO.TextWriter ErrorOutput = System.Console.Out;
  17. .
  18. . /** simplified error message.
  19. . @see <a href="#yyerror(java.lang.String, java.lang.String[])">yyerror</a>
  20. . */
  21. . internal void yyerror (string message) {
  22. . yyerror(message, null);
  23. . }
  24. .
  25. . /** (syntax) error message.
  26. . Can be overwritten to control message format.
  27. . @param message text to be displayed.
  28. . @param expected vector of acceptable tokens, if available.
  29. . */
  30. . internal void yyerror (string message, string[] expected) {
  31. . if ((expected != null) && (expected.Length > 0)) {
  32. . ErrorOutput.Write (message+", expecting");
  33. . for (int n = 0; n < expected.Length; ++ n)
  34. . ErrorOutput.Write (" "+expected[n]);
  35. . ErrorOutput.WriteLine ();
  36. . } else
  37. . ErrorOutput.WriteLine (message);
  38. . }
  39. .
  40. . /** debugging support, requires the package jay.yydebug.
  41. . Set to null to suppress debugging messages.
  42. . */
  43. t internal yydebug.yyDebug debug;
  44. .
  45. debug ## tables for debugging support
  46. .
  47. . /** index-checked interface to yyNames[].
  48. . @param token single character or %token value.
  49. . @return token name or [illegal] or [unknown].
  50. . */
  51. t internal static string yyname (int token) {
  52. t if ((token < 0) || (token > yyNames.Length)) return "[illegal]";
  53. t string name;
  54. t if ((name = yyNames[token]) != null) return name;
  55. t return "[unknown]";
  56. t }
  57. .
  58. . /** computes list of expected tokens on error by tracing the tables.
  59. . @param state for which to compute the list.
  60. . @return list of token names.
  61. . */
  62. . internal string[] yyExpecting (int state) {
  63. . int token, n, len = 0;
  64. . bool[] ok = new bool[yyNames.Length];
  65. .
  66. . if ((n = yySindex[state]) != 0)
  67. . for (token = n < 0 ? -n : 0;
  68. . (token < yyNames.Length) && (n+token < yyTable.Length); ++ token)
  69. . if (yyCheck[n+token] == token && !ok[token] && yyNames[token] != null) {
  70. . ++ len;
  71. . ok[token] = true;
  72. . }
  73. . if ((n = yyRindex[state]) != 0)
  74. . for (token = n < 0 ? -n : 0;
  75. . (token < yyNames.Length) && (n+token < yyTable.Length); ++ token)
  76. . if (yyCheck[n+token] == token && !ok[token] && yyNames[token] != null) {
  77. . ++ len;
  78. . ok[token] = true;
  79. . }
  80. .
  81. . string [] result = new string[len];
  82. . for (n = token = 0; n < len; ++ token)
  83. . if (ok[token]) result[n++] = yyNames[token];
  84. . return result;
  85. . }
  86. .
  87. . /** the generated parser, with debugging messages.
  88. . Maintains a state and a value stack, currently with fixed maximum size.
  89. . @param yyLex scanner.
  90. . @param yydebug debug message writer implementing yyDebug, or null.
  91. . @return result of the last reduction, if any.
  92. . @throws yyException on irrecoverable parse error.
  93. . */
  94. . internal Object yyparse (yyParser.yyInput yyLex, Object yyd)
  95. . {
  96. t this.debug = (yydebug.yyDebug)yyd;
  97. . return yyparse(yyLex);
  98. . }
  99. .
  100. . /** initial size and increment of the state/value stack [default 256].
  101. . This is not final so that it can be overwritten outside of invocations
  102. . of yyparse().
  103. . */
  104. . internal int yyMax;
  105. .
  106. . /** executed at the beginning of a reduce action.
  107. . Used as $$ = yyDefault($1), prior to the user-specified action, if any.
  108. . Can be overwritten to provide deep copy, etc.
  109. . @param first value for $1, or null.
  110. . @return first.
  111. . */
  112. . internal Object yyDefault (Object first) {
  113. . return first;
  114. . }
  115. .
  116. . /** the generated parser.
  117. . Maintains a state and a value stack, currently with fixed maximum size.
  118. . @param yyLex scanner.
  119. . @return result of the last reduction, if any.
  120. . @throws yyException on irrecoverable parse error.
  121. . */
  122. . internal Object yyparse (yyParser.yyInput yyLex)
  123. . {
  124. . if (yyMax <= 0) yyMax = 256; // initial size
  125. . int yyState = 0; // state stack ptr
  126. . int [] yyStates = new int[yyMax]; // state stack
  127. . Object yyVal = null; // value stack ptr
  128. . Object [] yyVals = new Object[yyMax]; // value stack
  129. . int yyToken = -1; // current input
  130. . int yyErrorFlag = 0; // #tks to shift
  131. .
  132. local ## %{ ... %} after the first %%
  133. . int yyTop = 0;
  134. . goto skip;
  135. . yyLoop:
  136. . yyTop++;
  137. . skip:
  138. . for (;; ++ yyTop) {
  139. . if (yyTop >= yyStates.Length) { // dynamically increase
  140. . int[] i = new int[yyStates.Length+yyMax];
  141. . yyStates.CopyTo (i, 0);
  142. . yyStates = i;
  143. . Object[] o = new Object[yyVals.Length+yyMax];
  144. . yyVals.CopyTo (o, 0);
  145. . yyVals = o;
  146. . }
  147. . yyStates[yyTop] = yyState;
  148. . yyVals[yyTop] = yyVal;
  149. t if (debug != null) debug.push(yyState, yyVal);
  150. .
  151. . yyDiscarded: for (;;) { // discarding a token does not change stack
  152. . int yyN;
  153. . if ((yyN = yyDefRed[yyState]) == 0) { // else [default] reduce (yyN)
  154. . if (yyToken < 0) {
  155. . yyToken = yyLex.advance() ? yyLex.token() : 0;
  156. t if (debug != null)
  157. t debug.lex(yyState, yyToken, yyname(yyToken), yyLex.value());
  158. . }
  159. . if ((yyN = yySindex[yyState]) != 0 && ((yyN += yyToken) >= 0)
  160. . && (yyN < yyTable.Length) && (yyCheck[yyN] == yyToken)) {
  161. t if (debug != null)
  162. t debug.shift(yyState, yyTable[yyN], yyErrorFlag-1);
  163. . yyState = yyTable[yyN]; // shift to yyN
  164. . yyVal = yyLex.value();
  165. . yyToken = -1;
  166. . if (yyErrorFlag > 0) -- yyErrorFlag;
  167. . goto yyLoop;
  168. . }
  169. . if ((yyN = yyRindex[yyState]) != 0 && (yyN += yyToken) >= 0
  170. . && yyN < yyTable.Length && yyCheck[yyN] == yyToken)
  171. . yyN = yyTable[yyN]; // reduce (yyN)
  172. . else
  173. . switch (yyErrorFlag) {
  174. .
  175. . case 0:
  176. . yyerror(String.Format ("syntax error, got token `{0}'", yyname (yyToken)), yyExpecting(yyState));
  177. t if (debug != null) debug.error("syntax error");
  178. . goto case 1;
  179. . case 1: case 2:
  180. . yyErrorFlag = 3;
  181. . do {
  182. . if ((yyN = yySindex[yyStates[yyTop]]) != 0
  183. . && (yyN += Token.yyErrorCode) >= 0 && yyN < yyTable.Length
  184. . && yyCheck[yyN] == Token.yyErrorCode) {
  185. t if (debug != null)
  186. t debug.shift(yyStates[yyTop], yyTable[yyN], 3);
  187. . yyState = yyTable[yyN];
  188. . yyVal = yyLex.value();
  189. . goto yyLoop;
  190. . }
  191. t if (debug != null) debug.pop(yyStates[yyTop]);
  192. . } while (-- yyTop >= 0);
  193. t if (debug != null) debug.reject();
  194. . throw new yyParser.yyException("irrecoverable syntax error");
  195. .
  196. . case 3:
  197. . if (yyToken == 0) {
  198. t if (debug != null) debug.reject();
  199. . throw new yyParser.yyException("irrecoverable syntax error at end-of-file");
  200. . }
  201. t if (debug != null)
  202. t debug.discard(yyState, yyToken, yyname(yyToken),
  203. t yyLex.value());
  204. . yyToken = -1;
  205. . goto yyDiscarded; // leave stack alone
  206. . }
  207. . }
  208. . int yyV = yyTop + 1-yyLen[yyN];
  209. t if (debug != null)
  210. t debug.reduce(yyState, yyStates[yyV-1], yyN, yyRule[yyN], yyLen[yyN]);
  211. . yyVal = yyDefault(yyV > yyTop ? null : yyVals[yyV]);
  212. . switch (yyN) {
  213. actions ## code from the actions within the grammar
  214. . }
  215. . yyTop -= yyLen[yyN];
  216. . yyState = yyStates[yyTop];
  217. . int yyM = yyLhs[yyN];
  218. . if (yyState == 0 && yyM == 0) {
  219. t if (debug != null) debug.shift(0, yyFinal);
  220. . yyState = yyFinal;
  221. . if (yyToken < 0) {
  222. . yyToken = yyLex.advance() ? yyLex.token() : 0;
  223. t if (debug != null)
  224. t debug.lex(yyState, yyToken,yyname(yyToken), yyLex.value());
  225. . }
  226. . if (yyToken == 0) {
  227. t if (debug != null) debug.accept(yyVal);
  228. . return yyVal;
  229. . }
  230. . goto yyLoop;
  231. . }
  232. . if (((yyN = yyGindex[yyM]) != 0) && ((yyN += yyState) >= 0)
  233. . && (yyN < yyTable.Length) && (yyCheck[yyN] == yyState))
  234. . yyState = yyTable[yyN];
  235. . else
  236. . yyState = yyDgoto[yyM];
  237. t if (debug != null) debug.shift(yyStates[yyTop], yyState);
  238. . goto yyLoop;
  239. . }
  240. . }
  241. . }
  242. .
  243. tables ## tables for rules, default reduction, and action calls
  244. .
  245. epilog ## text following second %%
  246. .namespace yydebug {
  247. . using System;
  248. . internal interface yyDebug {
  249. . void push (int state, Object value);
  250. . void lex (int state, int token, string name, Object value);
  251. . void shift (int from, int to, int errorFlag);
  252. . void pop (int state);
  253. . void discard (int state, int token, string name, Object value);
  254. . void reduce (int from, int to, int rule, string text, int len);
  255. . void shift (int from, int to);
  256. . void accept (Object value);
  257. . void error (string message);
  258. . void reject ();
  259. . }
  260. .
  261. . class yyDebugSimple : yyDebug {
  262. . void println (string s){
  263. . Console.Error.WriteLine (s);
  264. . }
  265. .
  266. . public void push (int state, Object value) {
  267. . println ("push\tstate "+state+"\tvalue "+value);
  268. . }
  269. .
  270. . public void lex (int state, int token, string name, Object value) {
  271. . println("lex\tstate "+state+"\treading "+name+"\tvalue "+value);
  272. . }
  273. .
  274. . public void shift (int from, int to, int errorFlag) {
  275. . switch (errorFlag) {
  276. . default: // normally
  277. . println("shift\tfrom state "+from+" to "+to);
  278. . break;
  279. . case 0: case 1: case 2: // in error recovery
  280. . println("shift\tfrom state "+from+" to "+to
  281. . +"\t"+errorFlag+" left to recover");
  282. . break;
  283. . case 3: // normally
  284. . println("shift\tfrom state "+from+" to "+to+"\ton error");
  285. . break;
  286. . }
  287. . }
  288. .
  289. . public void pop (int state) {
  290. . println("pop\tstate "+state+"\ton error");
  291. . }
  292. .
  293. . public void discard (int state, int token, string name, Object value) {
  294. . println("discard\tstate "+state+"\ttoken "+name+"\tvalue "+value);
  295. . }
  296. .
  297. . public void reduce (int from, int to, int rule, string text, int len) {
  298. . println("reduce\tstate "+from+"\tuncover "+to
  299. . +"\trule ("+rule+") "+text);
  300. . }
  301. .
  302. . public void shift (int from, int to) {
  303. . println("goto\tfrom state "+from+" to "+to);
  304. . }
  305. .
  306. . public void accept (Object value) {
  307. . println("accept\tvalue "+value);
  308. . }
  309. .
  310. . public void error (string message) {
  311. . println("error\t"+message);
  312. . }
  313. .
  314. . public void reject () {
  315. . println("reject");
  316. . }
  317. .
  318. . }
  319. .}
  320. .// %token constants
  321. . class Token {
  322. tokens public const int
  323. . }
  324. . namespace yyParser {
  325. . using System;
  326. . /** thrown for irrecoverable syntax errors and stack overflow.
  327. . */
  328. . internal class yyException : System.Exception {
  329. . public yyException (string message) : base (message) {
  330. . }
  331. . }
  332. .
  333. . /** must be implemented by a scanner object to supply input to the parser.
  334. . */
  335. . internal interface yyInput {
  336. . /** move on to next token.
  337. . @return false if positioned beyond tokens.
  338. . @throws IOException on input error.
  339. . */
  340. . bool advance (); // throws java.io.IOException;
  341. . /** classifies current token.
  342. . Should not be called if advance() returned false.
  343. . @return current %token or single character.
  344. . */
  345. . int token ();
  346. . /** associated with current token.
  347. . Should not be called if advance() returned false.
  348. . @return value for token().
  349. . */
  350. . Object value ();
  351. . }
  352. . }
  353. .} // close outermost namespace, that MUST HAVE BEEN opened in the prolog
  354. .
  355. .#endif