1 | // GPDefSyntaxAnalyzerSyn.cs HDO, 2006-08-28
|
---|
2 | // -------------
|
---|
3 | // Table-driven top-down syntax analyzer (G-code interpreter).
|
---|
4 | // Generated by Coco-2 (PGT).
|
---|
5 | //=====================================|========================================
|
---|
6 |
|
---|
7 | // --- call pragma mehts. and exec. sem. acts. after syntax errors? ---
|
---|
8 | #define CONTPRAGMAACTS // !!!must be defined for SG and PGT!!!
|
---|
9 | #undef CONTSEMACTS // should not be defined
|
---|
10 |
|
---|
11 | using System;
|
---|
12 | using System.Text;
|
---|
13 |
|
---|
14 | using Lex = GPDefSyntaxAnalyzerLex;
|
---|
15 | using Sem = GPDefSyntaxAnalyzerSem;
|
---|
16 |
|
---|
17 | public class GPDefSyntaxAnalyzerSyn {
|
---|
18 |
|
---|
19 | public static String MODULENAME = "GPDefSyntaxAnalyzerSyn";
|
---|
20 |
|
---|
21 | // --- G-code instructions ---
|
---|
22 | public enum Instruction {
|
---|
23 | T, TA, TC, TCA, NT, NTA, ANY, ANYA, EPS, EPSA, JMP, RET
|
---|
24 | } // Instruction
|
---|
25 |
|
---|
26 | private const int ROOTPC = 207;
|
---|
27 | private const int LASTTERM = 28;
|
---|
28 | private const int LASTPRAGMA = 29;
|
---|
29 |
|
---|
30 |
|
---|
31 | // --- other constants ---
|
---|
32 | private const int MINERRDIST = 3;
|
---|
33 | private const int MAXSTACKLEN = 100;
|
---|
34 | private const int EOFTOK = 0;
|
---|
35 | private const int FIRSTNONTERM = LASTPRAGMA + 1;
|
---|
36 |
|
---|
37 | public class NTData {
|
---|
38 | public int startPC;
|
---|
39 | public bool del;
|
---|
40 | public Sets.Set256 firstSet;
|
---|
41 | public NTData(int startPC, bool del, Sets.Set256 firstSet) {
|
---|
42 | this.startPC = startPC;
|
---|
43 | this.del = del;
|
---|
44 | this.firstSet = firstSet;
|
---|
45 | } // NTData
|
---|
46 | } // NTData
|
---|
47 |
|
---|
48 | private class GrammarTable {
|
---|
49 | public int[] header = {
|
---|
50 | 212, 28, 29, 41, 3, 0
|
---|
51 | };
|
---|
52 | public byte[] code = {
|
---|
53 | 0, 1, 2, 28, 1, 1, 13, 10, 0, 1, 12, 14, 0, 0,
|
---|
54 | 5, 5, 3, 24, 0, 2, 10, 16, 0, 0, 10, 5, 8, 34,
|
---|
55 | 0, 3, 10, 26, 0, 0, 6, 5, 4, 44, 0, 4, 10, 36,
|
---|
56 | 0, 1, 8, 56, 0, 0, 2, 2, 28, 5, 0, 19, 11, 0,
|
---|
57 | 9, 10, 48, 0, 0, 4, 11, 0, 7, 11, 2, 28, 1, 0,
|
---|
58 | 19, 11, 2, 28, 1, 0, 17, 5, 1, 83, 0, 2, 4, 5,
|
---|
59 | 3, 0, 19, 11, 4, 6, 1, 1, 18, 102, 0, 4, 6, 2,
|
---|
60 | 10, 92, 0, 8, 1, 11, 4, 7, 1, 5, 7, 116, 0, 2,
|
---|
61 | 10, 108, 0, 8, 2, 11, 3, 28, 125, 0, 1, 11, 1, 3,
|
---|
62 | 130, 0, 11, 1, 20, 140, 0, 4, 5, 2, 0, 21, 11, 1,
|
---|
63 | 22, 150, 0, 4, 5, 3, 0, 23, 11, 1, 24, 160, 0, 4,
|
---|
64 | 5, 4, 0, 25, 11, 4, 2, 5, 11, 2, 28, 1, 1, 11,
|
---|
65 | 174, 0, 4, 9, 2, 0, 19, 11, 5, 10, 185, 0, 1, 10,
|
---|
66 | 177, 0, 8, 3, 11, 2, 28, 1, 0, 14, 4, 11, 2, 11,
|
---|
67 | 1, 15, 202, 0, 11, 0, 16, 0, 27, 11, 4, 0, 1, 0,
|
---|
68 | 0, 11
|
---|
69 | };
|
---|
70 | public NTData[] nts = {
|
---|
71 | new NTData( 1, false, new Sets.Set256(0x0002)),
|
---|
72 | new NTData( 61, false, new Sets.Set256(0x0010)),
|
---|
73 | new NTData( 64, false, new Sets.Set256(0x0080)),
|
---|
74 | new NTData( 67, false, new Sets.Set256(0x0000, 0x1000)),
|
---|
75 | new NTData( 73, false, new Sets.Set256(0x0000, 0x1000)),
|
---|
76 | new NTData( 89, false, new Sets.Set256(0x0088, 0x1150)),
|
---|
77 | new NTData( 105, false, new Sets.Set256(0x0088, 0x1150)),
|
---|
78 | new NTData( 119, false, new Sets.Set256(0x0088, 0x1150)),
|
---|
79 | new NTData( 164, false, new Sets.Set256(0x0000, 0x1000)),
|
---|
80 | new NTData( 177, true , new Sets.Set256(0x0000, 0x1000)),
|
---|
81 | new NTData( 188, false, new Sets.Set256(0x0000, 0x1000)),
|
---|
82 | new NTData( 197, false, new Sets.Set256(0x8000, 0x0001))
|
---|
83 | };
|
---|
84 | public Sets.Set256[] epsSets = {
|
---|
85 | new Sets.Set256(0x0000, 0x02a8),
|
---|
86 | new Sets.Set256(0x0000, 0x02ac),
|
---|
87 | new Sets.Set256(0x0000, 0x0008)
|
---|
88 | };
|
---|
89 | public Sets.Set256[] anySets = {
|
---|
90 | new Sets.Set256(0x0000)
|
---|
91 | };
|
---|
92 | public String[] names = {
|
---|
93 | "end of file", "PROBLEM", "END", "EPS", "LOCAL", "NONTERMINALS",
|
---|
94 | "RULES", "SEM", "MAXIMIZE", "MINIMIZE", "TERMINALS", "CONSTRAINTS",
|
---|
95 | "INIT", "CODE", "IN", "SET", "RANGE", "=", "|", ".", "(", ")", "[",
|
---|
96 | "]", "{", "}", ">>", "..", "ident", "source", "GPDefSyntaxAnalyzer",
|
---|
97 | "SemDecl", "SemAction", "NonterminalDecl", "RuleDef", "SynExpr",
|
---|
98 | "SynTerm", "SynFact", "TerminalDecl", "ConstraintDef",
|
---|
99 | "ConstraintRule", "SetDefinition"
|
---|
100 | };
|
---|
101 | } // GrammarTable;
|
---|
102 |
|
---|
103 | private static GrammarTable gt;
|
---|
104 |
|
---|
105 | private static int pc; // G-code counter
|
---|
106 | private static int[] stk; // stack of G-code return adresses
|
---|
107 | private static int sp; // stack pointer
|
---|
108 | private static bool mustRead; // next Lex.token to read
|
---|
109 | private static int altRoot; // root of alternative chain
|
---|
110 | private static bool leaveOrEnter; // leaveCnt > 0 OR enterCnt > 0
|
---|
111 | private static int leaveCnt; // nr. of sem. proc. to leave
|
---|
112 | private static int enterCnt; // nr. of sem. proc. to enter
|
---|
113 | private static int errDist; // current error distance
|
---|
114 | private static int[] stkAtErr; // saved stack at error position
|
---|
115 | private static int[] newSP; // new stack length
|
---|
116 | private static int[] newPC; // pc after recovery
|
---|
117 |
|
---|
118 |
|
---|
119 | public static void GPDefSyntaxAnalyzerSynMethod(Utils.ModuleAction action, out String moduleName) {
|
---|
120 | //-----------------------------------|----------------------------------------
|
---|
121 | moduleName = MODULENAME;
|
---|
122 | switch (action) {
|
---|
123 | case Utils.ModuleAction.getModuleName:
|
---|
124 | return;
|
---|
125 | case Utils.ModuleAction.initModule:
|
---|
126 | Errors.InstallStopParsingMethod(StopParsing);
|
---|
127 | gt = new GrammarTable();
|
---|
128 | stk = new int[MAXSTACKLEN];
|
---|
129 | stkAtErr = new int[MAXSTACKLEN];
|
---|
130 | newSP = new int[LASTTERM + 1];
|
---|
131 | newPC = new int[LASTTERM + 1];
|
---|
132 | break;
|
---|
133 | case Utils.ModuleAction.resetModule:
|
---|
134 | break;
|
---|
135 | case Utils.ModuleAction.cleanupModule:
|
---|
136 | gt = null;
|
---|
137 | stk = null;
|
---|
138 | stkAtErr = null;
|
---|
139 | newSP = null;
|
---|
140 | newPC = null;
|
---|
141 | break;
|
---|
142 | } // switch
|
---|
143 | } // GPDefSyntaxAnalyzerSynMethod
|
---|
144 |
|
---|
145 | private static void Push(int pc) {
|
---|
146 | if (sp < MAXSTACKLEN)
|
---|
147 | stk[sp++] = pc;
|
---|
148 | else
|
---|
149 | Errors.Restriction(MODULENAME, "Push", "parser stack overflow");
|
---|
150 | } // Push
|
---|
151 |
|
---|
152 | private static int Pop() {
|
---|
153 | if (sp > 0)
|
---|
154 | return stk[--sp];
|
---|
155 | else {
|
---|
156 | Errors.CompilerError(MODULENAME, "Pop", "parser stack underflow");
|
---|
157 | return 0;
|
---|
158 | } // else
|
---|
159 | } // Pop
|
---|
160 |
|
---|
161 | private static void GetNextToken() {
|
---|
162 | for (;;) {
|
---|
163 | Lex.GetToken(); // updates Lex.token
|
---|
164 | if (Lex.token <= LASTTERM)
|
---|
165 | return;
|
---|
166 | #if !CONTPRAGMAACTS
|
---|
167 | if (NumOfSynErrors() == 0)
|
---|
168 | #endif
|
---|
169 | Sem.pragmaMethods[Lex.token - LASTTERM - 1]();
|
---|
170 | } // for
|
---|
171 | } // GetNextToken
|
---|
172 |
|
---|
173 | private static int AdrAt(int pc) {
|
---|
174 | return (gt.code[pc - 1] |
|
---|
175 | (gt.code[pc ] << 8));
|
---|
176 | } // AdrAt
|
---|
177 |
|
---|
178 | private static void AdjustPC(ref int pc) {
|
---|
179 | if (pc == 0)
|
---|
180 | return;
|
---|
181 | for (;;)
|
---|
182 | switch ((Instruction)gt.code[pc - 1]) {
|
---|
183 | case Instruction.T:
|
---|
184 | case Instruction.TA:
|
---|
185 | case Instruction.TC:
|
---|
186 | case Instruction.TCA:
|
---|
187 | case Instruction.NT:
|
---|
188 | case Instruction.NTA:
|
---|
189 | case Instruction.ANY:
|
---|
190 | case Instruction.ANYA:
|
---|
191 | case Instruction.EPS:
|
---|
192 | case Instruction.EPSA:
|
---|
193 | return;
|
---|
194 | case Instruction.JMP:
|
---|
195 | pc = AdrAt(pc + 1);
|
---|
196 | break;
|
---|
197 | case Instruction.RET:
|
---|
198 | pc = 0;
|
---|
199 | return;
|
---|
200 | default:
|
---|
201 | pc++; // syn. or sem. action
|
---|
202 | break;
|
---|
203 | } // switch
|
---|
204 | } // AdjustPC
|
---|
205 |
|
---|
206 | private static void GetSymInstr(int pc,
|
---|
207 | out int opcode, out int sy, out int nextPC, out int altPC) {
|
---|
208 | opcode = gt.code[pc - 1];
|
---|
209 | nextPC = 0; // dummy init
|
---|
210 | altPC = 0; // dummy init
|
---|
211 | switch ((Instruction)opcode) {
|
---|
212 | case Instruction.T:
|
---|
213 | case Instruction.TA:
|
---|
214 | case Instruction.TC:
|
---|
215 | case Instruction.TCA:
|
---|
216 | case Instruction.ANYA:
|
---|
217 | case Instruction.EPS:
|
---|
218 | case Instruction.EPSA:
|
---|
219 | sy = gt.code[pc];
|
---|
220 | break;
|
---|
221 | case Instruction.NT:
|
---|
222 | case Instruction.NTA:
|
---|
223 | sy = gt.code[pc] + FIRSTNONTERM;
|
---|
224 | break;
|
---|
225 | default: // ANY, JMP, RET, SEM, SYN
|
---|
226 | sy = 0;
|
---|
227 | break;
|
---|
228 | } // switch
|
---|
229 | switch ((Instruction)opcode) {
|
---|
230 | case Instruction.T:
|
---|
231 | case Instruction.EPS:
|
---|
232 | nextPC = pc + 2;
|
---|
233 | altPC = 0;
|
---|
234 | break;
|
---|
235 | case Instruction.TC:
|
---|
236 | case Instruction.NT:
|
---|
237 | nextPC = pc + 3;
|
---|
238 | altPC = 0;
|
---|
239 | break;
|
---|
240 | case Instruction.TA:
|
---|
241 | case Instruction.ANYA:
|
---|
242 | case Instruction.EPSA:
|
---|
243 | nextPC = pc + 4;
|
---|
244 | altPC = AdrAt(pc + 2);
|
---|
245 | break;
|
---|
246 | case Instruction.TCA:
|
---|
247 | case Instruction.NTA:
|
---|
248 | nextPC = pc + 5;
|
---|
249 | altPC = AdrAt(pc + 2);
|
---|
250 | break;
|
---|
251 | case Instruction.ANY:
|
---|
252 | nextPC = pc + 1;
|
---|
253 | altPC = 0;
|
---|
254 | break;
|
---|
255 | } // switch
|
---|
256 | AdjustPC(ref nextPC);
|
---|
257 | AdjustPC(ref altPC);
|
---|
258 | } // GetSymInstr
|
---|
259 |
|
---|
260 | private static void Fill(int pc, int sp) {
|
---|
261 | int opcode, sy, nextPC, altPC, i;
|
---|
262 | AdjustPC(ref pc);
|
---|
263 | while (pc > 0) {
|
---|
264 | GetSymInstr(pc, out opcode, out sy, out nextPC, out altPC);
|
---|
265 | switch ((Instruction)opcode) {
|
---|
266 | case Instruction.T:
|
---|
267 | case Instruction.TA:
|
---|
268 | case Instruction.TC:
|
---|
269 | case Instruction.TCA:
|
---|
270 | newPC[sy] = pc;
|
---|
271 | newSP[sy] = sp;
|
---|
272 | break;
|
---|
273 | case Instruction.NT:
|
---|
274 | case Instruction.NTA:
|
---|
275 | for (i = 0; i <= LASTTERM; i++)
|
---|
276 | if (Sets.member((ushort)i, gt.nts[sy - FIRSTNONTERM].firstSet)) {
|
---|
277 | newPC[i] = pc;
|
---|
278 | newSP[i] = sp;
|
---|
279 | }
|
---|
280 | if (gt.nts[sy - FIRSTNONTERM].del)
|
---|
281 | Fill(nextPC, sp);
|
---|
282 | break;
|
---|
283 | case Instruction.EPS:
|
---|
284 | case Instruction.EPSA:
|
---|
285 | Fill(nextPC, sp);
|
---|
286 | break;
|
---|
287 | } // switch
|
---|
288 | pc = altPC;
|
---|
289 | } // while
|
---|
290 | } // Fill
|
---|
291 |
|
---|
292 | private static void FillSucc(int pc, int sp) {
|
---|
293 | int opcode, sy, nextPC, altPC;
|
---|
294 | AdjustPC(ref pc);
|
---|
295 | while (pc > 0) {
|
---|
296 | GetSymInstr(pc, out opcode, out sy, out nextPC, out altPC);
|
---|
297 | if (nextPC > 0)
|
---|
298 | Fill(nextPC, sp);
|
---|
299 | pc = altPC;
|
---|
300 | } // while
|
---|
301 | } // FillSucc
|
---|
302 |
|
---|
303 | private static void Triple(int altRoot) {
|
---|
304 | for (int i = 0; i <= LASTTERM; i++) { // clear triple list
|
---|
305 | newPC[i] = 0;
|
---|
306 | newSP[i] = 0;
|
---|
307 | } // for
|
---|
308 | for (int i = 1; i <= sp; i++) { // successors of stacked nt's
|
---|
309 | FillSucc(stk[i - 1], i - 1);
|
---|
310 | Fill(stk[i - 1], i - 1);
|
---|
311 | } // for
|
---|
312 | FillSucc(altRoot, sp); // successors of alt. chain
|
---|
313 | Fill(altRoot, sp); // current alt. chain
|
---|
314 | } // Triple
|
---|
315 |
|
---|
316 | private static void HandleSynErr(ref int pc, ref int altRoot) {
|
---|
317 | int opcode, sy, nextPC, altPC, adjPC, nwSP, eq;
|
---|
318 | bool nameInMsg;
|
---|
319 | String name;
|
---|
320 | StringBuilder msg = new StringBuilder();
|
---|
321 | leaveOrEnter = false;
|
---|
322 | if (errDist >= MINERRDIST) { // --- primary error
|
---|
323 | nameInMsg = false;
|
---|
324 | adjPC = altRoot;
|
---|
325 | AdjustPC(ref adjPC);
|
---|
326 | while (adjPC > 0) {
|
---|
327 | GetSymInstr(adjPC, out opcode, out sy, out nextPC, out altPC);
|
---|
328 | if ( (Instruction)opcode >= Instruction.T &&
|
---|
329 | (Instruction)opcode <= Instruction.NTA ) {
|
---|
330 | if ( gt.names[sy].IndexOf(' ') >= 0 ||
|
---|
331 | !Char.IsLetter(gt.names[sy][0]) )
|
---|
332 | name = "\"" + gt.names[sy] + "\"";
|
---|
333 | else
|
---|
334 | name = gt.names[sy];
|
---|
335 | if (name.IndexOf('{') > -1) // prevent formatting problems in Errors.SynError
|
---|
336 | name = name.Replace("{", "{{");
|
---|
337 | if (name.IndexOf('}') > -1) // prevent formatting problems in Errors.SynError
|
---|
338 | name = name.Replace("}", "}}");
|
---|
339 | if (msg.Length + name.Length + 2 > 80) {
|
---|
340 | msg.Append(" ...");
|
---|
341 | break;
|
---|
342 | } // if
|
---|
343 | if (!nameInMsg) {
|
---|
344 | nameInMsg = true;
|
---|
345 | msg.Append("expected: " + name);
|
---|
346 | } else {
|
---|
347 | msg.Append(", ");
|
---|
348 | msg.Append(name);
|
---|
349 | } // else
|
---|
350 | } // if
|
---|
351 | adjPC = altPC;
|
---|
352 | } // while
|
---|
353 | if (!nameInMsg)
|
---|
354 | msg.Append("syntax error");
|
---|
355 | Errors.SynError(Lex.tokenLine, Lex.tokenCol, msg.ToString(), "");
|
---|
356 | Triple(altRoot);
|
---|
357 | while (newPC[Lex.token] == 0) {
|
---|
358 | GetNextToken(); // may result in a call to StopParsing
|
---|
359 | if (leaveOrEnter)
|
---|
360 | return;
|
---|
361 | } // while
|
---|
362 | nwSP = newSP[Lex.token];
|
---|
363 | leaveCnt = sp - nwSP;
|
---|
364 | enterCnt = 0;
|
---|
365 | Array.Copy(stk, stkAtErr, stk.Length); // save stack
|
---|
366 | } else { // --- spurios error
|
---|
367 | if (errDist == 0) { // no token used since last error
|
---|
368 | GetNextToken(); // may result in a call to StopParsing
|
---|
369 | if (leaveOrEnter)
|
---|
370 | return;
|
---|
371 | } // if
|
---|
372 | while (newPC[Lex.token] == 0) {
|
---|
373 | GetNextToken(); // may result in a call to StopParsing
|
---|
374 | if (leaveOrEnter)
|
---|
375 | return;
|
---|
376 | } // while
|
---|
377 | nwSP = newSP[Lex.token];
|
---|
378 | eq = 2; // compare stkAtErr and stk
|
---|
379 | while (eq <= sp && eq <= nwSP && stkAtErr[eq - 1] == stk[eq - 1])
|
---|
380 | eq++;
|
---|
381 | eq--; // stacks are equal up to index eq
|
---|
382 | leaveCnt = sp - eq;
|
---|
383 | if (nwSP < eq) {
|
---|
384 | leaveCnt = sp - nwSP;
|
---|
385 | enterCnt = 0;
|
---|
386 | } else if (nwSP > eq)
|
---|
387 | enterCnt = nwSP - eq;
|
---|
388 | else // nwSP == eq
|
---|
389 | enterCnt = 0;
|
---|
390 | Array.Copy(stkAtErr, stk, stk.Length); // restore stack
|
---|
391 | } // else
|
---|
392 | leaveOrEnter = (leaveCnt + enterCnt) > 0;
|
---|
393 | sp = nwSP;
|
---|
394 | pc = newPC[Lex.token];
|
---|
395 | altRoot = pc;
|
---|
396 | errDist = 0;
|
---|
397 | } // HandleSynErr
|
---|
398 |
|
---|
399 | public static int Interpret() {
|
---|
400 | //-----------------------------------|----------------------------------------
|
---|
401 | int actionNr, opcode, currPC;
|
---|
402 | for (;;) {
|
---|
403 | opcode = gt.code[pc - 1];
|
---|
404 | if ( !leaveOrEnter && mustRead &&
|
---|
405 | (Instruction)opcode <= Instruction.EPSA ) {
|
---|
406 | GetNextToken();
|
---|
407 | mustRead = false;
|
---|
408 | errDist++;
|
---|
409 | altRoot = pc;
|
---|
410 | } // if
|
---|
411 | if (leaveOrEnter) {
|
---|
412 | if (leaveCnt > 0) {
|
---|
413 | leaveCnt--;
|
---|
414 | actionNr = 0;
|
---|
415 | } else { // enterCnt > 0
|
---|
416 | enterCnt--;
|
---|
417 | actionNr = gt.code[stkAtErr[sp - enterCnt - 1] - 2];
|
---|
418 | } // else
|
---|
419 | leaveOrEnter = (leaveCnt + enterCnt) > 0;
|
---|
420 | return actionNr;
|
---|
421 | } // if
|
---|
422 | pc++;
|
---|
423 | switch ((Instruction)opcode) {
|
---|
424 | case Instruction.T:
|
---|
425 | if (Lex.token == gt.code[pc - 1])
|
---|
426 | if (Lex.token != EOFTOK) {
|
---|
427 | pc++;
|
---|
428 | mustRead = true;
|
---|
429 | } else {
|
---|
430 | return 0;
|
---|
431 | } // else
|
---|
432 | else
|
---|
433 | HandleSynErr(ref pc, ref altRoot);
|
---|
434 | break;
|
---|
435 | case Instruction.TA:
|
---|
436 | if (Lex.token == gt.code[pc - 1]) {
|
---|
437 | pc += 3;
|
---|
438 | mustRead = true;
|
---|
439 | } else
|
---|
440 | pc = AdrAt(pc + 1); // try alternative
|
---|
441 | break;
|
---|
442 | case Instruction.TC:
|
---|
443 | if (Lex.token == gt.code[pc - 1]) {
|
---|
444 | pc += 2;
|
---|
445 | mustRead = true;
|
---|
446 | actionNr = gt.code[pc - 2];
|
---|
447 | return actionNr;
|
---|
448 | } else
|
---|
449 | HandleSynErr(ref pc, ref altRoot);
|
---|
450 | break;
|
---|
451 | case Instruction.TCA:
|
---|
452 | if (Lex.token == gt.code[pc - 1]) {
|
---|
453 | pc += 4;
|
---|
454 | mustRead = true;
|
---|
455 | actionNr = gt.code[pc - 2];
|
---|
456 | return actionNr;
|
---|
457 | } else
|
---|
458 | pc = AdrAt(pc + 1); // try alternative
|
---|
459 | break;
|
---|
460 | case Instruction.NT:
|
---|
461 | currPC = gt.code[pc - 1];
|
---|
462 | if ( gt.nts[currPC].del ||
|
---|
463 | Sets.member((ushort)Lex.token, gt.nts[currPC].firstSet) ) {
|
---|
464 | pc++;
|
---|
465 | actionNr = gt.code[pc - 1];
|
---|
466 | Push(pc + 1);
|
---|
467 | pc = gt.nts[currPC].startPC;
|
---|
468 | altRoot = pc;
|
---|
469 | return actionNr;
|
---|
470 | } else
|
---|
471 | HandleSynErr(ref pc, ref altRoot);
|
---|
472 | break;
|
---|
473 | case Instruction.NTA:
|
---|
474 | currPC = gt.code[pc - 1];
|
---|
475 | if (Sets.member((ushort)Lex.token, gt.nts[currPC].firstSet)) {
|
---|
476 | pc += 3;
|
---|
477 | actionNr = gt.code[pc - 1];
|
---|
478 | Push(pc + 1);
|
---|
479 | pc = gt.nts[currPC].startPC;
|
---|
480 | altRoot = pc;
|
---|
481 | return actionNr;
|
---|
482 | } else
|
---|
483 | pc = AdrAt(pc + 1);
|
---|
484 | break;
|
---|
485 | case Instruction.ANY:
|
---|
486 | mustRead = true;
|
---|
487 | break;
|
---|
488 | case Instruction.ANYA:
|
---|
489 | currPC = gt.code[pc - 1];
|
---|
490 | if (Sets.member((ushort)Lex.token, gt.anySets[currPC - 1])) {
|
---|
491 | pc += 3;
|
---|
492 | mustRead = true;
|
---|
493 | } else
|
---|
494 | pc = AdrAt(pc + 1);
|
---|
495 | break;
|
---|
496 | case Instruction.EPS:
|
---|
497 | currPC = gt.code[pc - 1];
|
---|
498 | if (Sets.member((ushort)Lex.token, gt.epsSets[currPC - 1]))
|
---|
499 | pc++;
|
---|
500 | else
|
---|
501 | HandleSynErr(ref pc, ref altRoot);
|
---|
502 | break;
|
---|
503 | case Instruction.EPSA:
|
---|
504 | currPC = gt.code[pc - 1];
|
---|
505 | if (Sets.member((ushort)Lex.token, gt.epsSets[currPC - 1]))
|
---|
506 | pc += 3;
|
---|
507 | else
|
---|
508 | pc = AdrAt(pc + 1);
|
---|
509 | break;
|
---|
510 | case Instruction.JMP:
|
---|
511 | pc = AdrAt(pc);
|
---|
512 | break;
|
---|
513 | case Instruction.RET:
|
---|
514 | pc = Pop();
|
---|
515 | altRoot = pc;
|
---|
516 | return 0;
|
---|
517 | default:
|
---|
518 | if (opcode <= 128) {
|
---|
519 | #if !CONTSEMACTS
|
---|
520 | if (Errors.NumOfSynErrors() == 0)
|
---|
521 | #endif
|
---|
522 | return opcode - 12;
|
---|
523 | } else // opcode > 128
|
---|
524 | return opcode - 128;
|
---|
525 | break;
|
---|
526 | } // switch
|
---|
527 | } // for
|
---|
528 | } // Interpret
|
---|
529 |
|
---|
530 |
|
---|
531 | public static bool Parse() {
|
---|
532 | //-----------------------------------|----------------------------------------
|
---|
533 | Lex.InitLex();
|
---|
534 | sp = 0;
|
---|
535 | pc = ROOTPC;
|
---|
536 | altRoot = pc;
|
---|
537 | mustRead = true;
|
---|
538 | errDist = MINERRDIST + 1;
|
---|
539 | leaveOrEnter = false;
|
---|
540 | leaveCnt = 0;
|
---|
541 | enterCnt = 0;
|
---|
542 | Sem.StartSem();
|
---|
543 | return Errors.NumOfSynErrors() == 0;
|
---|
544 | } // Parse
|
---|
545 |
|
---|
546 |
|
---|
547 | public static void StopParsing() {
|
---|
548 | //-----------------------------------|----------------------------------------
|
---|
549 | leaveCnt = sp + 1;
|
---|
550 | enterCnt = 0;
|
---|
551 | leaveOrEnter = true;
|
---|
552 | } // StopParsing
|
---|
553 |
|
---|
554 | } // GPDefSyntaxAnalyzerSyn
|
---|
555 |
|
---|
556 | // End of GPDefSyntaxAnalyzerSyn.cs
|
---|
557 | //=====================================|========================================
|
---|