]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/m2/mc-boot/Gmcp3.c
Merge modula-2 front end onto gcc.
[thirdparty/gcc.git] / gcc / m2 / mc-boot / Gmcp3.c
1 /* do not edit automatically generated by mc from mcp3. */
2 /* output from mc-3.bnf, automatically generated do not edit.
3
4 Copyright (C) 2015-2022 Free Software Foundation, Inc.
5 Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
6
7 This file is part of GNU Modula-2.
8
9 GNU Modula-2 is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GNU Modula-2 is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GNU Modula-2; see the file COPYING. If not,
21 see <https://www.gnu.org/licenses/>. */
22
23 #include "config.h"
24 #include "system.h"
25 # if !defined (PROC_D)
26 # define PROC_D
27 typedef void (*PROC_t) (void);
28 typedef struct { PROC_t proc; } PROC;
29 # endif
30
31 # if !defined (TRUE)
32 # define TRUE (1==1)
33 # endif
34
35 # if !defined (FALSE)
36 # define FALSE (1==0)
37 # endif
38
39 #if defined(__cplusplus)
40 # undef NULL
41 # define NULL 0
42 #endif
43 #define _mcp3_H
44 #define _mcp3_C
45
46 # include "GDynamicStrings.h"
47 # include "GmcError.h"
48 # include "GnameKey.h"
49 # include "GmcPrintf.h"
50 # include "GmcDebug.h"
51 # include "GmcReserved.h"
52 # include "GmcMetaError.h"
53 # include "GmcStack.h"
54 # include "GmcLexBuf.h"
55 # include "Gdecl.h"
56
57 # define Pass1 FALSE
58 # define Debugging FALSE
59 typedef unsigned int mcp3_stop0;
60
61 typedef unsigned int mcp3_SetOfStop0;
62
63 typedef unsigned int mcp3_stop1;
64
65 typedef unsigned int mcp3_SetOfStop1;
66
67 typedef unsigned int mcp3_stop2;
68
69 typedef unsigned int mcp3_SetOfStop2;
70
71 static unsigned int WasNoError;
72 static unsigned int curisused;
73 static nameKey_Name curstring;
74 static nameKey_Name curident;
75 static decl_node curproc;
76 static decl_node frommodule;
77 static decl_node typeDes;
78 static decl_node typeExp;
79 static decl_node curmodule;
80 static mcStack_stack stk;
81
82 /*
83 CompilationUnit - returns TRUE if the input was correct enough to parse
84 in future passes.
85 */
86
87 extern "C" unsigned int mcp3_CompilationUnit (void);
88
89 /*
90 push -
91 */
92
93 static decl_node push (decl_node n);
94
95 /*
96 pop -
97 */
98
99 static decl_node pop (void);
100
101 /*
102 replace -
103 */
104
105 static decl_node replace (decl_node n);
106
107 /*
108 peep - returns the top node on the stack without removing it.
109 */
110
111 static decl_node peep (void);
112
113 /*
114 depth - returns the depth of the stack.
115 */
116
117 static unsigned int depth (void);
118
119 /*
120 checkDuplicate -
121 */
122
123 static void checkDuplicate (unsigned int b);
124
125 /*
126 checkDuplicate -
127 */
128
129 static void ErrorString (DynamicStrings_String s);
130
131 /*
132 checkDuplicate -
133 */
134
135 static void ErrorArray (const char *a_, unsigned int _a_high);
136
137 /*
138 checkParameterAttribute -
139 */
140
141 static void checkParameterAttribute (void);
142
143 /*
144 checkReturnAttribute -
145 */
146
147 static void checkReturnAttribute (void);
148
149 /*
150 pushNunbounded -
151 */
152
153 static void pushNunbounded (unsigned int c);
154
155 /*
156 makeIndexedArray - builds and returns an array of type, t, with, c, indices.
157 */
158
159 static decl_node makeIndexedArray (unsigned int c, decl_node t);
160
161 /*
162 importInto - from, m, import, name, into module, current.
163 It checks to see if curident is an enumeration type
164 and if so automatically includes all enumeration fields
165 as well.
166 */
167
168 static void importInto (decl_node m, nameKey_Name name, decl_node current);
169
170 /*
171 checkEndName - if module does not have, name, then issue an error containing, desc.
172 */
173
174 static void checkEndName (decl_node module, nameKey_Name name, const char *desc_, unsigned int _desc_high);
175
176 /*
177 DescribeStop - issues a message explaining what tokens were expected
178 */
179
180 static DynamicStrings_String DescribeStop (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
181
182 /*
183 DescribeError - issues a message explaining what tokens were expected
184 */
185
186 static void DescribeError (void);
187
188 /*
189 SyntaxError - after a syntax error we skip all tokens up until we reach
190 a stop symbol.
191 */
192
193 static void SyntaxError (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
194
195 /*
196 SyntaxCheck -
197 */
198
199 static void SyntaxCheck (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
200
201 /*
202 WarnMissingToken - generates a warning message about a missing token, t.
203 */
204
205 static void WarnMissingToken (mcReserved_toktype t);
206
207 /*
208 MissingToken - generates a warning message about a missing token, t.
209 */
210
211 static void MissingToken (mcReserved_toktype t);
212
213 /*
214 CheckAndInsert -
215 */
216
217 static unsigned int CheckAndInsert (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
218
219 /*
220 InStopSet
221 */
222
223 static unsigned int InStopSet (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
224
225 /*
226 PeepToken - peep token checks to see whether the stopset is satisfied by currenttoken
227 If it is not then it will insert a token providing the token
228 is one of ; ] ) } . OF END ,
229
230 if the stopset contains <identtok> then we do not insert a token
231 */
232
233 static void PeepToken (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
234
235 /*
236 Expect -
237 */
238
239 static void Expect (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
240
241 /*
242 Ident - error checking varient of Ident
243 */
244
245 static void Ident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
246
247 /*
248 string -
249 */
250
251 static void string (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
252
253 /*
254 Integer -
255 */
256
257 static void Integer (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
258
259 /*
260 Real -
261 */
262
263 static void Real (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
264
265 /*
266 FileUnit := DefinitionModule |
267 ImplementationOrProgramModule
268
269 first symbols:implementationtok, moduletok, definitiontok
270
271 cannot reachend
272 */
273
274 static void FileUnit (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
275
276 /*
277 ProgramModule := 'MODULE' Ident
278 % curmodule := lookupModule (curident) %
279
280 % enterScope (curmodule) %
281
282 % resetEnumPos (curmodule) %
283 [ Priority ] ';' { Import } Block
284 Ident
285 % checkEndName (curmodule, curident, 'program module') %
286
287 % setConstExpComplete (curmodule) %
288
289 % leaveScope %
290 '.'
291
292 first symbols:moduletok
293
294 cannot reachend
295 */
296
297 static void ProgramModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
298
299 /*
300 ImplementationModule := 'IMPLEMENTATION' 'MODULE'
301 Ident
302 % curmodule := lookupImp (curident) %
303
304 % enterScope (lookupDef (curident)) %
305
306 % enterScope (curmodule) %
307
308 % resetEnumPos (curmodule) %
309 [ Priority ] ';' { Import }
310 Block Ident
311 % checkEndName (curmodule, curident, 'implementation module') %
312
313 % setConstExpComplete (curmodule) %
314
315 % leaveScope ; leaveScope %
316 '.'
317
318 first symbols:implementationtok
319
320 cannot reachend
321 */
322
323 static void ImplementationModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
324
325 /*
326 ImplementationOrProgramModule := ImplementationModule |
327 ProgramModule
328
329 first symbols:moduletok, implementationtok
330
331 cannot reachend
332 */
333
334 static void ImplementationOrProgramModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
335
336 /*
337 Number := Integer | Real
338
339 first symbols:realtok, integertok
340
341 cannot reachend
342 */
343
344 static void Number (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
345
346 /*
347 Qualident := Ident { '.' Ident }
348
349 first symbols:identtok
350
351 cannot reachend
352 */
353
354 static void Qualident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
355
356 /*
357 ConstantDeclaration :=
358 % VAR d, e: node ; %
359 Ident
360 % d := lookupSym (curident) %
361 '=' ConstExpression
362 % e := pop () %
363
364 % assert (isConst (d)) %
365
366 % putConst (d, e) %
367
368
369 first symbols:identtok
370
371 cannot reachend
372 */
373
374 static void ConstantDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
375
376 /*
377 ConstExpressionNop := SimpleConstExpr
378 % VAR n: node ; %
379 [ Relation SimpleConstExpr ]
380
381 % n := makeConstExp () %
382
383
384 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
385
386 cannot reachend
387 */
388
389 static void ConstExpressionNop (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
390
391 /*
392 ConstExpression :=
393 % VAR n: node ; %
394
395 % n := push (makeConstExp ()) %
396 SimpleConstExpr [ Relation SimpleConstExpr ]
397
398 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
399
400 cannot reachend
401 */
402
403 static void ConstExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
404
405 /*
406 Relation := '=' | '#' | '<>' | '<' | '<=' |
407 '>' | '>=' | 'IN'
408
409 first symbols:intok, greaterequaltok, greatertok, lessequaltok, lesstok, lessgreatertok, hashtok, equaltok
410
411 cannot reachend
412 */
413
414 static void Relation (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
415
416 /*
417 SimpleConstExpr := UnaryOrConstTerm { AddOperator
418 ConstTerm }
419
420 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
421
422 cannot reachend
423 */
424
425 static void SimpleConstExpr (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
426
427 /*
428 UnaryOrConstTerm := '+' ConstTerm |
429 '-' ConstTerm |
430 ConstTerm
431
432 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
433
434 cannot reachend
435 */
436
437 static void UnaryOrConstTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
438
439 /*
440 AddOperator := '+' | '-' | 'OR'
441
442 first symbols:ortok, minustok, plustok
443
444 cannot reachend
445 */
446
447 static void AddOperator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
448
449 /*
450 ConstTerm := ConstFactor { MulOperator ConstFactor }
451
452 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok
453
454 cannot reachend
455 */
456
457 static void ConstTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
458
459 /*
460 MulOperator := '*' | '/' | 'DIV' | 'MOD' |
461 'REM' | 'AND' | '&'
462
463 first symbols:ambersandtok, andtok, remtok, modtok, divtok, dividetok, timestok
464
465 cannot reachend
466 */
467
468 static void MulOperator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
469
470 /*
471 ConstFactor := Number | ConstString |
472 ConstSetOrQualidentOrFunction |
473 '(' ConstExpressionNop ')' |
474 'NOT' ConstFactor |
475 ConstAttribute
476
477 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok
478
479 cannot reachend
480 */
481
482 static void ConstFactor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
483
484 /*
485 ConstString := string
486
487 first symbols:stringtok
488
489 cannot reachend
490 */
491
492 static void ConstString (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
493
494 /*
495 ComponentElement := ConstExpressionNop [ '..' ConstExpressionNop ]
496
497 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
498
499 cannot reachend
500 */
501
502 static void ComponentElement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
503
504 /*
505 ComponentValue := ComponentElement [ 'BY' ConstExpressionNop ]
506
507 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
508
509 cannot reachend
510 */
511
512 static void ComponentValue (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
513
514 /*
515 ArraySetRecordValue := ComponentValue { ',' ComponentValue }
516
517 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
518
519 cannot reachend
520 */
521
522 static void ArraySetRecordValue (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
523
524 /*
525 Constructor := '{' [ ArraySetRecordValue ] '}'
526
527 first symbols:lcbratok
528
529 cannot reachend
530 */
531
532 static void Constructor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
533
534 /*
535 ConstSetOrQualidentOrFunction := Qualident [ Constructor |
536 ConstActualParameters ] |
537 Constructor
538
539 first symbols:lcbratok, identtok
540
541 cannot reachend
542 */
543
544 static void ConstSetOrQualidentOrFunction (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
545
546 /*
547 ConstActualParameters := '(' [ ConstExpList ] ')'
548
549 first symbols:lparatok
550
551 cannot reachend
552 */
553
554 static void ConstActualParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
555
556 /*
557 ConstExpList := ConstExpressionNop { ',' ConstExpressionNop }
558
559 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
560
561 cannot reachend
562 */
563
564 static void ConstExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
565
566 /*
567 ConstAttribute := '__ATTRIBUTE__' '__BUILTIN__'
568 '(' '(' ConstAttributeExpression
569 ')' ')'
570
571 first symbols:attributetok
572
573 cannot reachend
574 */
575
576 static void ConstAttribute (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
577
578 /*
579 ConstAttributeExpression := Ident | '<' Qualident
580 ',' Ident '>'
581
582 first symbols:lesstok, identtok
583
584 cannot reachend
585 */
586
587 static void ConstAttributeExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
588
589 /*
590 ByteAlignment := ''
591
592 first symbols:ldirectivetok
593
594 cannot reachend
595 */
596
597 static void ByteAlignment (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
598
599 /*
600 OptAlignmentExpression := [ AlignmentExpression ]
601
602 first symbols:lparatok
603
604 reachend
605 */
606
607 static void OptAlignmentExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
608
609 /*
610 AlignmentExpression := '(' ConstExpressionNop ')'
611
612 first symbols:lparatok
613
614 cannot reachend
615 */
616
617 static void AlignmentExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
618
619 /*
620 Alignment := [ ByteAlignment ]
621
622 first symbols:ldirectivetok
623
624 reachend
625 */
626
627 static void Alignment (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
628
629 /*
630 IdentList := Ident { ',' Ident }
631
632 first symbols:identtok
633
634 cannot reachend
635 */
636
637 static void IdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
638
639 /*
640 PushIdentList :=
641 % VAR n: node ; %
642
643 % n := makeIdentList () %
644 Ident
645 % checkDuplicate (putIdent (n, curident)) %
646 { ',' Ident
647 % checkDuplicate (putIdent (n, curident)) %
648 }
649 % n := push (n) %
650
651
652 first symbols:identtok
653
654 cannot reachend
655 */
656
657 static void PushIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
658
659 /*
660 SubrangeType :=
661 % VAR low, high: node ; d: CARDINAL ; %
662 '['
663 % d := depth () %
664 ConstExpression
665 % low := pop () %
666
667 % assert (d = depth ()) %
668 '..' ConstExpression
669 % high := pop () %
670
671 % assert (d = depth ()) %
672
673 % typeExp := push (makeSubrange (low, high)) %
674
675 % assert (d = depth () - 1) %
676 ']'
677
678 first symbols:lsbratok
679
680 cannot reachend
681 */
682
683 static void SubrangeType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
684
685 /*
686 ArrayType := 'ARRAY'
687 % VAR c: CARDINAL ; t, n: node ; %
688
689 % c := 0 %
690 SimpleType
691 % INC (c) %
692 { ',' SimpleType
693 % INC (c) %
694 } 'OF' Type
695 % n := push (makeIndexedArray (c, pop ())) %
696
697
698 first symbols:arraytok
699
700 cannot reachend
701 */
702
703 static void ArrayType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
704
705 /*
706 RecordType := 'RECORD'
707 % VAR n: node ; %
708
709 % n := push (makeRecord ()) %
710
711 % n := push (NIL) no varient %
712 [ DefaultRecordAttributes ] FieldListSequence
713
714 % assert (pop ()=NIL) %
715 'END'
716
717 first symbols:recordtok
718
719 cannot reachend
720 */
721
722 static void RecordType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
723
724 /*
725 DefaultRecordAttributes := ''
726
727 first symbols:ldirectivetok
728
729 cannot reachend
730 */
731
732 static void DefaultRecordAttributes (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
733
734 /*
735 RecordFieldPragma := [ '' ]
736
737 first symbols:ldirectivetok
738
739 reachend
740 */
741
742 static void RecordFieldPragma (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
743
744 /*
745 FieldPragmaExpression := Ident PragmaConstExpression
746
747 first symbols:identtok
748
749 cannot reachend
750 */
751
752 static void FieldPragmaExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
753
754 /*
755 PragmaConstExpression := [ '(' ConstExpressionNop
756 ')' ]
757
758 first symbols:lparatok
759
760 reachend
761 */
762
763 static void PragmaConstExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
764
765 /*
766 AttributeExpression := Ident '(' ConstExpressionNop
767 ')'
768
769 first symbols:identtok
770
771 cannot reachend
772 */
773
774 static void AttributeExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
775
776 /*
777 FieldListSequence := FieldListStatement { ';' FieldListStatement }
778
779 first symbols:casetok, identtok, semicolontok
780
781 reachend
782 */
783
784 static void FieldListSequence (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
785
786 /*
787 FieldListStatement := [ FieldList ]
788
789 first symbols:identtok, casetok
790
791 reachend
792 */
793
794 static void FieldListStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
795
796 /*
797 FieldList :=
798 % VAR r, i, f, t, n, v, w: node ; d: CARDINAL ; %
799
800 % d := depth () %
801
802 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
803
804 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
805
806 % v := push (v) %
807
808 % assert (d=depth ()) %
809
810 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isVarientField (r))) %
811 PushIdentList ':'
812 % assert (d=depth () - 1) %
813
814 % i := pop () %
815 Type
816 % assert (d=depth () - 1) %
817
818 % t := pop () %
819 RecordFieldPragma
820 % assert (d=depth ()) %
821
822 % r := addFieldsToRecord (r, v, i, t) %
823
824 % assert (d=depth ()) %
825 |
826 'CASE'
827 % addRecordToList %
828
829 % d := depth () %
830
831 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
832
833 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
834
835 % v := push (v) %
836
837 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isRecordField (r))) %
838
839 % w := push (makeVarient (r)) %
840
841 % assert (d = depth () - 1) %
842
843 % addVarientToList %
844 CaseTag 'OF'
845 % assert (d = depth () - 1) %
846 Varient
847 % assert (d = depth () - 1) %
848 { '|' Varient
849 % assert (d = depth () - 1) %
850 }
851 % w := peep () ; assert (isVarient (w)) %
852
853 % assert (d = depth () - 1) %
854 [ 'ELSE' FieldListSequence ] 'END'
855
856 % w := pop () ; assert (isVarient (w)) %
857
858 % assert (d=depth ()) %
859
860
861 first symbols:casetok, identtok
862
863 cannot reachend
864 */
865
866 static void FieldList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
867
868 /*
869 TagIdent := Ident |
870 % curident := NulName %
871
872
873 first symbols:identtok
874
875 reachend
876 */
877
878 static void TagIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
879
880 /*
881 CaseTag :=
882 % VAR tagident: Name ; q, v, w, r: node ; %
883
884 % w := pop () ; v := pop () ; r := peep () ; v := push (v) ; w := push (w) %
885
886 % assert (isVarient (w)) %
887
888 % assert ((v=NIL) OR isVarient (v)) %
889
890 % assert (isRecord (r) OR isVarientField (r)) %
891
892 % assert (isVarient (push (pop ()))) %
893 TagIdent
894 % tagident := curident %
895 ( ':' PushQualident
896 % q := pop () %
897
898 % assert (isVarient (push (pop ()))) %
899 |
900 % q := NIL %
901 )
902 % buildVarientSelector (r, w, tagident, q) %
903
904
905 first symbols:colontok, identtok
906
907 reachend
908 */
909
910 static void CaseTag (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
911
912 /*
913 Varient :=
914 % VAR p, r, v, f: node ; d: CARDINAL ; %
915
916 % d := depth () %
917
918 % assert (isVarient (peep ())) %
919 [
920 % v := pop () ; assert (isVarient (v)) %
921
922 % r := pop () %
923
924 % p := peep () %
925
926 % r := push (r) %
927
928 % f := push (buildVarientFieldRecord (v, p)) %
929
930 % v := push (v) %
931 VarientCaseLabelList ':' FieldListSequence
932
933 % v := pop () %
934
935 % f := pop () %
936
937 % assert (isVarientField (f)) %
938
939 % assert (isVarient (v)) %
940
941 % v := push (v) %
942 ]
943 % assert (isVarient (peep ())) %
944
945 % assert (d=depth ()) %
946
947
948 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
949
950 reachend
951 */
952
953 static void Varient (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
954
955 /*
956 VarientCaseLabelList := VarientCaseLabels { ','
957 VarientCaseLabels }
958
959 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
960
961 cannot reachend
962 */
963
964 static void VarientCaseLabelList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
965
966 /*
967 VarientCaseLabels :=
968 % VAR l, h: node ; %
969
970 % h := NIL %
971 ConstExpression
972 % l := pop () %
973 [ '..' ConstExpression
974 % h := pop () %
975 ]
976 % l, h could be saved if necessary. %
977
978
979 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
980
981 cannot reachend
982 */
983
984 static void VarientCaseLabels (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
985
986 /*
987 SetType := ( 'SET' | 'PACKEDSET' ) 'OF' SimpleType
988
989 % VAR n: node ; %
990
991 % n := push (makeSet (pop ())) %
992
993
994 first symbols:oftok, packedsettok, settok
995
996 cannot reachend
997 */
998
999 static void SetType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1000
1001 /*
1002 PointerType := 'POINTER' 'TO' Type
1003 % VAR n: node ; %
1004
1005 % n := push (makePointer (pop ())) %
1006
1007
1008 first symbols:pointertok
1009
1010 cannot reachend
1011 */
1012
1013 static void PointerType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1014
1015 /*
1016 ProcedureType := 'PROCEDURE'
1017 % curproc := push (makeProcType ()) %
1018 [ FormalTypeList ]
1019
1020 first symbols:proceduretok
1021
1022 cannot reachend
1023 */
1024
1025 static void ProcedureType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1026
1027 /*
1028 FormalTypeList := '(' ( ')' FormalReturn |
1029 ProcedureParameters ')'
1030 FormalReturn )
1031
1032 first symbols:lparatok
1033
1034 cannot reachend
1035 */
1036
1037 static void FormalTypeList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1038
1039 /*
1040 FormalReturn := [ ':' OptReturnType ]
1041
1042 first symbols:colontok
1043
1044 reachend
1045 */
1046
1047 static void FormalReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1048
1049 /*
1050 OptReturnType := '[' PushQualident
1051 % putReturnType (curproc, pop ()) %
1052
1053 % putOptReturn (curproc) %
1054 ']' | PushQualident
1055 % putReturnType (curproc, pop ()) %
1056
1057
1058 first symbols:identtok, lsbratok
1059
1060 cannot reachend
1061 */
1062
1063 static void OptReturnType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1064
1065 /*
1066 ProcedureParameters := ProcedureParameter
1067 % addParameter (curproc, pop ()) %
1068 { ',' ProcedureParameter
1069
1070 % addParameter (curproc, pop ()) %
1071 }
1072
1073 first symbols:identtok, arraytok, periodperiodperiodtok, vartok
1074
1075 cannot reachend
1076 */
1077
1078 static void ProcedureParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1079
1080 /*
1081 ProcedureParameter := '...'
1082 % VAR n: node ; %
1083
1084 % n := push (makeVarargs ()) %
1085 | 'VAR' FormalType
1086 % n := push (makeVarParameter (NIL, pop (), curproc, TRUE)) %
1087 | FormalType
1088 % n := push (makeNonVarParameter (NIL, pop (), curproc, TRUE)) %
1089
1090
1091 first symbols:identtok, arraytok, vartok, periodperiodperiodtok
1092
1093 cannot reachend
1094 */
1095
1096 static void ProcedureParameter (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1097
1098 /*
1099 VarIdent :=
1100 % VAR n, a: node ; %
1101
1102 % n := pop () %
1103 Ident
1104 % checkDuplicate (putIdent (n, curident)) %
1105
1106 % n := push (n) %
1107 [ '[' ConstExpression
1108 % a := pop () could store, a, into, n. %
1109 ']' ]
1110
1111 first symbols:identtok
1112
1113 cannot reachend
1114 */
1115
1116 static void VarIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1117
1118 /*
1119 VarIdentList :=
1120 % VAR n: node ; %
1121
1122 % n := makeIdentList () %
1123
1124 % n := push (n) %
1125 VarIdent { ',' VarIdent }
1126
1127 first symbols:identtok
1128
1129 cannot reachend
1130 */
1131
1132 static void VarIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1133
1134 /*
1135 VariableDeclaration :=
1136 % VAR v, d: node ; %
1137 VarIdentList
1138 % v := pop () %
1139 ':' Type
1140 % d := makeVarDecl (v, pop ()) %
1141 Alignment
1142
1143 first symbols:identtok
1144
1145 cannot reachend
1146 */
1147
1148 static void VariableDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1149
1150 /*
1151 Designator := Qualident { SubDesignator }
1152
1153 first symbols:identtok
1154
1155 cannot reachend
1156 */
1157
1158 static void Designator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1159
1160 /*
1161 SubDesignator := '.' Ident | '[' ArrayExpList ']' |
1162 '^'
1163
1164 first symbols:uparrowtok, lsbratok, periodtok
1165
1166 cannot reachend
1167 */
1168
1169 static void SubDesignator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1170
1171 /*
1172 ArrayExpList := Expression { ',' Expression }
1173
1174 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
1175
1176 cannot reachend
1177 */
1178
1179 static void ArrayExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1180
1181 /*
1182 ExpList := Expression { ',' Expression }
1183
1184 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
1185
1186 cannot reachend
1187 */
1188
1189 static void ExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1190
1191 /*
1192 Expression := SimpleExpression [ Relation SimpleExpression ]
1193
1194 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
1195
1196 cannot reachend
1197 */
1198
1199 static void Expression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1200
1201 /*
1202 SimpleExpression := UnaryOrTerm { AddOperator Term }
1203
1204 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
1205
1206 cannot reachend
1207 */
1208
1209 static void SimpleExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1210
1211 /*
1212 UnaryOrTerm := '+' Term | '-' Term |
1213 Term
1214
1215 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
1216
1217 cannot reachend
1218 */
1219
1220 static void UnaryOrTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1221
1222 /*
1223 Term := Factor { MulOperator Factor }
1224
1225 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok
1226
1227 cannot reachend
1228 */
1229
1230 static void Term (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1231
1232 /*
1233 Factor := Number | string | SetOrDesignatorOrFunction |
1234 '(' Expression ')' |
1235 'NOT' ( Factor | ConstAttribute )
1236
1237 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok
1238
1239 cannot reachend
1240 */
1241
1242 static void Factor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1243
1244 /*
1245 SetOrDesignatorOrFunction := Qualident [ Constructor |
1246 SimpleDes
1247 [ ActualParameters ] ] |
1248 Constructor
1249
1250 first symbols:lcbratok, identtok
1251
1252 cannot reachend
1253 */
1254
1255 static void SetOrDesignatorOrFunction (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1256
1257 /*
1258 SimpleDes := { SubDesignator }
1259
1260 first symbols:periodtok, lsbratok, uparrowtok
1261
1262 reachend
1263 */
1264
1265 static void SimpleDes (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1266
1267 /*
1268 ActualParameters := '(' [ ExpList ] ')'
1269
1270 first symbols:lparatok
1271
1272 cannot reachend
1273 */
1274
1275 static void ActualParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1276
1277 /*
1278 ExitStatement := 'EXIT'
1279
1280 first symbols:exittok
1281
1282 cannot reachend
1283 */
1284
1285 static void ExitStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1286
1287 /*
1288 ReturnStatement := 'RETURN' [ Expression ]
1289
1290 first symbols:returntok
1291
1292 cannot reachend
1293 */
1294
1295 static void ReturnStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1296
1297 /*
1298 Statement := [ AssignmentOrProcedureCall |
1299 IfStatement | CaseStatement |
1300 WhileStatement |
1301 RepeatStatement |
1302 LoopStatement | ForStatement |
1303 WithStatement | AsmStatement |
1304 ExitStatement | ReturnStatement |
1305 RetryStatement ]
1306
1307 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok
1308
1309 reachend
1310 */
1311
1312 static void Statement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1313
1314 /*
1315 RetryStatement := 'RETRY'
1316
1317 first symbols:retrytok
1318
1319 cannot reachend
1320 */
1321
1322 static void RetryStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1323
1324 /*
1325 AssignmentOrProcedureCall := Designator ( ':=' Expression |
1326 ActualParameters |
1327
1328 % epsilon %
1329 )
1330
1331 first symbols:identtok
1332
1333 cannot reachend
1334 */
1335
1336 static void AssignmentOrProcedureCall (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1337
1338 /*
1339 StatementSequence := Statement { ';' Statement }
1340
1341 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok
1342
1343 reachend
1344 */
1345
1346 static void StatementSequence (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1347
1348 /*
1349 IfStatement := 'IF' Expression 'THEN' StatementSequence
1350 { 'ELSIF' Expression 'THEN' StatementSequence }
1351 [ 'ELSE' StatementSequence ] 'END'
1352
1353 first symbols:iftok
1354
1355 cannot reachend
1356 */
1357
1358 static void IfStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1359
1360 /*
1361 CaseStatement := 'CASE' Expression 'OF' Case { '|'
1362 Case }
1363 CaseEndStatement
1364
1365 first symbols:casetok
1366
1367 cannot reachend
1368 */
1369
1370 static void CaseStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1371
1372 /*
1373 CaseEndStatement := 'END' | 'ELSE' StatementSequence
1374 'END'
1375
1376 first symbols:elsetok, endtok
1377
1378 cannot reachend
1379 */
1380
1381 static void CaseEndStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1382
1383 /*
1384 Case := [ CaseLabelList ':' StatementSequence ]
1385
1386 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
1387
1388 reachend
1389 */
1390
1391 static void Case (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1392
1393 /*
1394 CaseLabelList := CaseLabels { ',' CaseLabels }
1395
1396 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
1397
1398 cannot reachend
1399 */
1400
1401 static void CaseLabelList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1402
1403 /*
1404 CaseLabels := ConstExpressionNop [ '..' ConstExpressionNop ]
1405
1406 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
1407
1408 cannot reachend
1409 */
1410
1411 static void CaseLabels (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1412
1413 /*
1414 WhileStatement := 'WHILE' Expression 'DO' StatementSequence
1415 'END'
1416
1417 first symbols:whiletok
1418
1419 cannot reachend
1420 */
1421
1422 static void WhileStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1423
1424 /*
1425 RepeatStatement := 'REPEAT' StatementSequence 'UNTIL'
1426 Expression
1427
1428 first symbols:repeattok
1429
1430 cannot reachend
1431 */
1432
1433 static void RepeatStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1434
1435 /*
1436 ForStatement := 'FOR' Ident ':=' Expression 'TO'
1437 Expression [ 'BY' ConstExpressionNop ]
1438 'DO' StatementSequence 'END'
1439
1440 first symbols:fortok
1441
1442 cannot reachend
1443 */
1444
1445 static void ForStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1446
1447 /*
1448 LoopStatement := 'LOOP' StatementSequence 'END'
1449
1450 first symbols:looptok
1451
1452 cannot reachend
1453 */
1454
1455 static void LoopStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1456
1457 /*
1458 WithStatement := 'WITH' Designator 'DO' StatementSequence
1459 'END'
1460
1461 first symbols:withtok
1462
1463 cannot reachend
1464 */
1465
1466 static void WithStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1467
1468 /*
1469 ProcedureDeclaration := ProcedureHeading ';' ProcedureBlock
1470 Ident
1471 % leaveScope %
1472
1473
1474 first symbols:proceduretok
1475
1476 cannot reachend
1477 */
1478
1479 static void ProcedureDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1480
1481 /*
1482 ProcedureIdent := Ident
1483 % curproc := lookupSym (curident) %
1484
1485 % enterScope (curproc) %
1486
1487
1488 first symbols:identtok
1489
1490 cannot reachend
1491 */
1492
1493 static void ProcedureIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1494
1495 /*
1496 DefProcedureIdent := Ident
1497 % curproc := lookupSym (curident) %
1498
1499
1500 first symbols:identtok
1501
1502 cannot reachend
1503 */
1504
1505 static void DefProcedureIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1506
1507 /*
1508 DefineBuiltinProcedure := [ '__ATTRIBUTE__' '__BUILTIN__'
1509 '(' '(' Ident ')' ')' |
1510 '__INLINE__' ]
1511
1512 first symbols:inlinetok, attributetok
1513
1514 reachend
1515 */
1516
1517 static void DefineBuiltinProcedure (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1518
1519 /*
1520 ProcedureHeading := 'PROCEDURE' DefineBuiltinProcedure
1521 ( ProcedureIdent [ FormalParameters ]
1522 AttributeNoReturn )
1523
1524 first symbols:proceduretok
1525
1526 cannot reachend
1527 */
1528
1529 static void ProcedureHeading (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1530
1531 /*
1532 Builtin := [ '__BUILTIN__' | '__INLINE__' ]
1533
1534 first symbols:inlinetok, builtintok
1535
1536 reachend
1537 */
1538
1539 static void Builtin (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1540
1541 /*
1542 DefProcedureHeading := 'PROCEDURE' Builtin ( DefProcedureIdent
1543 [ DefFormalParameters ]
1544 AttributeNoReturn )
1545
1546 first symbols:proceduretok
1547
1548 cannot reachend
1549 */
1550
1551 static void DefProcedureHeading (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1552
1553 /*
1554 ProcedureBlock := { Declaration } [ 'BEGIN' ProcedureBlockBody ]
1555 'END'
1556
1557 first symbols:proceduretok, moduletok, consttok, typetok, vartok, endtok, begintok
1558
1559 cannot reachend
1560 */
1561
1562 static void ProcedureBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1563
1564 /*
1565 Block := { Declaration } InitialBlock FinalBlock
1566 'END'
1567
1568 first symbols:proceduretok, moduletok, finallytok, begintok, consttok, typetok, vartok, endtok
1569
1570 cannot reachend
1571 */
1572
1573 static void Block (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1574
1575 /*
1576 InitialBlock := [ 'BEGIN' InitialBlockBody ]
1577
1578 first symbols:begintok
1579
1580 reachend
1581 */
1582
1583 static void InitialBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1584
1585 /*
1586 FinalBlock := [ 'FINALLY' FinalBlockBody ]
1587
1588 first symbols:finallytok
1589
1590 reachend
1591 */
1592
1593 static void FinalBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1594
1595 /*
1596 InitialBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
1597
1598 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
1599
1600 reachend
1601 */
1602
1603 static void InitialBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1604
1605 /*
1606 FinalBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
1607
1608 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
1609
1610 reachend
1611 */
1612
1613 static void FinalBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1614
1615 /*
1616 ProcedureBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
1617
1618 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
1619
1620 reachend
1621 */
1622
1623 static void ProcedureBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1624
1625 /*
1626 NormalPart := StatementSequence
1627
1628 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
1629
1630 reachend
1631 */
1632
1633 static void NormalPart (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1634
1635 /*
1636 ExceptionalPart := StatementSequence
1637
1638 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
1639
1640 reachend
1641 */
1642
1643 static void ExceptionalPart (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1644
1645 /*
1646 Declaration := 'CONST' { ConstantDeclaration ';' } |
1647 'TYPE' { TypeDeclaration } |
1648 'VAR' { VariableDeclaration ';' } |
1649 ProcedureDeclaration ';' |
1650 ModuleDeclaration ';'
1651
1652 first symbols:moduletok, proceduretok, vartok, typetok, consttok
1653
1654 cannot reachend
1655 */
1656
1657 static void Declaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1658
1659 /*
1660 DefFormalParameters := '('
1661 % paramEnter (curproc) %
1662 [ DefMultiFPSection ] ')'
1663
1664 % paramLeave (curproc) %
1665 FormalReturn
1666
1667 first symbols:lparatok
1668
1669 cannot reachend
1670 */
1671
1672 static void DefFormalParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1673
1674 /*
1675 DefMultiFPSection := DefExtendedFP |
1676 FPSection [ ';' DefMultiFPSection ]
1677
1678 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
1679
1680 cannot reachend
1681 */
1682
1683 static void DefMultiFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1684
1685 /*
1686 FormalParameters := '('
1687 % paramEnter (curproc) %
1688 [ MultiFPSection ] ')'
1689 % paramLeave (curproc) %
1690 FormalReturn
1691
1692 first symbols:lparatok
1693
1694 cannot reachend
1695 */
1696
1697 static void FormalParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1698
1699 /*
1700 AttributeNoReturn := [ NoReturn |
1701 % setNoReturn (curproc, FALSE) %
1702 ]
1703
1704 first symbols:ldirectivetok
1705
1706 reachend
1707 */
1708
1709 static void AttributeNoReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1710
1711 /*
1712 NoReturn := ''
1713
1714 first symbols:ldirectivetok
1715
1716 cannot reachend
1717 */
1718
1719 static void NoReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1720
1721 /*
1722 AttributeUnused := [ Unused ]
1723
1724 first symbols:ldirectivetok
1725
1726 reachend
1727 */
1728
1729 static void AttributeUnused (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1730
1731 /*
1732 Unused := ''
1733
1734 first symbols:ldirectivetok
1735
1736 cannot reachend
1737 */
1738
1739 static void Unused (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1740
1741 /*
1742 MultiFPSection := ExtendedFP | FPSection [ ';'
1743 MultiFPSection ]
1744
1745 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
1746
1747 cannot reachend
1748 */
1749
1750 static void MultiFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1751
1752 /*
1753 FPSection := NonVarFPSection |
1754 VarFPSection
1755
1756 first symbols:vartok, identtok
1757
1758 cannot reachend
1759 */
1760
1761 static void FPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1762
1763 /*
1764 DefExtendedFP := DefOptArg | '...'
1765 % addParameter (curproc, makeVarargs ()) %
1766
1767
1768 first symbols:lsbratok, periodperiodperiodtok
1769
1770 cannot reachend
1771 */
1772
1773 static void DefExtendedFP (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1774
1775 /*
1776 ExtendedFP := OptArg | '...'
1777
1778 first symbols:lsbratok, periodperiodperiodtok
1779
1780 cannot reachend
1781 */
1782
1783 static void ExtendedFP (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1784
1785 /*
1786 VarFPSection := 'VAR' PushIdentList
1787 % VAR l, t: node ; %
1788 ':' FormalType
1789 % t := pop () %
1790
1791 % l := pop () %
1792
1793 % curisused := TRUE %
1794 [ AttributeUnused ]
1795 % addVarParameters (curproc, l, t, curisused) %
1796
1797
1798 first symbols:vartok
1799
1800 cannot reachend
1801 */
1802
1803 static void VarFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1804
1805 /*
1806 NonVarFPSection := PushIdentList
1807 % VAR l, t: node ; %
1808 ':' FormalType
1809 % t := pop () %
1810
1811 % l := pop () %
1812
1813 % curisused := TRUE %
1814 [ AttributeUnused ]
1815 % addNonVarParameters (curproc, l, t, curisused) %
1816
1817
1818 first symbols:identtok
1819
1820 cannot reachend
1821 */
1822
1823 static void NonVarFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1824
1825 /*
1826 OptArg :=
1827 % VAR p, init, type: node ; id: Name ; %
1828 '[' Ident
1829 % id := curident %
1830 ':' FormalType
1831 % type := pop () %
1832
1833 % init := NIL %
1834 [ '=' ConstExpression
1835 % init := pop () %
1836 ] ']'
1837 % p := addOptParameter (curproc, id, type, init) %
1838
1839
1840 first symbols:lsbratok
1841
1842 cannot reachend
1843 */
1844
1845 static void OptArg (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1846
1847 /*
1848 DefOptArg :=
1849 % VAR p, init, type: node ; id: Name ; %
1850 '[' Ident
1851 % id := curident %
1852 ':' FormalType
1853 % type := pop () %
1854 '=' ConstExpression
1855 % init := pop () %
1856 ']'
1857 % p := addOptParameter (curproc, id, type, init) %
1858
1859
1860 first symbols:lsbratok
1861
1862 cannot reachend
1863 */
1864
1865 static void DefOptArg (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1866
1867 /*
1868 FormalType :=
1869 % VAR c: CARDINAL ; %
1870
1871 % VAR n, a, s: node ; %
1872
1873 % c := 0 %
1874 { 'ARRAY' 'OF'
1875 % INC (c) %
1876 } PushQualident
1877 % pushNunbounded (c) %
1878
1879
1880 first symbols:identtok, arraytok
1881
1882 cannot reachend
1883 */
1884
1885 static void FormalType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1886
1887 /*
1888 ModuleDeclaration := 'MODULE' Ident [ Priority ]
1889 ';' { Import } [ Export ]
1890 Block Ident
1891
1892 first symbols:moduletok
1893
1894 cannot reachend
1895 */
1896
1897 static void ModuleDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1898
1899 /*
1900 Priority := '[' ConstExpressionNop ']'
1901
1902 first symbols:lsbratok
1903
1904 cannot reachend
1905 */
1906
1907 static void Priority (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1908
1909 /*
1910 Export := 'EXPORT' ( 'QUALIFIED' IdentList |
1911 'UNQUALIFIED' IdentList |
1912 IdentList ) ';'
1913
1914 first symbols:exporttok
1915
1916 cannot reachend
1917 */
1918
1919 static void Export (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1920
1921 /*
1922 FromIdentList := Ident
1923 % importInto (frommodule, curident, curmodule) %
1924 { ',' Ident
1925 % importInto (frommodule, curident, curmodule) %
1926 }
1927
1928 first symbols:identtok
1929
1930 cannot reachend
1931 */
1932
1933 static void FromIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1934
1935 /*
1936 FromImport := 'FROM' Ident
1937 % frommodule := lookupDef (curident) %
1938 'IMPORT' FromIdentList ';'
1939
1940 first symbols:fromtok
1941
1942 cannot reachend
1943 */
1944
1945 static void FromImport (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1946
1947 /*
1948 ImportModuleList := Ident { ',' Ident }
1949
1950 first symbols:identtok
1951
1952 cannot reachend
1953 */
1954
1955 static void ImportModuleList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1956
1957 /*
1958 WithoutFromImport := 'IMPORT' ImportModuleList ';'
1959
1960 first symbols:importtok
1961
1962 cannot reachend
1963 */
1964
1965 static void WithoutFromImport (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1966
1967 /*
1968 Import := FromImport | WithoutFromImport
1969
1970 first symbols:importtok, fromtok
1971
1972 cannot reachend
1973 */
1974
1975 static void Import (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
1976
1977 /*
1978 DefinitionModule := 'DEFINITION' 'MODULE' [ 'FOR'
1979 string ]
1980 Ident ';'
1981 % curmodule := lookupDef (curident) %
1982
1983 % enterScope (curmodule) %
1984
1985 % resetEnumPos (curmodule) %
1986 { Import } [ Export ] { Definition }
1987 'END' Ident '.'
1988 % checkEndName (curmodule, curident, 'definition module') %
1989
1990 % setConstExpComplete (curmodule) %
1991
1992 % leaveScope %
1993
1994
1995 first symbols:definitiontok
1996
1997 cannot reachend
1998 */
1999
2000 static void DefinitionModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2001
2002 /*
2003 PushQualident := Ident
2004 % typeExp := push (lookupSym (curident)) %
2005
2006 % IF typeExp = NIL
2007 THEN
2008 metaError1 ('the symbol {%1k} is not visible in this scope (or any other nested scope)', curident)
2009 END %
2010 [ '.'
2011 % IF NOT isDef (typeExp)
2012 THEN
2013 ErrorArray ('the first component of this qualident must be a definition module')
2014 END %
2015 Ident
2016 % typeExp := replace (lookupInScope (typeExp, curident)) ;
2017 IF typeExp=NIL
2018 THEN
2019 ErrorArray ('identifier not found in definition module')
2020 END %
2021 ]
2022
2023 first symbols:identtok
2024
2025 cannot reachend
2026 */
2027
2028 static void PushQualident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2029
2030 /*
2031 OptSubrange := [ SubrangeType
2032 % VAR q, s: node ; %
2033
2034 % s := pop () %
2035
2036 % q := pop () %
2037
2038 % putSubrangeType (s, q) %
2039
2040 % typeExp := push (s) %
2041 ]
2042
2043 first symbols:lsbratok
2044
2045 reachend
2046 */
2047
2048 static void OptSubrange (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2049
2050 /*
2051 TypeEquiv := PushQualident OptSubrange
2052
2053 first symbols:identtok
2054
2055 cannot reachend
2056 */
2057
2058 static void TypeEquiv (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2059
2060 /*
2061 EnumIdentList :=
2062 % VAR f: node ; %
2063
2064 % typeExp := push (makeEnum ()) %
2065 Ident
2066 % f := makeEnumField (typeExp, curident) %
2067 { ',' Ident
2068 % f := makeEnumField (typeExp, curident) %
2069 }
2070
2071 first symbols:identtok
2072
2073 cannot reachend
2074 */
2075
2076 static void EnumIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2077
2078 /*
2079 Enumeration := '(' EnumIdentList ')'
2080
2081 first symbols:lparatok
2082
2083 cannot reachend
2084 */
2085
2086 static void Enumeration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2087
2088 /*
2089 SimpleType :=
2090 % VAR d: CARDINAL ; %
2091
2092 % d := depth () %
2093 ( TypeEquiv | Enumeration |
2094 SubrangeType )
2095 % assert (d = depth () - 1) %
2096
2097
2098 first symbols:lsbratok, lparatok, identtok
2099
2100 cannot reachend
2101 */
2102
2103 static void SimpleType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2104
2105 /*
2106 Type := SimpleType | ArrayType | RecordType |
2107 SetType | PointerType | ProcedureType
2108
2109 first symbols:proceduretok, pointertok, settok, packedsettok, oftok, recordtok, arraytok, identtok, lparatok, lsbratok
2110
2111 cannot reachend
2112 */
2113
2114 static void Type (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2115
2116 /*
2117 TypeDeclaration := { Ident
2118 % typeDes := lookupSym (curident) %
2119 ( ';' | '=' Type
2120 % putType (typeDes, pop ()) %
2121 Alignment ';' ) }
2122
2123 first symbols:identtok
2124
2125 reachend
2126 */
2127
2128 static void TypeDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2129
2130 /*
2131 Definition := 'CONST' { ConstantDeclaration ';' } |
2132 'TYPE' { TypeDeclaration } |
2133 'VAR' { VariableDeclaration ';' } |
2134 DefProcedureHeading ';'
2135
2136 first symbols:proceduretok, vartok, typetok, consttok
2137
2138 cannot reachend
2139 */
2140
2141 static void Definition (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2142
2143 /*
2144 AsmStatement := 'ASM' [ 'VOLATILE' ] '(' AsmOperands
2145 ')'
2146
2147 first symbols:asmtok
2148
2149 cannot reachend
2150 */
2151
2152 static void AsmStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2153
2154 /*
2155 AsmOperands := string [ AsmOperandSpec ]
2156
2157 first symbols:stringtok
2158
2159 cannot reachend
2160 */
2161
2162 static void AsmOperands (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2163
2164 /*
2165 AsmOperandSpec := [ ':' AsmList [ ':' AsmList [
2166 ':' TrashList ] ] ]
2167
2168 first symbols:colontok
2169
2170 reachend
2171 */
2172
2173 static void AsmOperandSpec (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2174
2175 /*
2176 AsmList := [ AsmElement ] { ',' AsmElement }
2177
2178 first symbols:lsbratok, stringtok, commatok
2179
2180 reachend
2181 */
2182
2183 static void AsmList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2184
2185 /*
2186 NamedOperand := '[' Ident ']'
2187
2188 first symbols:lsbratok
2189
2190 cannot reachend
2191 */
2192
2193 static void NamedOperand (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2194
2195 /*
2196 AsmOperandName := [ NamedOperand ]
2197
2198 first symbols:lsbratok
2199
2200 reachend
2201 */
2202
2203 static void AsmOperandName (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2204
2205 /*
2206 AsmElement := AsmOperandName string '(' Expression
2207 ')'
2208
2209 first symbols:stringtok, lsbratok
2210
2211 cannot reachend
2212 */
2213
2214 static void AsmElement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2215
2216 /*
2217 TrashList := [ string ] { ',' string }
2218
2219 first symbols:commatok, stringtok
2220
2221 reachend
2222 */
2223
2224 static void TrashList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
2225
2226
2227 /*
2228 push -
2229 */
2230
2231 static decl_node push (decl_node n)
2232 {
2233 return static_cast<decl_node> (mcStack_push (stk, reinterpret_cast<void *> (n)));
2234 /* static analysis guarentees a RETURN statement will be used before here. */
2235 __builtin_unreachable ();
2236 }
2237
2238
2239 /*
2240 pop -
2241 */
2242
2243 static decl_node pop (void)
2244 {
2245 return static_cast<decl_node> (mcStack_pop (stk));
2246 /* static analysis guarentees a RETURN statement will be used before here. */
2247 __builtin_unreachable ();
2248 }
2249
2250
2251 /*
2252 replace -
2253 */
2254
2255 static decl_node replace (decl_node n)
2256 {
2257 return static_cast<decl_node> (mcStack_replace (stk, reinterpret_cast<void *> (n)));
2258 /* static analysis guarentees a RETURN statement will be used before here. */
2259 __builtin_unreachable ();
2260 }
2261
2262
2263 /*
2264 peep - returns the top node on the stack without removing it.
2265 */
2266
2267 static decl_node peep (void)
2268 {
2269 return push (pop ());
2270 /* static analysis guarentees a RETURN statement will be used before here. */
2271 __builtin_unreachable ();
2272 }
2273
2274
2275 /*
2276 depth - returns the depth of the stack.
2277 */
2278
2279 static unsigned int depth (void)
2280 {
2281 return mcStack_depth (stk);
2282 /* static analysis guarentees a RETURN statement will be used before here. */
2283 __builtin_unreachable ();
2284 }
2285
2286
2287 /*
2288 checkDuplicate -
2289 */
2290
2291 static void checkDuplicate (unsigned int b)
2292 {
2293 }
2294
2295
2296 /*
2297 checkDuplicate -
2298 */
2299
2300 static void ErrorString (DynamicStrings_String s)
2301 {
2302 mcError_errorStringAt (s, mcLexBuf_getTokenNo ());
2303 WasNoError = FALSE;
2304 }
2305
2306
2307 /*
2308 checkDuplicate -
2309 */
2310
2311 static void ErrorArray (const char *a_, unsigned int _a_high)
2312 {
2313 char a[_a_high+1];
2314
2315 /* make a local copy of each unbounded array. */
2316 memcpy (a, a_, _a_high+1);
2317
2318 ErrorString (DynamicStrings_InitString ((const char *) a, _a_high));
2319 }
2320
2321
2322 /*
2323 checkParameterAttribute -
2324 */
2325
2326 static void checkParameterAttribute (void)
2327 {
2328 if ((nameKey_makeKey ((const char *) "unused", 6)) != curident)
2329 {
2330 mcMetaError_metaError1 ((const char *) "attribute {%1k} is not allowed in the formal parameter section, currently only unused is allowed", 96, (const unsigned char *) &curident, (sizeof (curident)-1));
2331 }
2332 }
2333
2334
2335 /*
2336 checkReturnAttribute -
2337 */
2338
2339 static void checkReturnAttribute (void)
2340 {
2341 if ((nameKey_makeKey ((const char *) "noreturn", 8)) != curident)
2342 {
2343 mcMetaError_metaError1 ((const char *) "attribute {%1k} is not allowed in the procedure return type, only noreturn is allowed", 85, (const unsigned char *) &curident, (sizeof (curident)-1));
2344 }
2345 }
2346
2347
2348 /*
2349 pushNunbounded -
2350 */
2351
2352 static void pushNunbounded (unsigned int c)
2353 {
2354 decl_node type;
2355 decl_node array;
2356 decl_node subrange;
2357
2358 while (c != 0)
2359 {
2360 type = pop ();
2361 subrange = decl_makeSubrange (static_cast<decl_node> (NULL), static_cast<decl_node> (NULL));
2362 decl_putSubrangeType (subrange, decl_getCardinal ());
2363 array = decl_makeArray (subrange, type);
2364 decl_putUnbounded (array);
2365 type = push (array);
2366 c -= 1;
2367 }
2368 }
2369
2370
2371 /*
2372 makeIndexedArray - builds and returns an array of type, t, with, c, indices.
2373 */
2374
2375 static decl_node makeIndexedArray (unsigned int c, decl_node t)
2376 {
2377 decl_node i;
2378
2379 while (c > 0)
2380 {
2381 t = decl_makeArray (pop (), t);
2382 c -= 1;
2383 }
2384 return t;
2385 /* static analysis guarentees a RETURN statement will be used before here. */
2386 __builtin_unreachable ();
2387 }
2388
2389
2390 /*
2391 importInto - from, m, import, name, into module, current.
2392 It checks to see if curident is an enumeration type
2393 and if so automatically includes all enumeration fields
2394 as well.
2395 */
2396
2397 static void importInto (decl_node m, nameKey_Name name, decl_node current)
2398 {
2399 decl_node s;
2400 decl_node o;
2401
2402 mcDebug_assert (decl_isDef (m));
2403 mcDebug_assert (((decl_isDef (current)) || (decl_isModule (current))) || (decl_isImp (current)));
2404 s = decl_lookupExported (m, name);
2405 if (s == NULL)
2406 {
2407 mcMetaError_metaError2 ((const char *) "{%1k} was not exported from definition module {%2a}", 51, (const unsigned char *) &name, (sizeof (name)-1), (const unsigned char *) &m, (sizeof (m)-1));
2408 }
2409 else
2410 {
2411 o = decl_import (current, s);
2412 if (s != o)
2413 {
2414 mcMetaError_metaError2 ((const char *) "{%1ad} cannot be imported into the current module as it causes a name clash with {%2ad}", 87, (const unsigned char *) &s, (sizeof (s)-1), (const unsigned char *) &o, (sizeof (o)-1));
2415 }
2416 }
2417 }
2418
2419
2420 /*
2421 checkEndName - if module does not have, name, then issue an error containing, desc.
2422 */
2423
2424 static void checkEndName (decl_node module, nameKey_Name name, const char *desc_, unsigned int _desc_high)
2425 {
2426 DynamicStrings_String s;
2427 char desc[_desc_high+1];
2428
2429 /* make a local copy of each unbounded array. */
2430 memcpy (desc, desc_, _desc_high+1);
2431
2432 if ((decl_getSymName (module)) != name)
2433 {
2434 s = DynamicStrings_InitString ((const char *) "inconsistent module name found with this ", 41);
2435 s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) desc, _desc_high)));
2436 ErrorString (s);
2437 }
2438 }
2439
2440
2441 /*
2442 DescribeStop - issues a message explaining what tokens were expected
2443 */
2444
2445 static DynamicStrings_String DescribeStop (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
2446 {
2447 unsigned int n;
2448 DynamicStrings_String str;
2449 DynamicStrings_String message;
2450
2451 n = 0;
2452 message = DynamicStrings_InitString ((const char *) "", 0);
2453 if ((((1 << (mcReserved_stringtok-mcReserved_recordtok)) & (stopset2)) != 0))
2454 {
2455 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "string", 6)));
2456 n += 1;
2457 }
2458 if ((((1 << (mcReserved_realtok-mcReserved_recordtok)) & (stopset2)) != 0))
2459 {
2460 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "real number", 11)));
2461 n += 1;
2462 }
2463 if ((((1 << (mcReserved_identtok-mcReserved_recordtok)) & (stopset2)) != 0))
2464 {
2465 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "identifier", 10)));
2466 n += 1;
2467 }
2468 if ((((1 << (mcReserved_integertok-mcReserved_recordtok)) & (stopset2)) != 0))
2469 {
2470 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "integer number", 14)));
2471 n += 1;
2472 }
2473 if ((((1 << (mcReserved_inlinetok-mcReserved_recordtok)) & (stopset2)) != 0))
2474 {
2475 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__INLINE__", 10)));
2476 n += 1;
2477 }
2478 if ((((1 << (mcReserved_builtintok-mcReserved_recordtok)) & (stopset2)) != 0))
2479 {
2480 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__BUILTIN__", 11)));
2481 n += 1;
2482 }
2483 if ((((1 << (mcReserved_attributetok-mcReserved_recordtok)) & (stopset2)) != 0))
2484 {
2485 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__ATTRIBUTE__", 13)));
2486 n += 1;
2487 }
2488 if ((((1 << (mcReserved_filetok-mcReserved_recordtok)) & (stopset2)) != 0))
2489 {
2490 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__FILE__", 8)));
2491 n += 1;
2492 }
2493 if ((((1 << (mcReserved_linetok-mcReserved_recordtok)) & (stopset2)) != 0))
2494 {
2495 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__LINE__", 8)));
2496 n += 1;
2497 }
2498 if ((((1 << (mcReserved_datetok-mcReserved_recordtok)) & (stopset2)) != 0))
2499 {
2500 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__DATE__", 8)));
2501 n += 1;
2502 }
2503 if ((((1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) & (stopset2)) != 0))
2504 {
2505 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "...", 3)));
2506 n += 1;
2507 }
2508 if ((((1 << (mcReserved_volatiletok-mcReserved_recordtok)) & (stopset2)) != 0))
2509 {
2510 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "VOLATILE", 8)));
2511 n += 1;
2512 }
2513 if ((((1 << (mcReserved_asmtok-mcReserved_recordtok)) & (stopset2)) != 0))
2514 {
2515 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ASM", 3)));
2516 n += 1;
2517 }
2518 if ((((1 << (mcReserved_withtok-mcReserved_recordtok)) & (stopset2)) != 0))
2519 {
2520 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "WITH", 4)));
2521 n += 1;
2522 }
2523 if ((((1 << (mcReserved_whiletok-mcReserved_recordtok)) & (stopset2)) != 0))
2524 {
2525 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "WHILE", 5)));
2526 n += 1;
2527 }
2528 if ((((1 << (mcReserved_vartok-mcReserved_recordtok)) & (stopset2)) != 0))
2529 {
2530 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "VAR", 3)));
2531 n += 1;
2532 }
2533 if ((((1 << (mcReserved_untiltok-mcReserved_recordtok)) & (stopset2)) != 0))
2534 {
2535 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "UNTIL", 5)));
2536 n += 1;
2537 }
2538 if ((((1 << (mcReserved_typetok-mcReserved_recordtok)) & (stopset2)) != 0))
2539 {
2540 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "TYPE", 4)));
2541 n += 1;
2542 }
2543 if ((((1 << (mcReserved_totok-mcReserved_recordtok)) & (stopset2)) != 0))
2544 {
2545 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "TO", 2)));
2546 n += 1;
2547 }
2548 if ((((1 << (mcReserved_thentok-mcReserved_recordtok)) & (stopset2)) != 0))
2549 {
2550 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "THEN", 4)));
2551 n += 1;
2552 }
2553 if ((((1 << (mcReserved_settok-mcReserved_recordtok)) & (stopset2)) != 0))
2554 {
2555 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "SET", 3)));
2556 n += 1;
2557 }
2558 if ((((1 << (mcReserved_returntok-mcReserved_recordtok)) & (stopset2)) != 0))
2559 {
2560 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RETURN", 6)));
2561 n += 1;
2562 }
2563 if ((((1 << (mcReserved_retrytok-mcReserved_recordtok)) & (stopset2)) != 0))
2564 {
2565 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RETRY", 5)));
2566 n += 1;
2567 }
2568 if ((((1 << (mcReserved_repeattok-mcReserved_recordtok)) & (stopset2)) != 0))
2569 {
2570 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "REPEAT", 6)));
2571 n += 1;
2572 }
2573 if ((((1 << (mcReserved_remtok-mcReserved_recordtok)) & (stopset2)) != 0))
2574 {
2575 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "REM", 3)));
2576 n += 1;
2577 }
2578 if ((((1 << (mcReserved_recordtok-mcReserved_recordtok)) & (stopset2)) != 0))
2579 {
2580 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RECORD", 6)));
2581 n += 1;
2582 }
2583 if ((((1 << (mcReserved_unqualifiedtok-mcReserved_arraytok)) & (stopset1)) != 0))
2584 {
2585 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "UNQUALIFIED", 11)));
2586 n += 1;
2587 }
2588 if ((((1 << (mcReserved_qualifiedtok-mcReserved_arraytok)) & (stopset1)) != 0))
2589 {
2590 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "QUALIFIED", 9)));
2591 n += 1;
2592 }
2593 if ((((1 << (mcReserved_proceduretok-mcReserved_arraytok)) & (stopset1)) != 0))
2594 {
2595 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "PROCEDURE", 9)));
2596 n += 1;
2597 }
2598 if ((((1 << (mcReserved_pointertok-mcReserved_arraytok)) & (stopset1)) != 0))
2599 {
2600 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "POINTER", 7)));
2601 n += 1;
2602 }
2603 if ((((1 << (mcReserved_packedsettok-mcReserved_arraytok)) & (stopset1)) != 0))
2604 {
2605 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "PACKEDSET", 9)));
2606 n += 1;
2607 }
2608 if ((((1 << (mcReserved_ortok-mcReserved_arraytok)) & (stopset1)) != 0))
2609 {
2610 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "OR", 2)));
2611 n += 1;
2612 }
2613 if ((((1 << (mcReserved_oftok-mcReserved_arraytok)) & (stopset1)) != 0))
2614 {
2615 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "OF", 2)));
2616 n += 1;
2617 }
2618 if ((((1 << (mcReserved_nottok-mcReserved_arraytok)) & (stopset1)) != 0))
2619 {
2620 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "NOT", 3)));
2621 n += 1;
2622 }
2623 if ((((1 << (mcReserved_moduletok-mcReserved_arraytok)) & (stopset1)) != 0))
2624 {
2625 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MODULE", 6)));
2626 n += 1;
2627 }
2628 if ((((1 << (mcReserved_modtok-mcReserved_arraytok)) & (stopset1)) != 0))
2629 {
2630 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MOD", 3)));
2631 n += 1;
2632 }
2633 if ((((1 << (mcReserved_looptok-mcReserved_arraytok)) & (stopset1)) != 0))
2634 {
2635 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "LOOP", 4)));
2636 n += 1;
2637 }
2638 if ((((1 << (mcReserved_intok-mcReserved_arraytok)) & (stopset1)) != 0))
2639 {
2640 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IN", 2)));
2641 n += 1;
2642 }
2643 if ((((1 << (mcReserved_importtok-mcReserved_arraytok)) & (stopset1)) != 0))
2644 {
2645 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IMPORT", 6)));
2646 n += 1;
2647 }
2648 if ((((1 << (mcReserved_implementationtok-mcReserved_arraytok)) & (stopset1)) != 0))
2649 {
2650 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IMPLEMENTATION", 14)));
2651 n += 1;
2652 }
2653 if ((((1 << (mcReserved_iftok-mcReserved_arraytok)) & (stopset1)) != 0))
2654 {
2655 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IF", 2)));
2656 n += 1;
2657 }
2658 if ((((1 << (mcReserved_fromtok-mcReserved_arraytok)) & (stopset1)) != 0))
2659 {
2660 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FROM", 4)));
2661 n += 1;
2662 }
2663 if ((((1 << (mcReserved_fortok-mcReserved_arraytok)) & (stopset1)) != 0))
2664 {
2665 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FOR", 3)));
2666 n += 1;
2667 }
2668 if ((((1 << (mcReserved_finallytok-mcReserved_arraytok)) & (stopset1)) != 0))
2669 {
2670 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FINALLY", 7)));
2671 n += 1;
2672 }
2673 if ((((1 << (mcReserved_exporttok-mcReserved_arraytok)) & (stopset1)) != 0))
2674 {
2675 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXPORT", 6)));
2676 n += 1;
2677 }
2678 if ((((1 << (mcReserved_exittok-mcReserved_arraytok)) & (stopset1)) != 0))
2679 {
2680 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXIT", 4)));
2681 n += 1;
2682 }
2683 if ((((1 << (mcReserved_excepttok-mcReserved_arraytok)) & (stopset1)) != 0))
2684 {
2685 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXCEPT", 6)));
2686 n += 1;
2687 }
2688 if ((((1 << (mcReserved_endtok-mcReserved_arraytok)) & (stopset1)) != 0))
2689 {
2690 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "END", 3)));
2691 n += 1;
2692 }
2693 if ((((1 << (mcReserved_elsiftok-mcReserved_arraytok)) & (stopset1)) != 0))
2694 {
2695 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ELSIF", 5)));
2696 n += 1;
2697 }
2698 if ((((1 << (mcReserved_elsetok-mcReserved_arraytok)) & (stopset1)) != 0))
2699 {
2700 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ELSE", 4)));
2701 n += 1;
2702 }
2703 if ((((1 << (mcReserved_dotok-mcReserved_arraytok)) & (stopset1)) != 0))
2704 {
2705 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DO", 2)));
2706 n += 1;
2707 }
2708 if ((((1 << (mcReserved_divtok-mcReserved_arraytok)) & (stopset1)) != 0))
2709 {
2710 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DIV", 3)));
2711 n += 1;
2712 }
2713 if ((((1 << (mcReserved_definitiontok-mcReserved_arraytok)) & (stopset1)) != 0))
2714 {
2715 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DEFINITION", 10)));
2716 n += 1;
2717 }
2718 if ((((1 << (mcReserved_consttok-mcReserved_arraytok)) & (stopset1)) != 0))
2719 {
2720 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "CONST", 5)));
2721 n += 1;
2722 }
2723 if ((((1 << (mcReserved_casetok-mcReserved_arraytok)) & (stopset1)) != 0))
2724 {
2725 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "CASE", 4)));
2726 n += 1;
2727 }
2728 if ((((1 << (mcReserved_bytok-mcReserved_arraytok)) & (stopset1)) != 0))
2729 {
2730 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "BY", 2)));
2731 n += 1;
2732 }
2733 if ((((1 << (mcReserved_begintok-mcReserved_arraytok)) & (stopset1)) != 0))
2734 {
2735 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "BEGIN", 5)));
2736 n += 1;
2737 }
2738 if ((((1 << (mcReserved_arraytok-mcReserved_arraytok)) & (stopset1)) != 0))
2739 {
2740 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ARRAY", 5)));
2741 n += 1;
2742 }
2743 if ((((1 << (mcReserved_andtok-mcReserved_eoftok)) & (stopset0)) != 0))
2744 {
2745 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "AND", 3)));
2746 n += 1;
2747 }
2748 if ((((1 << (mcReserved_colontok-mcReserved_eoftok)) & (stopset0)) != 0))
2749 {
2750 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ":", 1)));
2751 n += 1;
2752 }
2753 if ((((1 << (mcReserved_periodperiodtok-mcReserved_eoftok)) & (stopset0)) != 0))
2754 {
2755 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "..", 2)));
2756 n += 1;
2757 }
2758 if ((((1 << (mcReserved_rdirectivetok-mcReserved_eoftok)) & (stopset0)) != 0))
2759 {
2760 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "*>", 2)));
2761 n += 1;
2762 }
2763 if ((((1 << (mcReserved_ldirectivetok-mcReserved_eoftok)) & (stopset0)) != 0))
2764 {
2765 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<*", 2)));
2766 n += 1;
2767 }
2768 if ((((1 << (mcReserved_greaterequaltok-mcReserved_eoftok)) & (stopset0)) != 0))
2769 {
2770 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ">=", 2)));
2771 n += 1;
2772 }
2773 if ((((1 << (mcReserved_lessequaltok-mcReserved_eoftok)) & (stopset0)) != 0))
2774 {
2775 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<=", 2)));
2776 n += 1;
2777 }
2778 if ((((1 << (mcReserved_lessgreatertok-mcReserved_eoftok)) & (stopset0)) != 0))
2779 {
2780 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<>", 2)));
2781 n += 1;
2782 }
2783 if ((((1 << (mcReserved_hashtok-mcReserved_eoftok)) & (stopset0)) != 0))
2784 {
2785 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "#", 1)));
2786 n += 1;
2787 }
2788 if ((((1 << (mcReserved_equaltok-mcReserved_eoftok)) & (stopset0)) != 0))
2789 {
2790 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "=", 1)));
2791 n += 1;
2792 }
2793 if ((((1 << (mcReserved_uparrowtok-mcReserved_eoftok)) & (stopset0)) != 0))
2794 {
2795 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "^", 1)));
2796 n += 1;
2797 }
2798 if ((((1 << (mcReserved_semicolontok-mcReserved_eoftok)) & (stopset0)) != 0))
2799 {
2800 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ";", 1)));
2801 n += 1;
2802 }
2803 if ((((1 << (mcReserved_commatok-mcReserved_eoftok)) & (stopset0)) != 0))
2804 {
2805 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ",", 1)));
2806 n += 1;
2807 }
2808 if ((((1 << (mcReserved_periodtok-mcReserved_eoftok)) & (stopset0)) != 0))
2809 {
2810 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1)));
2811 n += 1;
2812 }
2813 if ((((1 << (mcReserved_ambersandtok-mcReserved_eoftok)) & (stopset0)) != 0))
2814 {
2815 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "&", 1)));
2816 n += 1;
2817 }
2818 if ((((1 << (mcReserved_dividetok-mcReserved_eoftok)) & (stopset0)) != 0))
2819 {
2820 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "/", 1)));
2821 n += 1;
2822 }
2823 if ((((1 << (mcReserved_timestok-mcReserved_eoftok)) & (stopset0)) != 0))
2824 {
2825 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "*", 1)));
2826 n += 1;
2827 }
2828 if ((((1 << (mcReserved_minustok-mcReserved_eoftok)) & (stopset0)) != 0))
2829 {
2830 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "-", 1)));
2831 n += 1;
2832 }
2833 if ((((1 << (mcReserved_plustok-mcReserved_eoftok)) & (stopset0)) != 0))
2834 {
2835 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "+", 1)));
2836 n += 1;
2837 }
2838 if ((((1 << (mcReserved_doublequotestok-mcReserved_eoftok)) & (stopset0)) != 0))
2839 {
2840 message = DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (message, ' '), '`'), '"'), '\''), ',');
2841 n += 1;
2842 }
2843 if ((((1 << (mcReserved_singlequotetok-mcReserved_eoftok)) & (stopset0)) != 0))
2844 {
2845 message = DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (message, ' '), '"'), '\''), '"'), ',');
2846 n += 1;
2847 }
2848 if ((((1 << (mcReserved_greatertok-mcReserved_eoftok)) & (stopset0)) != 0))
2849 {
2850 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ">", 1)));
2851 n += 1;
2852 }
2853 if ((((1 << (mcReserved_lesstok-mcReserved_eoftok)) & (stopset0)) != 0))
2854 {
2855 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<", 1)));
2856 n += 1;
2857 }
2858 if ((((1 << (mcReserved_rparatok-mcReserved_eoftok)) & (stopset0)) != 0))
2859 {
2860 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ")", 1)));
2861 n += 1;
2862 }
2863 if ((((1 << (mcReserved_lparatok-mcReserved_eoftok)) & (stopset0)) != 0))
2864 {
2865 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "(", 1)));
2866 n += 1;
2867 }
2868 if ((((1 << (mcReserved_rcbratok-mcReserved_eoftok)) & (stopset0)) != 0))
2869 {
2870 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "}", 1)));
2871 n += 1;
2872 }
2873 if ((((1 << (mcReserved_lcbratok-mcReserved_eoftok)) & (stopset0)) != 0))
2874 {
2875 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "{", 1)));
2876 n += 1;
2877 }
2878 if ((((1 << (mcReserved_rsbratok-mcReserved_eoftok)) & (stopset0)) != 0))
2879 {
2880 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "]", 1)));
2881 n += 1;
2882 }
2883 if ((((1 << (mcReserved_lsbratok-mcReserved_eoftok)) & (stopset0)) != 0))
2884 {
2885 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "[", 1)));
2886 n += 1;
2887 }
2888 if ((((1 << (mcReserved_bartok-mcReserved_eoftok)) & (stopset0)) != 0))
2889 {
2890 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "|", 1)));
2891 n += 1;
2892 }
2893 if ((((1 << (mcReserved_becomestok-mcReserved_eoftok)) & (stopset0)) != 0))
2894 {
2895 message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ":=", 2)));
2896 n += 1;
2897 }
2898 if ((((1 << (mcReserved_eoftok-mcReserved_eoftok)) & (stopset0)) != 0))
2899 {} /* empty. */
2900 /* eoftok has no token name (needed to generate error messages) */
2901 if (n == 0)
2902 {
2903 str = DynamicStrings_InitString ((const char *) " syntax error", 13);
2904 message = DynamicStrings_KillString (message);
2905 }
2906 else if (n == 1)
2907 {
2908 /* avoid dangling else. */
2909 str = DynamicStrings_ConCat (message, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " missing ", 9)));
2910 }
2911 else
2912 {
2913 /* avoid dangling else. */
2914 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) " expecting one of", 17), message);
2915 message = DynamicStrings_KillString (message);
2916 }
2917 return str;
2918 /* static analysis guarentees a RETURN statement will be used before here. */
2919 __builtin_unreachable ();
2920 }
2921
2922
2923 /*
2924 DescribeError - issues a message explaining what tokens were expected
2925 */
2926
2927 static void DescribeError (void)
2928 {
2929 DynamicStrings_String str;
2930
2931 str = DynamicStrings_InitString ((const char *) "", 0);
2932 switch (mcLexBuf_currenttoken)
2933 {
2934 case mcReserved_stringtok:
2935 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found string", 26), DynamicStrings_Mark (str));
2936 break;
2937
2938 case mcReserved_realtok:
2939 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found real number", 31), DynamicStrings_Mark (str));
2940 break;
2941
2942 case mcReserved_identtok:
2943 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found identifier", 30), DynamicStrings_Mark (str));
2944 break;
2945
2946 case mcReserved_integertok:
2947 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found integer number", 34), DynamicStrings_Mark (str));
2948 break;
2949
2950 case mcReserved_inlinetok:
2951 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __INLINE__", 30), DynamicStrings_Mark (str));
2952 break;
2953
2954 case mcReserved_builtintok:
2955 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __BUILTIN__", 31), DynamicStrings_Mark (str));
2956 break;
2957
2958 case mcReserved_attributetok:
2959 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __ATTRIBUTE__", 33), DynamicStrings_Mark (str));
2960 break;
2961
2962 case mcReserved_filetok:
2963 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __FILE__", 28), DynamicStrings_Mark (str));
2964 break;
2965
2966 case mcReserved_linetok:
2967 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __LINE__", 28), DynamicStrings_Mark (str));
2968 break;
2969
2970 case mcReserved_datetok:
2971 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __DATE__", 28), DynamicStrings_Mark (str));
2972 break;
2973
2974 case mcReserved_periodperiodperiodtok:
2975 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ...", 23), DynamicStrings_Mark (str));
2976 break;
2977
2978 case mcReserved_volatiletok:
2979 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found VOLATILE", 28), DynamicStrings_Mark (str));
2980 break;
2981
2982 case mcReserved_asmtok:
2983 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ASM", 23), DynamicStrings_Mark (str));
2984 break;
2985
2986 case mcReserved_withtok:
2987 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found WITH", 24), DynamicStrings_Mark (str));
2988 break;
2989
2990 case mcReserved_whiletok:
2991 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found WHILE", 25), DynamicStrings_Mark (str));
2992 break;
2993
2994 case mcReserved_vartok:
2995 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found VAR", 23), DynamicStrings_Mark (str));
2996 break;
2997
2998 case mcReserved_untiltok:
2999 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found UNTIL", 25), DynamicStrings_Mark (str));
3000 break;
3001
3002 case mcReserved_typetok:
3003 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found TYPE", 24), DynamicStrings_Mark (str));
3004 break;
3005
3006 case mcReserved_totok:
3007 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found TO", 22), DynamicStrings_Mark (str));
3008 break;
3009
3010 case mcReserved_thentok:
3011 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found THEN", 24), DynamicStrings_Mark (str));
3012 break;
3013
3014 case mcReserved_settok:
3015 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found SET", 23), DynamicStrings_Mark (str));
3016 break;
3017
3018 case mcReserved_returntok:
3019 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RETURN", 26), DynamicStrings_Mark (str));
3020 break;
3021
3022 case mcReserved_retrytok:
3023 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RETRY", 25), DynamicStrings_Mark (str));
3024 break;
3025
3026 case mcReserved_repeattok:
3027 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found REPEAT", 26), DynamicStrings_Mark (str));
3028 break;
3029
3030 case mcReserved_remtok:
3031 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found REM", 23), DynamicStrings_Mark (str));
3032 break;
3033
3034 case mcReserved_recordtok:
3035 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RECORD", 26), DynamicStrings_Mark (str));
3036 break;
3037
3038 case mcReserved_unqualifiedtok:
3039 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found UNQUALIFIED", 31), DynamicStrings_Mark (str));
3040 break;
3041
3042 case mcReserved_qualifiedtok:
3043 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found QUALIFIED", 29), DynamicStrings_Mark (str));
3044 break;
3045
3046 case mcReserved_proceduretok:
3047 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found PROCEDURE", 29), DynamicStrings_Mark (str));
3048 break;
3049
3050 case mcReserved_pointertok:
3051 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found POINTER", 27), DynamicStrings_Mark (str));
3052 break;
3053
3054 case mcReserved_packedsettok:
3055 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found PACKEDSET", 29), DynamicStrings_Mark (str));
3056 break;
3057
3058 case mcReserved_ortok:
3059 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found OR", 22), DynamicStrings_Mark (str));
3060 break;
3061
3062 case mcReserved_oftok:
3063 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found OF", 22), DynamicStrings_Mark (str));
3064 break;
3065
3066 case mcReserved_nottok:
3067 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found NOT", 23), DynamicStrings_Mark (str));
3068 break;
3069
3070 case mcReserved_moduletok:
3071 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found MODULE", 26), DynamicStrings_Mark (str));
3072 break;
3073
3074 case mcReserved_modtok:
3075 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found MOD", 23), DynamicStrings_Mark (str));
3076 break;
3077
3078 case mcReserved_looptok:
3079 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found LOOP", 24), DynamicStrings_Mark (str));
3080 break;
3081
3082 case mcReserved_intok:
3083 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IN", 22), DynamicStrings_Mark (str));
3084 break;
3085
3086 case mcReserved_importtok:
3087 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IMPORT", 26), DynamicStrings_Mark (str));
3088 break;
3089
3090 case mcReserved_implementationtok:
3091 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IMPLEMENTATION", 34), DynamicStrings_Mark (str));
3092 break;
3093
3094 case mcReserved_iftok:
3095 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IF", 22), DynamicStrings_Mark (str));
3096 break;
3097
3098 case mcReserved_fromtok:
3099 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FROM", 24), DynamicStrings_Mark (str));
3100 break;
3101
3102 case mcReserved_fortok:
3103 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FOR", 23), DynamicStrings_Mark (str));
3104 break;
3105
3106 case mcReserved_finallytok:
3107 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FINALLY", 27), DynamicStrings_Mark (str));
3108 break;
3109
3110 case mcReserved_exporttok:
3111 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXPORT", 26), DynamicStrings_Mark (str));
3112 break;
3113
3114 case mcReserved_exittok:
3115 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXIT", 24), DynamicStrings_Mark (str));
3116 break;
3117
3118 case mcReserved_excepttok:
3119 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXCEPT", 26), DynamicStrings_Mark (str));
3120 break;
3121
3122 case mcReserved_endtok:
3123 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found END", 23), DynamicStrings_Mark (str));
3124 break;
3125
3126 case mcReserved_elsiftok:
3127 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ELSIF", 25), DynamicStrings_Mark (str));
3128 break;
3129
3130 case mcReserved_elsetok:
3131 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ELSE", 24), DynamicStrings_Mark (str));
3132 break;
3133
3134 case mcReserved_dotok:
3135 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DO", 22), DynamicStrings_Mark (str));
3136 break;
3137
3138 case mcReserved_divtok:
3139 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DIV", 23), DynamicStrings_Mark (str));
3140 break;
3141
3142 case mcReserved_definitiontok:
3143 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DEFINITION", 30), DynamicStrings_Mark (str));
3144 break;
3145
3146 case mcReserved_consttok:
3147 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found CONST", 25), DynamicStrings_Mark (str));
3148 break;
3149
3150 case mcReserved_casetok:
3151 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found CASE", 24), DynamicStrings_Mark (str));
3152 break;
3153
3154 case mcReserved_bytok:
3155 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found BY", 22), DynamicStrings_Mark (str));
3156 break;
3157
3158 case mcReserved_begintok:
3159 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found BEGIN", 25), DynamicStrings_Mark (str));
3160 break;
3161
3162 case mcReserved_arraytok:
3163 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ARRAY", 25), DynamicStrings_Mark (str));
3164 break;
3165
3166 case mcReserved_andtok:
3167 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found AND", 23), DynamicStrings_Mark (str));
3168 break;
3169
3170 case mcReserved_colontok:
3171 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found :", 21), DynamicStrings_Mark (str));
3172 break;
3173
3174 case mcReserved_periodperiodtok:
3175 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ..", 22), DynamicStrings_Mark (str));
3176 break;
3177
3178 case mcReserved_rdirectivetok:
3179 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found *>", 22), DynamicStrings_Mark (str));
3180 break;
3181
3182 case mcReserved_ldirectivetok:
3183 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <*", 22), DynamicStrings_Mark (str));
3184 break;
3185
3186 case mcReserved_greaterequaltok:
3187 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found >=", 22), DynamicStrings_Mark (str));
3188 break;
3189
3190 case mcReserved_lessequaltok:
3191 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <=", 22), DynamicStrings_Mark (str));
3192 break;
3193
3194 case mcReserved_lessgreatertok:
3195 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <>", 22), DynamicStrings_Mark (str));
3196 break;
3197
3198 case mcReserved_hashtok:
3199 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found #", 21), DynamicStrings_Mark (str));
3200 break;
3201
3202 case mcReserved_equaltok:
3203 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found =", 21), DynamicStrings_Mark (str));
3204 break;
3205
3206 case mcReserved_uparrowtok:
3207 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ^", 21), DynamicStrings_Mark (str));
3208 break;
3209
3210 case mcReserved_semicolontok:
3211 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ;", 21), DynamicStrings_Mark (str));
3212 break;
3213
3214 case mcReserved_commatok:
3215 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ,", 21), DynamicStrings_Mark (str));
3216 break;
3217
3218 case mcReserved_periodtok:
3219 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found .", 21), DynamicStrings_Mark (str));
3220 break;
3221
3222 case mcReserved_ambersandtok:
3223 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found &", 21), DynamicStrings_Mark (str));
3224 break;
3225
3226 case mcReserved_dividetok:
3227 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found /", 21), DynamicStrings_Mark (str));
3228 break;
3229
3230 case mcReserved_timestok:
3231 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found *", 21), DynamicStrings_Mark (str));
3232 break;
3233
3234 case mcReserved_minustok:
3235 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found -", 21), DynamicStrings_Mark (str));
3236 break;
3237
3238 case mcReserved_plustok:
3239 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found +", 21), DynamicStrings_Mark (str));
3240 break;
3241
3242 case mcReserved_doublequotestok:
3243 str = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_InitString ((const char *) "syntax error, found '", 21), '"'), '\''), DynamicStrings_Mark (str));
3244 break;
3245
3246 case mcReserved_singlequotetok:
3247 str = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_InitString ((const char *) "syntax error, found \"", 21), '\''), '"'), DynamicStrings_Mark (str));
3248 break;
3249
3250 case mcReserved_greatertok:
3251 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found >", 21), DynamicStrings_Mark (str));
3252 break;
3253
3254 case mcReserved_lesstok:
3255 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <", 21), DynamicStrings_Mark (str));
3256 break;
3257
3258 case mcReserved_rparatok:
3259 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found )", 21), DynamicStrings_Mark (str));
3260 break;
3261
3262 case mcReserved_lparatok:
3263 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found (", 21), DynamicStrings_Mark (str));
3264 break;
3265
3266 case mcReserved_rcbratok:
3267 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found }", 21), DynamicStrings_Mark (str));
3268 break;
3269
3270 case mcReserved_lcbratok:
3271 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found {", 21), DynamicStrings_Mark (str));
3272 break;
3273
3274 case mcReserved_rsbratok:
3275 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ]", 21), DynamicStrings_Mark (str));
3276 break;
3277
3278 case mcReserved_lsbratok:
3279 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found [", 21), DynamicStrings_Mark (str));
3280 break;
3281
3282 case mcReserved_bartok:
3283 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found |", 21), DynamicStrings_Mark (str));
3284 break;
3285
3286 case mcReserved_becomestok:
3287 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found :=", 22), DynamicStrings_Mark (str));
3288 break;
3289
3290 case mcReserved_eoftok:
3291 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ", 20), DynamicStrings_Mark (str));
3292 break;
3293
3294
3295 default:
3296 break;
3297 }
3298 ErrorString (str);
3299 }
3300
3301
3302 /*
3303 SyntaxError - after a syntax error we skip all tokens up until we reach
3304 a stop symbol.
3305 */
3306
3307 static void SyntaxError (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3308 {
3309 DescribeError ();
3310 if (Debugging)
3311 {
3312 mcPrintf_printf0 ((const char *) "\\nskipping token *** ", 21);
3313 }
3314 /*
3315 yes the ORD(currenttoken) looks ugly, but it is *much* safer than
3316 using currenttoken<sometok as a change to the ordering of the
3317 token declarations below would cause this to break. Using ORD() we are
3318 immune from such changes
3319 */
3320 while (! (((( ((unsigned int) (mcLexBuf_currenttoken)) < 32) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & (stopset0)) != 0))) || ((( ((unsigned int) (mcLexBuf_currenttoken)) >= 32) && ( ((unsigned int) (mcLexBuf_currenttoken)) < 64)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & (stopset1)) != 0)))) || (( ((unsigned int) (mcLexBuf_currenttoken)) >= 64) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & (stopset2)) != 0)))))
3321 {
3322 mcLexBuf_getToken ();
3323 }
3324 if (Debugging)
3325 {
3326 mcPrintf_printf0 ((const char *) " ***\\n", 6);
3327 }
3328 }
3329
3330
3331 /*
3332 SyntaxCheck -
3333 */
3334
3335 static void SyntaxCheck (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3336 {
3337 /* and again (see above re: ORD)
3338 */
3339 if (! (((( ((unsigned int) (mcLexBuf_currenttoken)) < 32) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & (stopset0)) != 0))) || ((( ((unsigned int) (mcLexBuf_currenttoken)) >= 32) && ( ((unsigned int) (mcLexBuf_currenttoken)) < 64)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & (stopset1)) != 0)))) || (( ((unsigned int) (mcLexBuf_currenttoken)) >= 64) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & (stopset2)) != 0)))))
3340 {
3341 SyntaxError (stopset0, stopset1, stopset2);
3342 }
3343 }
3344
3345
3346 /*
3347 WarnMissingToken - generates a warning message about a missing token, t.
3348 */
3349
3350 static void WarnMissingToken (mcReserved_toktype t)
3351 {
3352 mcp3_SetOfStop0 s0;
3353 mcp3_SetOfStop1 s1;
3354 mcp3_SetOfStop2 s2;
3355 DynamicStrings_String str;
3356
3357 s0 = (mcp3_SetOfStop0) 0;
3358 s1 = (mcp3_SetOfStop1) 0;
3359 s2 = (mcp3_SetOfStop2) 0;
3360 if ( ((unsigned int) (t)) < 32)
3361 {
3362 s0 = (mcp3_SetOfStop0) ((1 << (t-mcReserved_eoftok)));
3363 }
3364 else if ( ((unsigned int) (t)) < 64)
3365 {
3366 /* avoid dangling else. */
3367 s1 = (mcp3_SetOfStop1) ((1 << (t-mcReserved_arraytok)));
3368 }
3369 else
3370 {
3371 /* avoid dangling else. */
3372 s2 = (mcp3_SetOfStop2) ((1 << (t-mcReserved_recordtok)));
3373 }
3374 str = DescribeStop (s0, s1, s2);
3375 str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error,", 13), DynamicStrings_Mark (str));
3376 mcError_errorStringAt (str, mcLexBuf_getTokenNo ());
3377 }
3378
3379
3380 /*
3381 MissingToken - generates a warning message about a missing token, t.
3382 */
3383
3384 static void MissingToken (mcReserved_toktype t)
3385 {
3386 WarnMissingToken (t);
3387 if ((((t != mcReserved_identtok) && (t != mcReserved_integertok)) && (t != mcReserved_realtok)) && (t != mcReserved_stringtok))
3388 {
3389 if (Debugging)
3390 {
3391 mcPrintf_printf0 ((const char *) "inserting token\\n", 17);
3392 }
3393 mcLexBuf_insertToken (t);
3394 }
3395 }
3396
3397
3398 /*
3399 CheckAndInsert -
3400 */
3401
3402 static unsigned int CheckAndInsert (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3403 {
3404 if (((( ((unsigned int) (t)) < 32) && ((((1 << (t-mcReserved_eoftok)) & (stopset0)) != 0))) || ((( ((unsigned int) (t)) >= 32) && ( ((unsigned int) (t)) < 64)) && ((((1 << (t-mcReserved_arraytok)) & (stopset1)) != 0)))) || (( ((unsigned int) (t)) >= 64) && ((((1 << (t-mcReserved_recordtok)) & (stopset2)) != 0))))
3405 {
3406 WarnMissingToken (t);
3407 mcLexBuf_insertTokenAndRewind (t);
3408 return TRUE;
3409 }
3410 else
3411 {
3412 return FALSE;
3413 }
3414 /* static analysis guarentees a RETURN statement will be used before here. */
3415 __builtin_unreachable ();
3416 }
3417
3418
3419 /*
3420 InStopSet
3421 */
3422
3423 static unsigned int InStopSet (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3424 {
3425 if (((( ((unsigned int) (t)) < 32) && ((((1 << (t-mcReserved_eoftok)) & (stopset0)) != 0))) || ((( ((unsigned int) (t)) >= 32) && ( ((unsigned int) (t)) < 64)) && ((((1 << (t-mcReserved_arraytok)) & (stopset1)) != 0)))) || (( ((unsigned int) (t)) >= 64) && ((((1 << (t-mcReserved_recordtok)) & (stopset2)) != 0))))
3426 {
3427 return TRUE;
3428 }
3429 else
3430 {
3431 return FALSE;
3432 }
3433 /* static analysis guarentees a RETURN statement will be used before here. */
3434 __builtin_unreachable ();
3435 }
3436
3437
3438 /*
3439 PeepToken - peep token checks to see whether the stopset is satisfied by currenttoken
3440 If it is not then it will insert a token providing the token
3441 is one of ; ] ) } . OF END ,
3442
3443 if the stopset contains <identtok> then we do not insert a token
3444 */
3445
3446 static void PeepToken (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3447 {
3448 /* and again (see above re: ORD)
3449 */
3450 if ((! (((( ((unsigned int) (mcLexBuf_currenttoken)) < 32) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & (stopset0)) != 0))) || ((( ((unsigned int) (mcLexBuf_currenttoken)) >= 32) && ( ((unsigned int) (mcLexBuf_currenttoken)) < 64)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & (stopset1)) != 0)))) || (( ((unsigned int) (mcLexBuf_currenttoken)) >= 64) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & (stopset2)) != 0))))) && (! (InStopSet (mcReserved_identtok, stopset0, stopset1, stopset2))))
3451 {
3452 /* SyntaxCheck would fail since currentoken is not part of the stopset
3453 we check to see whether any of currenttoken might be a commonly omitted token */
3454 if ((((((((CheckAndInsert (mcReserved_semicolontok, stopset0, stopset1, stopset2)) || (CheckAndInsert (mcReserved_rsbratok, stopset0, stopset1, stopset2))) || (CheckAndInsert (mcReserved_rparatok, stopset0, stopset1, stopset2))) || (CheckAndInsert (mcReserved_rcbratok, stopset0, stopset1, stopset2))) || (CheckAndInsert (mcReserved_periodtok, stopset0, stopset1, stopset2))) || (CheckAndInsert (mcReserved_oftok, stopset0, stopset1, stopset2))) || (CheckAndInsert (mcReserved_endtok, stopset0, stopset1, stopset2))) || (CheckAndInsert (mcReserved_commatok, stopset0, stopset1, stopset2)))
3455 {} /* empty. */
3456 }
3457 }
3458
3459
3460 /*
3461 Expect -
3462 */
3463
3464 static void Expect (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3465 {
3466 if (mcLexBuf_currenttoken == t)
3467 {
3468 /* avoid dangling else. */
3469 mcLexBuf_getToken ();
3470 if (Pass1)
3471 {
3472 PeepToken (stopset0, stopset1, stopset2);
3473 }
3474 }
3475 else
3476 {
3477 MissingToken (t);
3478 }
3479 SyntaxCheck (stopset0, stopset1, stopset2);
3480 }
3481
3482
3483 /*
3484 Ident - error checking varient of Ident
3485 */
3486
3487 static void Ident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3488 {
3489 curident = nameKey_makekey (mcLexBuf_currentstring);
3490 Expect (mcReserved_identtok, stopset0, stopset1, stopset2);
3491 }
3492
3493
3494 /*
3495 string -
3496 */
3497
3498 static void string (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3499 {
3500 curstring = nameKey_makekey (mcLexBuf_currentstring);
3501 Expect (mcReserved_stringtok, stopset0, stopset1, stopset2);
3502 }
3503
3504
3505 /*
3506 Integer -
3507 */
3508
3509 static void Integer (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3510 {
3511 Expect (mcReserved_integertok, stopset0, stopset1, stopset2);
3512 }
3513
3514
3515 /*
3516 Real -
3517 */
3518
3519 static void Real (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3520 {
3521 Expect (mcReserved_realtok, stopset0, stopset1, stopset2);
3522 }
3523
3524
3525 /*
3526 FileUnit := DefinitionModule |
3527 ImplementationOrProgramModule
3528
3529 first symbols:implementationtok, moduletok, definitiontok
3530
3531 cannot reachend
3532 */
3533
3534 static void FileUnit (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3535 {
3536 if (mcLexBuf_currenttoken == mcReserved_definitiontok)
3537 {
3538 DefinitionModule (stopset0, stopset1, stopset2);
3539 }
3540 else if (((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_implementationtok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok))))) != 0)))
3541 {
3542 /* avoid dangling else. */
3543 ImplementationOrProgramModule (stopset0, stopset1, stopset2);
3544 }
3545 else
3546 {
3547 /* avoid dangling else. */
3548 ErrorArray ((const char *) "expecting one of: IMPLEMENTATION MODULE DEFINITION", 50);
3549 }
3550 }
3551
3552
3553 /*
3554 ProgramModule := 'MODULE' Ident
3555 % curmodule := lookupModule (curident) %
3556
3557 % enterScope (curmodule) %
3558
3559 % resetEnumPos (curmodule) %
3560 [ Priority ] ';' { Import } Block
3561 Ident
3562 % checkEndName (curmodule, curident, 'program module') %
3563
3564 % setConstExpComplete (curmodule) %
3565
3566 % leaveScope %
3567 '.'
3568
3569 first symbols:moduletok
3570
3571 cannot reachend
3572 */
3573
3574 static void ProgramModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3575 {
3576 Expect (mcReserved_moduletok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
3577 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
3578 curmodule = decl_lookupModule (curident);
3579 decl_enterScope (curmodule);
3580 decl_resetEnumPos (curmodule);
3581 if (mcLexBuf_currenttoken == mcReserved_lsbratok)
3582 {
3583 Priority (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
3584 }
3585 Expect (mcReserved_semicolontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_importtok-mcReserved_arraytok)) | (1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
3586 while (((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_importtok-mcReserved_arraytok))))) != 0)))
3587 {
3588 Import (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_importtok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_typetok-mcReserved_recordtok))));
3589 }
3590 /* while */
3591 Block (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
3592 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
3593 checkEndName (curmodule, curident, (const char *) "program module", 14);
3594 decl_setConstExpComplete (curmodule);
3595 decl_leaveScope ();
3596 Expect (mcReserved_periodtok, stopset0, stopset1, stopset2);
3597 }
3598
3599
3600 /*
3601 ImplementationModule := 'IMPLEMENTATION' 'MODULE'
3602 Ident
3603 % curmodule := lookupImp (curident) %
3604
3605 % enterScope (lookupDef (curident)) %
3606
3607 % enterScope (curmodule) %
3608
3609 % resetEnumPos (curmodule) %
3610 [ Priority ] ';' { Import }
3611 Block Ident
3612 % checkEndName (curmodule, curident, 'implementation module') %
3613
3614 % setConstExpComplete (curmodule) %
3615
3616 % leaveScope ; leaveScope %
3617 '.'
3618
3619 first symbols:implementationtok
3620
3621 cannot reachend
3622 */
3623
3624 static void ImplementationModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3625 {
3626 Expect (mcReserved_implementationtok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2);
3627 Expect (mcReserved_moduletok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
3628 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
3629 curmodule = decl_lookupImp (curident);
3630 decl_enterScope (decl_lookupDef (curident));
3631 decl_enterScope (curmodule);
3632 decl_resetEnumPos (curmodule);
3633 if (mcLexBuf_currenttoken == mcReserved_lsbratok)
3634 {
3635 Priority (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
3636 }
3637 Expect (mcReserved_semicolontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_importtok-mcReserved_arraytok)) | (1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
3638 while (((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_importtok-mcReserved_arraytok))))) != 0)))
3639 {
3640 Import (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_importtok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_typetok-mcReserved_recordtok))));
3641 }
3642 /* while */
3643 Block (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
3644 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
3645 checkEndName (curmodule, curident, (const char *) "implementation module", 21);
3646 decl_setConstExpComplete (curmodule);
3647 decl_leaveScope ();
3648 decl_leaveScope ();
3649 Expect (mcReserved_periodtok, stopset0, stopset1, stopset2);
3650 }
3651
3652
3653 /*
3654 ImplementationOrProgramModule := ImplementationModule |
3655 ProgramModule
3656
3657 first symbols:moduletok, implementationtok
3658
3659 cannot reachend
3660 */
3661
3662 static void ImplementationOrProgramModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3663 {
3664 if (mcLexBuf_currenttoken == mcReserved_implementationtok)
3665 {
3666 ImplementationModule (stopset0, stopset1, stopset2);
3667 }
3668 else if (mcLexBuf_currenttoken == mcReserved_moduletok)
3669 {
3670 /* avoid dangling else. */
3671 ProgramModule (stopset0, stopset1, stopset2);
3672 }
3673 else
3674 {
3675 /* avoid dangling else. */
3676 ErrorArray ((const char *) "expecting one of: MODULE IMPLEMENTATION", 39);
3677 }
3678 }
3679
3680
3681 /*
3682 Number := Integer | Real
3683
3684 first symbols:realtok, integertok
3685
3686 cannot reachend
3687 */
3688
3689 static void Number (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3690 {
3691 if (mcLexBuf_currenttoken == mcReserved_integertok)
3692 {
3693 Integer (stopset0, stopset1, stopset2);
3694 }
3695 else if (mcLexBuf_currenttoken == mcReserved_realtok)
3696 {
3697 /* avoid dangling else. */
3698 Real (stopset0, stopset1, stopset2);
3699 }
3700 else
3701 {
3702 /* avoid dangling else. */
3703 ErrorArray ((const char *) "expecting one of: real number integer number", 44);
3704 }
3705 }
3706
3707
3708 /*
3709 Qualident := Ident { '.' Ident }
3710
3711 first symbols:identtok
3712
3713 cannot reachend
3714 */
3715
3716 static void Qualident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3717 {
3718 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
3719 while (mcLexBuf_currenttoken == mcReserved_periodtok)
3720 {
3721 Expect (mcReserved_periodtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
3722 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
3723 }
3724 /* while */
3725 }
3726
3727
3728 /*
3729 ConstantDeclaration :=
3730 % VAR d, e: node ; %
3731 Ident
3732 % d := lookupSym (curident) %
3733 '=' ConstExpression
3734 % e := pop () %
3735
3736 % assert (isConst (d)) %
3737
3738 % putConst (d, e) %
3739
3740
3741 first symbols:identtok
3742
3743 cannot reachend
3744 */
3745
3746 static void ConstantDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3747 {
3748 decl_node d;
3749 decl_node e;
3750
3751 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_equaltok-mcReserved_eoftok))), stopset1, stopset2);
3752 d = decl_lookupSym (curident);
3753 Expect (mcReserved_equaltok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
3754 ConstExpression (stopset0, stopset1, stopset2);
3755 e = pop ();
3756 mcDebug_assert (decl_isConst (d));
3757 decl_putConst (d, e);
3758 }
3759
3760
3761 /*
3762 ConstExpressionNop := SimpleConstExpr
3763 % VAR n: node ; %
3764 [ Relation SimpleConstExpr ]
3765
3766 % n := makeConstExp () %
3767
3768
3769 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
3770
3771 cannot reachend
3772 */
3773
3774 static void ConstExpressionNop (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3775 {
3776 decl_node n;
3777
3778 SimpleConstExpr (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_greaterequaltok-mcReserved_eoftok)) | (1 << (mcReserved_greatertok-mcReserved_eoftok)) | (1 << (mcReserved_lessequaltok-mcReserved_eoftok)) | (1 << (mcReserved_lesstok-mcReserved_eoftok)) | (1 << (mcReserved_lessgreatertok-mcReserved_eoftok)) | (1 << (mcReserved_hashtok-mcReserved_eoftok)) | (1 << (mcReserved_equaltok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_intok-mcReserved_arraytok))), stopset2);
3779 if (((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_equaltok-mcReserved_eoftok)) | (1 << (mcReserved_hashtok-mcReserved_eoftok)) | (1 << (mcReserved_lessgreatertok-mcReserved_eoftok)) | (1 << (mcReserved_lesstok-mcReserved_eoftok)) | (1 << (mcReserved_lessequaltok-mcReserved_eoftok)) | (1 << (mcReserved_greatertok-mcReserved_eoftok)) | (1 << (mcReserved_greaterequaltok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_intok))
3780 {
3781 Relation (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
3782 SimpleConstExpr (stopset0, stopset1, stopset2);
3783 }
3784 n = decl_makeConstExp ();
3785 }
3786
3787
3788 /*
3789 ConstExpression :=
3790 % VAR n: node ; %
3791
3792 % n := push (makeConstExp ()) %
3793 SimpleConstExpr [ Relation SimpleConstExpr ]
3794
3795 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
3796
3797 cannot reachend
3798 */
3799
3800 static void ConstExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3801 {
3802 decl_node n;
3803
3804 n = push (decl_makeConstExp ());
3805 SimpleConstExpr (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_greaterequaltok-mcReserved_eoftok)) | (1 << (mcReserved_greatertok-mcReserved_eoftok)) | (1 << (mcReserved_lessequaltok-mcReserved_eoftok)) | (1 << (mcReserved_lesstok-mcReserved_eoftok)) | (1 << (mcReserved_lessgreatertok-mcReserved_eoftok)) | (1 << (mcReserved_hashtok-mcReserved_eoftok)) | (1 << (mcReserved_equaltok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_intok-mcReserved_arraytok))), stopset2);
3806 if (((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_equaltok-mcReserved_eoftok)) | (1 << (mcReserved_hashtok-mcReserved_eoftok)) | (1 << (mcReserved_lessgreatertok-mcReserved_eoftok)) | (1 << (mcReserved_lesstok-mcReserved_eoftok)) | (1 << (mcReserved_lessequaltok-mcReserved_eoftok)) | (1 << (mcReserved_greatertok-mcReserved_eoftok)) | (1 << (mcReserved_greaterequaltok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_intok))
3807 {
3808 Relation (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
3809 SimpleConstExpr (stopset0, stopset1, stopset2);
3810 }
3811 }
3812
3813
3814 /*
3815 Relation := '=' | '#' | '<>' | '<' | '<=' |
3816 '>' | '>=' | 'IN'
3817
3818 first symbols:intok, greaterequaltok, greatertok, lessequaltok, lesstok, lessgreatertok, hashtok, equaltok
3819
3820 cannot reachend
3821 */
3822
3823 static void Relation (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3824 {
3825 if (mcLexBuf_currenttoken == mcReserved_equaltok)
3826 {
3827 Expect (mcReserved_equaltok, stopset0, stopset1, stopset2);
3828 }
3829 else if (mcLexBuf_currenttoken == mcReserved_hashtok)
3830 {
3831 /* avoid dangling else. */
3832 Expect (mcReserved_hashtok, stopset0, stopset1, stopset2);
3833 }
3834 else if (mcLexBuf_currenttoken == mcReserved_lessgreatertok)
3835 {
3836 /* avoid dangling else. */
3837 Expect (mcReserved_lessgreatertok, stopset0, stopset1, stopset2);
3838 }
3839 else if (mcLexBuf_currenttoken == mcReserved_lesstok)
3840 {
3841 /* avoid dangling else. */
3842 Expect (mcReserved_lesstok, stopset0, stopset1, stopset2);
3843 }
3844 else if (mcLexBuf_currenttoken == mcReserved_lessequaltok)
3845 {
3846 /* avoid dangling else. */
3847 Expect (mcReserved_lessequaltok, stopset0, stopset1, stopset2);
3848 }
3849 else if (mcLexBuf_currenttoken == mcReserved_greatertok)
3850 {
3851 /* avoid dangling else. */
3852 Expect (mcReserved_greatertok, stopset0, stopset1, stopset2);
3853 }
3854 else if (mcLexBuf_currenttoken == mcReserved_greaterequaltok)
3855 {
3856 /* avoid dangling else. */
3857 Expect (mcReserved_greaterequaltok, stopset0, stopset1, stopset2);
3858 }
3859 else if (mcLexBuf_currenttoken == mcReserved_intok)
3860 {
3861 /* avoid dangling else. */
3862 Expect (mcReserved_intok, stopset0, stopset1, stopset2);
3863 }
3864 else
3865 {
3866 /* avoid dangling else. */
3867 ErrorArray ((const char *) "expecting one of: IN >= > <= < <> # =", 37);
3868 }
3869 }
3870
3871
3872 /*
3873 SimpleConstExpr := UnaryOrConstTerm { AddOperator
3874 ConstTerm }
3875
3876 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
3877
3878 cannot reachend
3879 */
3880
3881 static void SimpleConstExpr (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3882 {
3883 UnaryOrConstTerm (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_ortok-mcReserved_arraytok))), stopset2);
3884 while (((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_ortok))
3885 {
3886 AddOperator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
3887 ConstTerm (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_ortok-mcReserved_arraytok))), stopset2);
3888 }
3889 /* while */
3890 }
3891
3892
3893 /*
3894 UnaryOrConstTerm := '+' ConstTerm |
3895 '-' ConstTerm |
3896 ConstTerm
3897
3898 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
3899
3900 cannot reachend
3901 */
3902
3903 static void UnaryOrConstTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3904 {
3905 if (mcLexBuf_currenttoken == mcReserved_plustok)
3906 {
3907 Expect (mcReserved_plustok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
3908 ConstTerm (stopset0, stopset1, stopset2);
3909 }
3910 else if (mcLexBuf_currenttoken == mcReserved_minustok)
3911 {
3912 /* avoid dangling else. */
3913 Expect (mcReserved_minustok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
3914 ConstTerm (stopset0, stopset1, stopset2);
3915 }
3916 else if ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_nottok)) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))))) != 0))))
3917 {
3918 /* avoid dangling else. */
3919 ConstTerm (stopset0, stopset1, stopset2);
3920 }
3921 else
3922 {
3923 /* avoid dangling else. */
3924 ErrorArray ((const char *) "expecting one of: NOT ( integer number real number __ATTRIBUTE__ identifier { string - +", 88);
3925 }
3926 }
3927
3928
3929 /*
3930 AddOperator := '+' | '-' | 'OR'
3931
3932 first symbols:ortok, minustok, plustok
3933
3934 cannot reachend
3935 */
3936
3937 static void AddOperator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3938 {
3939 if (mcLexBuf_currenttoken == mcReserved_plustok)
3940 {
3941 Expect (mcReserved_plustok, stopset0, stopset1, stopset2);
3942 }
3943 else if (mcLexBuf_currenttoken == mcReserved_minustok)
3944 {
3945 /* avoid dangling else. */
3946 Expect (mcReserved_minustok, stopset0, stopset1, stopset2);
3947 }
3948 else if (mcLexBuf_currenttoken == mcReserved_ortok)
3949 {
3950 /* avoid dangling else. */
3951 Expect (mcReserved_ortok, stopset0, stopset1, stopset2);
3952 }
3953 else
3954 {
3955 /* avoid dangling else. */
3956 ErrorArray ((const char *) "expecting one of: OR - +", 24);
3957 }
3958 }
3959
3960
3961 /*
3962 ConstTerm := ConstFactor { MulOperator ConstFactor }
3963
3964 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok
3965
3966 cannot reachend
3967 */
3968
3969 static void ConstTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3970 {
3971 ConstFactor (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ambersandtok-mcReserved_eoftok)) | (1 << (mcReserved_andtok-mcReserved_eoftok)) | (1 << (mcReserved_dividetok-mcReserved_eoftok)) | (1 << (mcReserved_timestok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_modtok-mcReserved_arraytok)) | (1 << (mcReserved_divtok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_remtok-mcReserved_recordtok))));
3972 while ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_timestok-mcReserved_eoftok)) | (1 << (mcReserved_dividetok-mcReserved_eoftok)) | (1 << (mcReserved_andtok-mcReserved_eoftok)) | (1 << (mcReserved_ambersandtok-mcReserved_eoftok))))) != 0))) || (((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_divtok-mcReserved_arraytok)) | (1 << (mcReserved_modtok-mcReserved_arraytok))))) != 0)))) || (mcLexBuf_currenttoken == mcReserved_remtok))
3973 {
3974 MulOperator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
3975 ConstFactor (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_timestok-mcReserved_eoftok)) | (1 << (mcReserved_dividetok-mcReserved_eoftok)) | (1 << (mcReserved_andtok-mcReserved_eoftok)) | (1 << (mcReserved_ambersandtok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_divtok-mcReserved_arraytok)) | (1 << (mcReserved_modtok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_remtok-mcReserved_recordtok))));
3976 }
3977 /* while */
3978 }
3979
3980
3981 /*
3982 MulOperator := '*' | '/' | 'DIV' | 'MOD' |
3983 'REM' | 'AND' | '&'
3984
3985 first symbols:ambersandtok, andtok, remtok, modtok, divtok, dividetok, timestok
3986
3987 cannot reachend
3988 */
3989
3990 static void MulOperator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
3991 {
3992 if (mcLexBuf_currenttoken == mcReserved_timestok)
3993 {
3994 Expect (mcReserved_timestok, stopset0, stopset1, stopset2);
3995 }
3996 else if (mcLexBuf_currenttoken == mcReserved_dividetok)
3997 {
3998 /* avoid dangling else. */
3999 Expect (mcReserved_dividetok, stopset0, stopset1, stopset2);
4000 }
4001 else if (mcLexBuf_currenttoken == mcReserved_divtok)
4002 {
4003 /* avoid dangling else. */
4004 Expect (mcReserved_divtok, stopset0, stopset1, stopset2);
4005 }
4006 else if (mcLexBuf_currenttoken == mcReserved_modtok)
4007 {
4008 /* avoid dangling else. */
4009 Expect (mcReserved_modtok, stopset0, stopset1, stopset2);
4010 }
4011 else if (mcLexBuf_currenttoken == mcReserved_remtok)
4012 {
4013 /* avoid dangling else. */
4014 Expect (mcReserved_remtok, stopset0, stopset1, stopset2);
4015 }
4016 else if (mcLexBuf_currenttoken == mcReserved_andtok)
4017 {
4018 /* avoid dangling else. */
4019 Expect (mcReserved_andtok, stopset0, stopset1, stopset2);
4020 }
4021 else if (mcLexBuf_currenttoken == mcReserved_ambersandtok)
4022 {
4023 /* avoid dangling else. */
4024 Expect (mcReserved_ambersandtok, stopset0, stopset1, stopset2);
4025 }
4026 else
4027 {
4028 /* avoid dangling else. */
4029 ErrorArray ((const char *) "expecting one of: & AND REM MOD DIV / *", 39);
4030 }
4031 }
4032
4033
4034 /*
4035 ConstFactor := Number | ConstString |
4036 ConstSetOrQualidentOrFunction |
4037 '(' ConstExpressionNop ')' |
4038 'NOT' ConstFactor |
4039 ConstAttribute
4040
4041 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok
4042
4043 cannot reachend
4044 */
4045
4046 static void ConstFactor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4047 {
4048 if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok))))) != 0)))
4049 {
4050 Number (stopset0, stopset1, stopset2);
4051 }
4052 else if (mcLexBuf_currenttoken == mcReserved_stringtok)
4053 {
4054 /* avoid dangling else. */
4055 ConstString (stopset0, stopset1, stopset2);
4056 }
4057 else if ((mcLexBuf_currenttoken == mcReserved_lcbratok) || (mcLexBuf_currenttoken == mcReserved_identtok))
4058 {
4059 /* avoid dangling else. */
4060 ConstSetOrQualidentOrFunction (stopset0, stopset1, stopset2);
4061 }
4062 else if (mcLexBuf_currenttoken == mcReserved_lparatok)
4063 {
4064 /* avoid dangling else. */
4065 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4066 ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
4067 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
4068 }
4069 else if (mcLexBuf_currenttoken == mcReserved_nottok)
4070 {
4071 /* avoid dangling else. */
4072 Expect (mcReserved_nottok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4073 ConstFactor (stopset0, stopset1, stopset2);
4074 }
4075 else if (mcLexBuf_currenttoken == mcReserved_attributetok)
4076 {
4077 /* avoid dangling else. */
4078 ConstAttribute (stopset0, stopset1, stopset2);
4079 }
4080 else
4081 {
4082 /* avoid dangling else. */
4083 ErrorArray ((const char *) "expecting one of: __ATTRIBUTE__ NOT ( identifier { string integer number real number", 84);
4084 }
4085 }
4086
4087
4088 /*
4089 ConstString := string
4090
4091 first symbols:stringtok
4092
4093 cannot reachend
4094 */
4095
4096 static void ConstString (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4097 {
4098 string (stopset0, stopset1, stopset2);
4099 }
4100
4101
4102 /*
4103 ComponentElement := ConstExpressionNop [ '..' ConstExpressionNop ]
4104
4105 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4106
4107 cannot reachend
4108 */
4109
4110 static void ComponentElement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4111 {
4112 ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodperiodtok-mcReserved_eoftok))), stopset1, stopset2);
4113 if (mcLexBuf_currenttoken == mcReserved_periodperiodtok)
4114 {
4115 Expect (mcReserved_periodperiodtok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4116 ConstExpressionNop (stopset0, stopset1, stopset2);
4117 }
4118 }
4119
4120
4121 /*
4122 ComponentValue := ComponentElement [ 'BY' ConstExpressionNop ]
4123
4124 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
4125
4126 cannot reachend
4127 */
4128
4129 static void ComponentValue (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4130 {
4131 ComponentElement (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_bytok-mcReserved_arraytok))), stopset2);
4132 if (mcLexBuf_currenttoken == mcReserved_bytok)
4133 {
4134 Expect (mcReserved_bytok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4135 ConstExpressionNop (stopset0, stopset1, stopset2);
4136 }
4137 }
4138
4139
4140 /*
4141 ArraySetRecordValue := ComponentValue { ',' ComponentValue }
4142
4143 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4144
4145 cannot reachend
4146 */
4147
4148 static void ArraySetRecordValue (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4149 {
4150 ComponentValue (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4151 while (mcLexBuf_currenttoken == mcReserved_commatok)
4152 {
4153 Expect (mcReserved_commatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4154 ComponentValue (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4155 }
4156 /* while */
4157 }
4158
4159
4160 /*
4161 Constructor := '{' [ ArraySetRecordValue ] '}'
4162
4163 first symbols:lcbratok
4164
4165 cannot reachend
4166 */
4167
4168 static void Constructor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4169 {
4170 Expect (mcReserved_lcbratok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rcbratok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
4171 if ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_nottok)) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))))) != 0))))
4172 {
4173 ArraySetRecordValue (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rcbratok-mcReserved_eoftok))), stopset1, stopset2);
4174 }
4175 Expect (mcReserved_rcbratok, stopset0, stopset1, stopset2);
4176 }
4177
4178
4179 /*
4180 ConstSetOrQualidentOrFunction := Qualident [ Constructor |
4181 ConstActualParameters ] |
4182 Constructor
4183
4184 first symbols:lcbratok, identtok
4185
4186 cannot reachend
4187 */
4188
4189 static void ConstSetOrQualidentOrFunction (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4190 {
4191 if (mcLexBuf_currenttoken == mcReserved_identtok)
4192 {
4193 /* avoid dangling else. */
4194 Qualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lcbratok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
4195 if ((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0)))
4196 {
4197 /* avoid gcc warning by using compound statement even if not strictly necessary. */
4198 /* seen optional [ | ] expression */
4199 if (mcLexBuf_currenttoken == mcReserved_lcbratok)
4200 {
4201 Constructor (stopset0, stopset1, stopset2);
4202 }
4203 else if (mcLexBuf_currenttoken == mcReserved_lparatok)
4204 {
4205 /* avoid dangling else. */
4206 ConstActualParameters (stopset0, stopset1, stopset2);
4207 }
4208 else
4209 {
4210 /* avoid dangling else. */
4211 ErrorArray ((const char *) "expecting one of: ( {", 21);
4212 }
4213 }
4214 /* end of optional [ | ] expression */
4215 }
4216 else if (mcLexBuf_currenttoken == mcReserved_lcbratok)
4217 {
4218 /* avoid dangling else. */
4219 Constructor (stopset0, stopset1, stopset2);
4220 }
4221 else
4222 {
4223 /* avoid dangling else. */
4224 ErrorArray ((const char *) "expecting one of: { identifier", 30);
4225 }
4226 }
4227
4228
4229 /*
4230 ConstActualParameters := '(' [ ConstExpList ] ')'
4231
4232 first symbols:lparatok
4233
4234 cannot reachend
4235 */
4236
4237 static void ConstActualParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4238 {
4239 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
4240 if ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_nottok)) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))))) != 0))))
4241 {
4242 ConstExpList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
4243 }
4244 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
4245 }
4246
4247
4248 /*
4249 ConstExpList := ConstExpressionNop { ',' ConstExpressionNop }
4250
4251 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4252
4253 cannot reachend
4254 */
4255
4256 static void ConstExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4257 {
4258 ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4259 while (mcLexBuf_currenttoken == mcReserved_commatok)
4260 {
4261 Expect (mcReserved_commatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4262 ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4263 }
4264 /* while */
4265 }
4266
4267
4268 /*
4269 ConstAttribute := '__ATTRIBUTE__' '__BUILTIN__'
4270 '(' '(' ConstAttributeExpression
4271 ')' ')'
4272
4273 first symbols:attributetok
4274
4275 cannot reachend
4276 */
4277
4278 static void ConstAttribute (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4279 {
4280 Expect (mcReserved_attributetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_builtintok-mcReserved_recordtok))));
4281 Expect (mcReserved_builtintok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
4282 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
4283 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lesstok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4284 ConstAttributeExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
4285 Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
4286 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
4287 }
4288
4289
4290 /*
4291 ConstAttributeExpression := Ident | '<' Qualident
4292 ',' Ident '>'
4293
4294 first symbols:lesstok, identtok
4295
4296 cannot reachend
4297 */
4298
4299 static void ConstAttributeExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4300 {
4301 if (mcLexBuf_currenttoken == mcReserved_identtok)
4302 {
4303 Ident (stopset0, stopset1, stopset2);
4304 }
4305 else if (mcLexBuf_currenttoken == mcReserved_lesstok)
4306 {
4307 /* avoid dangling else. */
4308 Expect (mcReserved_lesstok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4309 Qualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4310 Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4311 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_greatertok-mcReserved_eoftok))), stopset1, stopset2);
4312 Expect (mcReserved_greatertok, stopset0, stopset1, stopset2);
4313 }
4314 else
4315 {
4316 /* avoid dangling else. */
4317 ErrorArray ((const char *) "expecting one of: < identifier", 30);
4318 }
4319 }
4320
4321
4322 /*
4323 ByteAlignment := ''
4324
4325 first symbols:ldirectivetok
4326
4327 cannot reachend
4328 */
4329
4330 static void ByteAlignment (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4331 {
4332 Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4333 AttributeExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
4334 Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
4335 }
4336
4337
4338 /*
4339 OptAlignmentExpression := [ AlignmentExpression ]
4340
4341 first symbols:lparatok
4342
4343 reachend
4344 */
4345
4346 static void OptAlignmentExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4347 {
4348 if (mcLexBuf_currenttoken == mcReserved_lparatok)
4349 {
4350 AlignmentExpression (stopset0, stopset1, stopset2);
4351 }
4352 }
4353
4354
4355 /*
4356 AlignmentExpression := '(' ConstExpressionNop ')'
4357
4358 first symbols:lparatok
4359
4360 cannot reachend
4361 */
4362
4363 static void AlignmentExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4364 {
4365 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4366 ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
4367 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
4368 }
4369
4370
4371 /*
4372 Alignment := [ ByteAlignment ]
4373
4374 first symbols:ldirectivetok
4375
4376 reachend
4377 */
4378
4379 static void Alignment (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4380 {
4381 if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
4382 {
4383 ByteAlignment (stopset0, stopset1, stopset2);
4384 }
4385 }
4386
4387
4388 /*
4389 IdentList := Ident { ',' Ident }
4390
4391 first symbols:identtok
4392
4393 cannot reachend
4394 */
4395
4396 static void IdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4397 {
4398 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4399 while (mcLexBuf_currenttoken == mcReserved_commatok)
4400 {
4401 Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4402 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4403 }
4404 /* while */
4405 }
4406
4407
4408 /*
4409 PushIdentList :=
4410 % VAR n: node ; %
4411
4412 % n := makeIdentList () %
4413 Ident
4414 % checkDuplicate (putIdent (n, curident)) %
4415 { ',' Ident
4416 % checkDuplicate (putIdent (n, curident)) %
4417 }
4418 % n := push (n) %
4419
4420
4421 first symbols:identtok
4422
4423 cannot reachend
4424 */
4425
4426 static void PushIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4427 {
4428 decl_node n;
4429
4430 n = decl_makeIdentList ();
4431 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4432 checkDuplicate (decl_putIdent (n, curident));
4433 while (mcLexBuf_currenttoken == mcReserved_commatok)
4434 {
4435 Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4436 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4437 checkDuplicate (decl_putIdent (n, curident));
4438 }
4439 /* while */
4440 n = push (n);
4441 }
4442
4443
4444 /*
4445 SubrangeType :=
4446 % VAR low, high: node ; d: CARDINAL ; %
4447 '['
4448 % d := depth () %
4449 ConstExpression
4450 % low := pop () %
4451
4452 % assert (d = depth ()) %
4453 '..' ConstExpression
4454 % high := pop () %
4455
4456 % assert (d = depth ()) %
4457
4458 % typeExp := push (makeSubrange (low, high)) %
4459
4460 % assert (d = depth () - 1) %
4461 ']'
4462
4463 first symbols:lsbratok
4464
4465 cannot reachend
4466 */
4467
4468 static void SubrangeType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4469 {
4470 decl_node low;
4471 decl_node high;
4472 unsigned int d;
4473
4474 Expect (mcReserved_lsbratok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4475 d = depth ();
4476 ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodperiodtok-mcReserved_eoftok))), stopset1, stopset2);
4477 low = pop ();
4478 mcDebug_assert (d == (depth ()));
4479 Expect (mcReserved_periodperiodtok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4480 ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
4481 high = pop ();
4482 mcDebug_assert (d == (depth ()));
4483 typeExp = push (decl_makeSubrange (low, high));
4484 mcDebug_assert (d == ((depth ())-1));
4485 Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
4486 }
4487
4488
4489 /*
4490 ArrayType := 'ARRAY'
4491 % VAR c: CARDINAL ; t, n: node ; %
4492
4493 % c := 0 %
4494 SimpleType
4495 % INC (c) %
4496 { ',' SimpleType
4497 % INC (c) %
4498 } 'OF' Type
4499 % n := push (makeIndexedArray (c, pop ())) %
4500
4501
4502 first symbols:arraytok
4503
4504 cannot reachend
4505 */
4506
4507 static void ArrayType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4508 {
4509 unsigned int c;
4510 decl_node t;
4511 decl_node n;
4512
4513 Expect (mcReserved_arraytok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4514 c = 0;
4515 SimpleType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
4516 c += 1;
4517 while (mcLexBuf_currenttoken == mcReserved_commatok)
4518 {
4519 Expect (mcReserved_commatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4520 SimpleType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
4521 c += 1;
4522 }
4523 /* while */
4524 Expect (mcReserved_oftok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_pointertok-mcReserved_arraytok)) | (1 << (mcReserved_packedsettok-mcReserved_arraytok)) | (1 << (mcReserved_oftok-mcReserved_arraytok)) | (1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_settok-mcReserved_recordtok)) | (1 << (mcReserved_recordtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
4525 Type (stopset0, stopset1, stopset2);
4526 n = push (makeIndexedArray (c, pop ()));
4527 }
4528
4529
4530 /*
4531 RecordType := 'RECORD'
4532 % VAR n: node ; %
4533
4534 % n := push (makeRecord ()) %
4535
4536 % n := push (NIL) no varient %
4537 [ DefaultRecordAttributes ] FieldListSequence
4538
4539 % assert (pop ()=NIL) %
4540 'END'
4541
4542 first symbols:recordtok
4543
4544 cannot reachend
4545 */
4546
4547 static void RecordType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4548 {
4549 decl_node n;
4550
4551 Expect (mcReserved_recordtok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok)) | (1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4552 n = push (decl_makeRecord ());
4553 n = push (static_cast<decl_node> (NULL)); /* no varient */
4554 if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
4555 {
4556 DefaultRecordAttributes (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4557 }
4558 FieldListSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
4559 mcDebug_assert ((pop ()) == NULL);
4560 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
4561 }
4562
4563
4564 /*
4565 DefaultRecordAttributes := ''
4566
4567 first symbols:ldirectivetok
4568
4569 cannot reachend
4570 */
4571
4572 static void DefaultRecordAttributes (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4573 {
4574 Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4575 AttributeExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
4576 Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
4577 }
4578
4579
4580 /*
4581 RecordFieldPragma := [ '' ]
4582
4583 first symbols:ldirectivetok
4584
4585 reachend
4586 */
4587
4588 static void RecordFieldPragma (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4589 {
4590 if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
4591 {
4592 Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4593 FieldPragmaExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok)) | (1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
4594 while (mcLexBuf_currenttoken == mcReserved_commatok)
4595 {
4596 Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4597 FieldPragmaExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok)) | (1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
4598 }
4599 /* while */
4600 Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
4601 }
4602 }
4603
4604
4605 /*
4606 FieldPragmaExpression := Ident PragmaConstExpression
4607
4608 first symbols:identtok
4609
4610 cannot reachend
4611 */
4612
4613 static void FieldPragmaExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4614 {
4615 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
4616 PragmaConstExpression (stopset0, stopset1, stopset2);
4617 }
4618
4619
4620 /*
4621 PragmaConstExpression := [ '(' ConstExpressionNop
4622 ')' ]
4623
4624 first symbols:lparatok
4625
4626 reachend
4627 */
4628
4629 static void PragmaConstExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4630 {
4631 if (mcLexBuf_currenttoken == mcReserved_lparatok)
4632 {
4633 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4634 ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
4635 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
4636 }
4637 }
4638
4639
4640 /*
4641 AttributeExpression := Ident '(' ConstExpressionNop
4642 ')'
4643
4644 first symbols:identtok
4645
4646 cannot reachend
4647 */
4648
4649 static void AttributeExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4650 {
4651 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
4652 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
4653 ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
4654 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
4655 }
4656
4657
4658 /*
4659 FieldListSequence := FieldListStatement { ';' FieldListStatement }
4660
4661 first symbols:casetok, identtok, semicolontok
4662
4663 reachend
4664 */
4665
4666 static void FieldListSequence (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4667 {
4668 FieldListStatement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
4669 while (mcLexBuf_currenttoken == mcReserved_semicolontok)
4670 {
4671 Expect (mcReserved_semicolontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_casetok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4672 FieldListStatement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
4673 }
4674 /* while */
4675 }
4676
4677
4678 /*
4679 FieldListStatement := [ FieldList ]
4680
4681 first symbols:identtok, casetok
4682
4683 reachend
4684 */
4685
4686 static void FieldListStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4687 {
4688 if ((mcLexBuf_currenttoken == mcReserved_casetok) || (mcLexBuf_currenttoken == mcReserved_identtok))
4689 {
4690 FieldList (stopset0, stopset1, stopset2);
4691 }
4692 }
4693
4694
4695 /*
4696 FieldList :=
4697 % VAR r, i, f, t, n, v, w: node ; d: CARDINAL ; %
4698
4699 % d := depth () %
4700
4701 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
4702
4703 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
4704
4705 % v := push (v) %
4706
4707 % assert (d=depth ()) %
4708
4709 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isVarientField (r))) %
4710 PushIdentList ':'
4711 % assert (d=depth () - 1) %
4712
4713 % i := pop () %
4714 Type
4715 % assert (d=depth () - 1) %
4716
4717 % t := pop () %
4718 RecordFieldPragma
4719 % assert (d=depth ()) %
4720
4721 % r := addFieldsToRecord (r, v, i, t) %
4722
4723 % assert (d=depth ()) %
4724 |
4725 'CASE'
4726 % addRecordToList %
4727
4728 % d := depth () %
4729
4730 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
4731
4732 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
4733
4734 % v := push (v) %
4735
4736 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isRecordField (r))) %
4737
4738 % w := push (makeVarient (r)) %
4739
4740 % assert (d = depth () - 1) %
4741
4742 % addVarientToList %
4743 CaseTag 'OF'
4744 % assert (d = depth () - 1) %
4745 Varient
4746 % assert (d = depth () - 1) %
4747 { '|' Varient
4748 % assert (d = depth () - 1) %
4749 }
4750 % w := peep () ; assert (isVarient (w)) %
4751
4752 % assert (d = depth () - 1) %
4753 [ 'ELSE' FieldListSequence ] 'END'
4754
4755 % w := pop () ; assert (isVarient (w)) %
4756
4757 % assert (d=depth ()) %
4758
4759
4760 first symbols:casetok, identtok
4761
4762 cannot reachend
4763 */
4764
4765 static void FieldList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4766 {
4767 decl_node r;
4768 decl_node i;
4769 decl_node f;
4770 decl_node t;
4771 decl_node n;
4772 decl_node v;
4773 decl_node w;
4774 unsigned int d;
4775
4776 if (mcLexBuf_currenttoken == mcReserved_identtok)
4777 {
4778 d = depth ();
4779 v = pop ();
4780 mcDebug_assert ((v == NULL) || (decl_isVarient (v)));
4781 r = peep ();
4782 mcDebug_assert ((decl_isRecord (r)) || (decl_isVarientField (r)));
4783 v = push (v);
4784 mcDebug_assert (d == (depth ()));
4785 mcDebug_assert (((v == NULL) && (decl_isRecord (r))) || ((v != NULL) && (decl_isVarientField (r))));
4786 PushIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
4787 Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_pointertok-mcReserved_arraytok)) | (1 << (mcReserved_packedsettok-mcReserved_arraytok)) | (1 << (mcReserved_oftok-mcReserved_arraytok)) | (1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_settok-mcReserved_recordtok)) | (1 << (mcReserved_recordtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
4788 mcDebug_assert (d == ((depth ())-1));
4789 i = pop ();
4790 Type (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
4791 mcDebug_assert (d == ((depth ())-1));
4792 t = pop ();
4793 RecordFieldPragma (stopset0, stopset1, stopset2);
4794 mcDebug_assert (d == (depth ()));
4795 r = decl_addFieldsToRecord (r, v, i, t);
4796 mcDebug_assert (d == (depth ()));
4797 }
4798 else if (mcLexBuf_currenttoken == mcReserved_casetok)
4799 {
4800 /* avoid dangling else. */
4801 Expect (mcReserved_casetok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4802 /* addRecordToList */
4803 d = depth ();
4804 v = pop ();
4805 mcDebug_assert ((v == NULL) || (decl_isVarient (v)));
4806 r = peep ();
4807 mcDebug_assert ((decl_isRecord (r)) || (decl_isVarientField (r)));
4808 v = push (v);
4809 mcDebug_assert (((v == NULL) && (decl_isRecord (r))) || ((v != NULL) && (decl_isRecordField (r))));
4810 w = push (decl_makeVarient (r));
4811 mcDebug_assert (d == ((depth ())-1));
4812 /* addVarientToList */
4813 CaseTag (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
4814 Expect (mcReserved_oftok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
4815 mcDebug_assert (d == ((depth ())-1));
4816 Varient (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
4817 mcDebug_assert (d == ((depth ())-1));
4818 while (mcLexBuf_currenttoken == mcReserved_bartok)
4819 {
4820 Expect (mcReserved_bartok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
4821 Varient (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok))), stopset2);
4822 mcDebug_assert (d == ((depth ())-1));
4823 }
4824 /* while */
4825 w = peep ();
4826 mcDebug_assert (decl_isVarient (w));
4827 mcDebug_assert (d == ((depth ())-1));
4828 if (mcLexBuf_currenttoken == mcReserved_elsetok)
4829 {
4830 Expect (mcReserved_elsetok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4831 FieldListSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
4832 }
4833 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
4834 w = pop ();
4835 mcDebug_assert (decl_isVarient (w));
4836 mcDebug_assert (d == (depth ()));
4837 }
4838 else
4839 {
4840 /* avoid dangling else. */
4841 ErrorArray ((const char *) "expecting one of: CASE identifier", 33);
4842 }
4843 }
4844
4845
4846 /*
4847 TagIdent := Ident |
4848 % curident := NulName %
4849
4850
4851 first symbols:identtok
4852
4853 reachend
4854 */
4855
4856 static void TagIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4857 {
4858 if (mcLexBuf_currenttoken == mcReserved_identtok)
4859 {
4860 Ident (stopset0, stopset1, stopset2);
4861 }
4862 else
4863 {
4864 curident = nameKey_NulName;
4865 }
4866 }
4867
4868
4869 /*
4870 CaseTag :=
4871 % VAR tagident: Name ; q, v, w, r: node ; %
4872
4873 % w := pop () ; v := pop () ; r := peep () ; v := push (v) ; w := push (w) %
4874
4875 % assert (isVarient (w)) %
4876
4877 % assert ((v=NIL) OR isVarient (v)) %
4878
4879 % assert (isRecord (r) OR isVarientField (r)) %
4880
4881 % assert (isVarient (push (pop ()))) %
4882 TagIdent
4883 % tagident := curident %
4884 ( ':' PushQualident
4885 % q := pop () %
4886
4887 % assert (isVarient (push (pop ()))) %
4888 |
4889 % q := NIL %
4890 )
4891 % buildVarientSelector (r, w, tagident, q) %
4892
4893
4894 first symbols:colontok, identtok
4895
4896 reachend
4897 */
4898
4899 static void CaseTag (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4900 {
4901 nameKey_Name tagident;
4902 decl_node q;
4903 decl_node v;
4904 decl_node w;
4905 decl_node r;
4906
4907 w = pop ();
4908 v = pop ();
4909 r = peep ();
4910 v = push (v);
4911 w = push (w);
4912 mcDebug_assert (decl_isVarient (w));
4913 mcDebug_assert ((v == NULL) || (decl_isVarient (v)));
4914 mcDebug_assert ((decl_isRecord (r)) || (decl_isVarientField (r)));
4915 mcDebug_assert (decl_isVarient (push (pop ())));
4916 TagIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
4917 tagident = curident;
4918 if (mcLexBuf_currenttoken == mcReserved_colontok)
4919 {
4920 Expect (mcReserved_colontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4921 PushQualident (stopset0, stopset1, stopset2);
4922 q = pop ();
4923 mcDebug_assert (decl_isVarient (push (pop ())));
4924 }
4925 else
4926 {
4927 q = static_cast<decl_node> (NULL);
4928 }
4929 decl_buildVarientSelector (r, w, tagident, q);
4930 }
4931
4932
4933 /*
4934 Varient :=
4935 % VAR p, r, v, f: node ; d: CARDINAL ; %
4936
4937 % d := depth () %
4938
4939 % assert (isVarient (peep ())) %
4940 [
4941 % v := pop () ; assert (isVarient (v)) %
4942
4943 % r := pop () %
4944
4945 % p := peep () %
4946
4947 % r := push (r) %
4948
4949 % f := push (buildVarientFieldRecord (v, p)) %
4950
4951 % v := push (v) %
4952 VarientCaseLabelList ':' FieldListSequence
4953
4954 % v := pop () %
4955
4956 % f := pop () %
4957
4958 % assert (isVarientField (f)) %
4959
4960 % assert (isVarient (v)) %
4961
4962 % v := push (v) %
4963 ]
4964 % assert (isVarient (peep ())) %
4965
4966 % assert (d=depth ()) %
4967
4968
4969 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4970
4971 reachend
4972 */
4973
4974 static void Varient (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
4975 {
4976 decl_node p;
4977 decl_node r;
4978 decl_node v;
4979 decl_node f;
4980 unsigned int d;
4981
4982 d = depth ();
4983 mcDebug_assert (decl_isVarient (peep ()));
4984 if ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_nottok)) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))))) != 0))))
4985 {
4986 v = pop ();
4987 mcDebug_assert (decl_isVarient (v));
4988 r = pop ();
4989 p = peep ();
4990 r = push (r);
4991 f = push (decl_buildVarientFieldRecord (v, p));
4992 v = push (v);
4993 VarientCaseLabelList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
4994 Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_casetok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
4995 FieldListSequence (stopset0, stopset1, stopset2);
4996 v = pop ();
4997 f = pop ();
4998 mcDebug_assert (decl_isVarientField (f));
4999 mcDebug_assert (decl_isVarient (v));
5000 v = push (v);
5001 }
5002 mcDebug_assert (decl_isVarient (peep ()));
5003 mcDebug_assert (d == (depth ()));
5004 }
5005
5006
5007 /*
5008 VarientCaseLabelList := VarientCaseLabels { ','
5009 VarientCaseLabels }
5010
5011 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
5012
5013 cannot reachend
5014 */
5015
5016 static void VarientCaseLabelList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5017 {
5018 VarientCaseLabels (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5019 while (mcLexBuf_currenttoken == mcReserved_commatok)
5020 {
5021 Expect (mcReserved_commatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
5022 VarientCaseLabels (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5023 }
5024 /* while */
5025 }
5026
5027
5028 /*
5029 VarientCaseLabels :=
5030 % VAR l, h: node ; %
5031
5032 % h := NIL %
5033 ConstExpression
5034 % l := pop () %
5035 [ '..' ConstExpression
5036 % h := pop () %
5037 ]
5038 % l, h could be saved if necessary. %
5039
5040
5041 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
5042
5043 cannot reachend
5044 */
5045
5046 static void VarientCaseLabels (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5047 {
5048 decl_node l;
5049 decl_node h;
5050
5051 h = static_cast<decl_node> (NULL);
5052 ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodperiodtok-mcReserved_eoftok))), stopset1, stopset2);
5053 l = pop ();
5054 if (mcLexBuf_currenttoken == mcReserved_periodperiodtok)
5055 {
5056 Expect (mcReserved_periodperiodtok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
5057 ConstExpression (stopset0, stopset1, stopset2);
5058 h = pop ();
5059 }
5060 }
5061
5062
5063 /*
5064 SetType := ( 'SET' | 'PACKEDSET' ) 'OF' SimpleType
5065
5066 % VAR n: node ; %
5067
5068 % n := push (makeSet (pop ())) %
5069
5070
5071 first symbols:oftok, packedsettok, settok
5072
5073 cannot reachend
5074 */
5075
5076 static void SetType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5077 {
5078 decl_node n;
5079
5080 if (mcLexBuf_currenttoken == mcReserved_settok)
5081 {
5082 Expect (mcReserved_settok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
5083 }
5084 else if (mcLexBuf_currenttoken == mcReserved_packedsettok)
5085 {
5086 /* avoid dangling else. */
5087 Expect (mcReserved_packedsettok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
5088 }
5089 else
5090 {
5091 /* avoid dangling else. */
5092 ErrorArray ((const char *) "expecting one of: PACKEDSET SET", 31);
5093 }
5094 Expect (mcReserved_oftok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
5095 SimpleType (stopset0, stopset1, stopset2);
5096 n = push (decl_makeSet (pop ()));
5097 }
5098
5099
5100 /*
5101 PointerType := 'POINTER' 'TO' Type
5102 % VAR n: node ; %
5103
5104 % n := push (makePointer (pop ())) %
5105
5106
5107 first symbols:pointertok
5108
5109 cannot reachend
5110 */
5111
5112 static void PointerType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5113 {
5114 decl_node n;
5115
5116 Expect (mcReserved_pointertok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_totok-mcReserved_recordtok))));
5117 Expect (mcReserved_totok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_pointertok-mcReserved_arraytok)) | (1 << (mcReserved_packedsettok-mcReserved_arraytok)) | (1 << (mcReserved_oftok-mcReserved_arraytok)) | (1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_settok-mcReserved_recordtok)) | (1 << (mcReserved_recordtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5118 Type (stopset0, stopset1, stopset2);
5119 n = push (decl_makePointer (pop ()));
5120 }
5121
5122
5123 /*
5124 ProcedureType := 'PROCEDURE'
5125 % curproc := push (makeProcType ()) %
5126 [ FormalTypeList ]
5127
5128 first symbols:proceduretok
5129
5130 cannot reachend
5131 */
5132
5133 static void ProcedureType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5134 {
5135 Expect (mcReserved_proceduretok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
5136 curproc = push (decl_makeProcType ());
5137 if (mcLexBuf_currenttoken == mcReserved_lparatok)
5138 {
5139 FormalTypeList (stopset0, stopset1, stopset2);
5140 }
5141 }
5142
5143
5144 /*
5145 FormalTypeList := '(' ( ')' FormalReturn |
5146 ProcedureParameters ')'
5147 FormalReturn )
5148
5149 first symbols:lparatok
5150
5151 cannot reachend
5152 */
5153
5154 static void FormalTypeList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5155 {
5156 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5157 if (mcLexBuf_currenttoken == mcReserved_rparatok)
5158 {
5159 Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
5160 FormalReturn (stopset0, stopset1, stopset2);
5161 }
5162 else if ((mcLexBuf_currenttoken == mcReserved_arraytok) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))))) != 0))))
5163 {
5164 /* avoid dangling else. */
5165 ProcedureParameters (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
5166 Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
5167 FormalReturn (stopset0, stopset1, stopset2);
5168 }
5169 else
5170 {
5171 /* avoid dangling else. */
5172 ErrorArray ((const char *) "expecting one of: VAR ... ARRAY identifier )", 44);
5173 }
5174 }
5175
5176
5177 /*
5178 FormalReturn := [ ':' OptReturnType ]
5179
5180 first symbols:colontok
5181
5182 reachend
5183 */
5184
5185 static void FormalReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5186 {
5187 if (mcLexBuf_currenttoken == mcReserved_colontok)
5188 {
5189 Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
5190 OptReturnType (stopset0, stopset1, stopset2);
5191 }
5192 }
5193
5194
5195 /*
5196 OptReturnType := '[' PushQualident
5197 % putReturnType (curproc, pop ()) %
5198
5199 % putOptReturn (curproc) %
5200 ']' | PushQualident
5201 % putReturnType (curproc, pop ()) %
5202
5203
5204 first symbols:identtok, lsbratok
5205
5206 cannot reachend
5207 */
5208
5209 static void OptReturnType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5210 {
5211 if (mcLexBuf_currenttoken == mcReserved_lsbratok)
5212 {
5213 Expect (mcReserved_lsbratok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
5214 PushQualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
5215 decl_putReturnType (curproc, pop ());
5216 decl_putOptReturn (curproc);
5217 Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
5218 }
5219 else if (mcLexBuf_currenttoken == mcReserved_identtok)
5220 {
5221 /* avoid dangling else. */
5222 PushQualident (stopset0, stopset1, stopset2);
5223 decl_putReturnType (curproc, pop ());
5224 }
5225 else
5226 {
5227 /* avoid dangling else. */
5228 ErrorArray ((const char *) "expecting one of: identifier [", 30);
5229 }
5230 }
5231
5232
5233 /*
5234 ProcedureParameters := ProcedureParameter
5235 % addParameter (curproc, pop ()) %
5236 { ',' ProcedureParameter
5237
5238 % addParameter (curproc, pop ()) %
5239 }
5240
5241 first symbols:identtok, arraytok, periodperiodperiodtok, vartok
5242
5243 cannot reachend
5244 */
5245
5246 static void ProcedureParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5247 {
5248 ProcedureParameter (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5249 decl_addParameter (curproc, pop ());
5250 while (mcLexBuf_currenttoken == mcReserved_commatok)
5251 {
5252 Expect (mcReserved_commatok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5253 ProcedureParameter (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5254 decl_addParameter (curproc, pop ());
5255 }
5256 /* while */
5257 }
5258
5259
5260 /*
5261 ProcedureParameter := '...'
5262 % VAR n: node ; %
5263
5264 % n := push (makeVarargs ()) %
5265 | 'VAR' FormalType
5266 % n := push (makeVarParameter (NIL, pop (), curproc, TRUE)) %
5267 | FormalType
5268 % n := push (makeNonVarParameter (NIL, pop (), curproc, TRUE)) %
5269
5270
5271 first symbols:identtok, arraytok, vartok, periodperiodperiodtok
5272
5273 cannot reachend
5274 */
5275
5276 static void ProcedureParameter (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5277 {
5278 decl_node n;
5279
5280 if (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok)
5281 {
5282 Expect (mcReserved_periodperiodperiodtok, stopset0, stopset1, stopset2);
5283 n = push (decl_makeVarargs ());
5284 }
5285 else if (mcLexBuf_currenttoken == mcReserved_vartok)
5286 {
5287 /* avoid dangling else. */
5288 Expect (mcReserved_vartok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
5289 FormalType (stopset0, stopset1, stopset2);
5290 n = push (decl_makeVarParameter (static_cast<decl_node> (NULL), pop (), curproc, TRUE));
5291 }
5292 else if ((mcLexBuf_currenttoken == mcReserved_arraytok) || (mcLexBuf_currenttoken == mcReserved_identtok))
5293 {
5294 /* avoid dangling else. */
5295 FormalType (stopset0, stopset1, stopset2);
5296 n = push (decl_makeNonVarParameter (static_cast<decl_node> (NULL), pop (), curproc, TRUE));
5297 }
5298 else
5299 {
5300 /* avoid dangling else. */
5301 ErrorArray ((const char *) "expecting one of: ARRAY identifier VAR ...", 42);
5302 }
5303 }
5304
5305
5306 /*
5307 VarIdent :=
5308 % VAR n, a: node ; %
5309
5310 % n := pop () %
5311 Ident
5312 % checkDuplicate (putIdent (n, curident)) %
5313
5314 % n := push (n) %
5315 [ '[' ConstExpression
5316 % a := pop () could store, a, into, n. %
5317 ']' ]
5318
5319 first symbols:identtok
5320
5321 cannot reachend
5322 */
5323
5324 static void VarIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5325 {
5326 decl_node n;
5327 decl_node a;
5328
5329 n = pop ();
5330 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
5331 checkDuplicate (decl_putIdent (n, curident));
5332 n = push (n);
5333 if (mcLexBuf_currenttoken == mcReserved_lsbratok)
5334 {
5335 Expect (mcReserved_lsbratok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
5336 ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
5337 a = pop (); /* could store, a, into, n. */
5338 Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
5339 }
5340 }
5341
5342
5343 /*
5344 VarIdentList :=
5345 % VAR n: node ; %
5346
5347 % n := makeIdentList () %
5348
5349 % n := push (n) %
5350 VarIdent { ',' VarIdent }
5351
5352 first symbols:identtok
5353
5354 cannot reachend
5355 */
5356
5357 static void VarIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5358 {
5359 decl_node n;
5360
5361 n = decl_makeIdentList ();
5362 n = push (n);
5363 VarIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5364 while (mcLexBuf_currenttoken == mcReserved_commatok)
5365 {
5366 Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
5367 VarIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5368 }
5369 /* while */
5370 }
5371
5372
5373 /*
5374 VariableDeclaration :=
5375 % VAR v, d: node ; %
5376 VarIdentList
5377 % v := pop () %
5378 ':' Type
5379 % d := makeVarDecl (v, pop ()) %
5380 Alignment
5381
5382 first symbols:identtok
5383
5384 cannot reachend
5385 */
5386
5387 static void VariableDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5388 {
5389 decl_node v;
5390 decl_node d;
5391
5392 VarIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
5393 v = pop ();
5394 Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_pointertok-mcReserved_arraytok)) | (1 << (mcReserved_packedsettok-mcReserved_arraytok)) | (1 << (mcReserved_oftok-mcReserved_arraytok)) | (1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_settok-mcReserved_recordtok)) | (1 << (mcReserved_recordtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5395 Type (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
5396 d = decl_makeVarDecl (v, pop ());
5397 Alignment (stopset0, stopset1, stopset2);
5398 }
5399
5400
5401 /*
5402 Designator := Qualident { SubDesignator }
5403
5404 first symbols:identtok
5405
5406 cannot reachend
5407 */
5408
5409 static void Designator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5410 {
5411 Qualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_uparrowtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
5412 while ((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_uparrowtok-mcReserved_eoftok))))) != 0)))
5413 {
5414 SubDesignator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_uparrowtok-mcReserved_eoftok))), stopset1, stopset2);
5415 }
5416 /* while */
5417 }
5418
5419
5420 /*
5421 SubDesignator := '.' Ident | '[' ArrayExpList ']' |
5422 '^'
5423
5424 first symbols:uparrowtok, lsbratok, periodtok
5425
5426 cannot reachend
5427 */
5428
5429 static void SubDesignator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5430 {
5431 if (mcLexBuf_currenttoken == mcReserved_periodtok)
5432 {
5433 Expect (mcReserved_periodtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
5434 Ident (stopset0, stopset1, stopset2);
5435 }
5436 else if (mcLexBuf_currenttoken == mcReserved_lsbratok)
5437 {
5438 /* avoid dangling else. */
5439 Expect (mcReserved_lsbratok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5440 ArrayExpList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
5441 Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
5442 }
5443 else if (mcLexBuf_currenttoken == mcReserved_uparrowtok)
5444 {
5445 /* avoid dangling else. */
5446 Expect (mcReserved_uparrowtok, stopset0, stopset1, stopset2);
5447 }
5448 else
5449 {
5450 /* avoid dangling else. */
5451 ErrorArray ((const char *) "expecting one of: ^ [ .", 23);
5452 }
5453 }
5454
5455
5456 /*
5457 ArrayExpList := Expression { ',' Expression }
5458
5459 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
5460
5461 cannot reachend
5462 */
5463
5464 static void ArrayExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5465 {
5466 Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5467 while (mcLexBuf_currenttoken == mcReserved_commatok)
5468 {
5469 Expect (mcReserved_commatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5470 Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5471 }
5472 /* while */
5473 }
5474
5475
5476 /*
5477 ExpList := Expression { ',' Expression }
5478
5479 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
5480
5481 cannot reachend
5482 */
5483
5484 static void ExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5485 {
5486 Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5487 while (mcLexBuf_currenttoken == mcReserved_commatok)
5488 {
5489 Expect (mcReserved_commatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5490 Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
5491 }
5492 /* while */
5493 }
5494
5495
5496 /*
5497 Expression := SimpleExpression [ Relation SimpleExpression ]
5498
5499 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
5500
5501 cannot reachend
5502 */
5503
5504 static void Expression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5505 {
5506 SimpleExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_greaterequaltok-mcReserved_eoftok)) | (1 << (mcReserved_greatertok-mcReserved_eoftok)) | (1 << (mcReserved_lessequaltok-mcReserved_eoftok)) | (1 << (mcReserved_lesstok-mcReserved_eoftok)) | (1 << (mcReserved_lessgreatertok-mcReserved_eoftok)) | (1 << (mcReserved_hashtok-mcReserved_eoftok)) | (1 << (mcReserved_equaltok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_intok-mcReserved_arraytok))), stopset2);
5507 if (((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_equaltok-mcReserved_eoftok)) | (1 << (mcReserved_hashtok-mcReserved_eoftok)) | (1 << (mcReserved_lessgreatertok-mcReserved_eoftok)) | (1 << (mcReserved_lesstok-mcReserved_eoftok)) | (1 << (mcReserved_lessequaltok-mcReserved_eoftok)) | (1 << (mcReserved_greatertok-mcReserved_eoftok)) | (1 << (mcReserved_greaterequaltok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_intok))
5508 {
5509 Relation (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5510 SimpleExpression (stopset0, stopset1, stopset2);
5511 }
5512 }
5513
5514
5515 /*
5516 SimpleExpression := UnaryOrTerm { AddOperator Term }
5517
5518 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
5519
5520 cannot reachend
5521 */
5522
5523 static void SimpleExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5524 {
5525 UnaryOrTerm (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_ortok-mcReserved_arraytok))), stopset2);
5526 while (((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_ortok))
5527 {
5528 AddOperator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5529 Term (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_ortok-mcReserved_arraytok))), stopset2);
5530 }
5531 /* while */
5532 }
5533
5534
5535 /*
5536 UnaryOrTerm := '+' Term | '-' Term |
5537 Term
5538
5539 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
5540
5541 cannot reachend
5542 */
5543
5544 static void UnaryOrTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5545 {
5546 if (mcLexBuf_currenttoken == mcReserved_plustok)
5547 {
5548 Expect (mcReserved_plustok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5549 Term (stopset0, stopset1, stopset2);
5550 }
5551 else if (mcLexBuf_currenttoken == mcReserved_minustok)
5552 {
5553 /* avoid dangling else. */
5554 Expect (mcReserved_minustok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5555 Term (stopset0, stopset1, stopset2);
5556 }
5557 else if ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_nottok)) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))))) != 0))))
5558 {
5559 /* avoid dangling else. */
5560 Term (stopset0, stopset1, stopset2);
5561 }
5562 else
5563 {
5564 /* avoid dangling else. */
5565 ErrorArray ((const char *) "expecting one of: NOT ( string integer number real number identifier { - +", 74);
5566 }
5567 }
5568
5569
5570 /*
5571 Term := Factor { MulOperator Factor }
5572
5573 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok
5574
5575 cannot reachend
5576 */
5577
5578 static void Term (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5579 {
5580 Factor (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ambersandtok-mcReserved_eoftok)) | (1 << (mcReserved_andtok-mcReserved_eoftok)) | (1 << (mcReserved_dividetok-mcReserved_eoftok)) | (1 << (mcReserved_timestok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_modtok-mcReserved_arraytok)) | (1 << (mcReserved_divtok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_remtok-mcReserved_recordtok))));
5581 while ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_timestok-mcReserved_eoftok)) | (1 << (mcReserved_dividetok-mcReserved_eoftok)) | (1 << (mcReserved_andtok-mcReserved_eoftok)) | (1 << (mcReserved_ambersandtok-mcReserved_eoftok))))) != 0))) || (((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_divtok-mcReserved_arraytok)) | (1 << (mcReserved_modtok-mcReserved_arraytok))))) != 0)))) || (mcLexBuf_currenttoken == mcReserved_remtok))
5582 {
5583 MulOperator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5584 Factor (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_timestok-mcReserved_eoftok)) | (1 << (mcReserved_dividetok-mcReserved_eoftok)) | (1 << (mcReserved_andtok-mcReserved_eoftok)) | (1 << (mcReserved_ambersandtok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_divtok-mcReserved_arraytok)) | (1 << (mcReserved_modtok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_remtok-mcReserved_recordtok))));
5585 }
5586 /* while */
5587 }
5588
5589
5590 /*
5591 Factor := Number | string | SetOrDesignatorOrFunction |
5592 '(' Expression ')' |
5593 'NOT' ( Factor | ConstAttribute )
5594
5595 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok
5596
5597 cannot reachend
5598 */
5599
5600 static void Factor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5601 {
5602 if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok))))) != 0)))
5603 {
5604 Number (stopset0, stopset1, stopset2);
5605 }
5606 else if (mcLexBuf_currenttoken == mcReserved_stringtok)
5607 {
5608 /* avoid dangling else. */
5609 string (stopset0, stopset1, stopset2);
5610 }
5611 else if ((mcLexBuf_currenttoken == mcReserved_lcbratok) || (mcLexBuf_currenttoken == mcReserved_identtok))
5612 {
5613 /* avoid dangling else. */
5614 SetOrDesignatorOrFunction (stopset0, stopset1, stopset2);
5615 }
5616 else if (mcLexBuf_currenttoken == mcReserved_lparatok)
5617 {
5618 /* avoid dangling else. */
5619 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5620 Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
5621 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
5622 }
5623 else if (mcLexBuf_currenttoken == mcReserved_nottok)
5624 {
5625 /* avoid dangling else. */
5626 Expect (mcReserved_nottok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5627 if ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_nottok)) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))))) != 0))))
5628 {
5629 Factor (stopset0, stopset1, stopset2);
5630 }
5631 else if (mcLexBuf_currenttoken == mcReserved_attributetok)
5632 {
5633 /* avoid dangling else. */
5634 ConstAttribute (stopset0, stopset1, stopset2);
5635 }
5636 else
5637 {
5638 /* avoid dangling else. */
5639 ErrorArray ((const char *) "expecting one of: __ATTRIBUTE__ real number integer number string ( NOT { identifier", 84);
5640 }
5641 }
5642 else
5643 {
5644 /* avoid dangling else. */
5645 ErrorArray ((const char *) "expecting one of: NOT ( identifier { string integer number real number", 70);
5646 }
5647 }
5648
5649
5650 /*
5651 SetOrDesignatorOrFunction := Qualident [ Constructor |
5652 SimpleDes
5653 [ ActualParameters ] ] |
5654 Constructor
5655
5656 first symbols:lcbratok, identtok
5657
5658 cannot reachend
5659 */
5660
5661 static void SetOrDesignatorOrFunction (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5662 {
5663 if (mcLexBuf_currenttoken == mcReserved_identtok)
5664 {
5665 /* avoid dangling else. */
5666 Qualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lcbratok-mcReserved_eoftok)) | (1 << (mcReserved_periodtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_uparrowtok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
5667 if ((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_uparrowtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_periodtok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0)))
5668 {
5669 /* avoid gcc warning by using compound statement even if not strictly necessary. */
5670 /* seen optional [ | ] expression */
5671 if (mcLexBuf_currenttoken == mcReserved_lcbratok)
5672 {
5673 Constructor (stopset0, stopset1, stopset2);
5674 }
5675 else if ((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_uparrowtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_periodtok-mcReserved_eoftok))))) != 0)))
5676 {
5677 /* avoid dangling else. */
5678 SimpleDes (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
5679 if (mcLexBuf_currenttoken == mcReserved_lparatok)
5680 {
5681 ActualParameters (stopset0, stopset1, stopset2);
5682 }
5683 }
5684 else
5685 {
5686 /* avoid dangling else. */
5687 ErrorArray ((const char *) "expecting one of: ( ^ [ . {", 27);
5688 }
5689 }
5690 /* end of optional [ | ] expression */
5691 }
5692 else if (mcLexBuf_currenttoken == mcReserved_lcbratok)
5693 {
5694 /* avoid dangling else. */
5695 Constructor (stopset0, stopset1, stopset2);
5696 }
5697 else
5698 {
5699 /* avoid dangling else. */
5700 ErrorArray ((const char *) "expecting one of: { identifier", 30);
5701 }
5702 }
5703
5704
5705 /*
5706 SimpleDes := { SubDesignator }
5707
5708 first symbols:periodtok, lsbratok, uparrowtok
5709
5710 reachend
5711 */
5712
5713 static void SimpleDes (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5714 {
5715 while ((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_uparrowtok-mcReserved_eoftok))))) != 0)))
5716 {
5717 SubDesignator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_uparrowtok-mcReserved_eoftok))), stopset1, stopset2);
5718 }
5719 /* while */
5720 }
5721
5722
5723 /*
5724 ActualParameters := '(' [ ExpList ] ')'
5725
5726 first symbols:lparatok
5727
5728 cannot reachend
5729 */
5730
5731 static void ActualParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5732 {
5733 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5734 if ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_nottok)) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))))) != 0))))
5735 {
5736 ExpList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
5737 }
5738 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
5739 }
5740
5741
5742 /*
5743 ExitStatement := 'EXIT'
5744
5745 first symbols:exittok
5746
5747 cannot reachend
5748 */
5749
5750 static void ExitStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5751 {
5752 Expect (mcReserved_exittok, stopset0, stopset1, stopset2);
5753 }
5754
5755
5756 /*
5757 ReturnStatement := 'RETURN' [ Expression ]
5758
5759 first symbols:returntok
5760
5761 cannot reachend
5762 */
5763
5764 static void ReturnStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5765 {
5766 Expect (mcReserved_returntok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5767 if ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_nottok)) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))))) != 0))))
5768 {
5769 Expression (stopset0, stopset1, stopset2);
5770 }
5771 }
5772
5773
5774 /*
5775 Statement := [ AssignmentOrProcedureCall |
5776 IfStatement | CaseStatement |
5777 WhileStatement |
5778 RepeatStatement |
5779 LoopStatement | ForStatement |
5780 WithStatement | AsmStatement |
5781 ExitStatement | ReturnStatement |
5782 RetryStatement ]
5783
5784 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok
5785
5786 reachend
5787 */
5788
5789 static void Statement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5790 {
5791 if ((((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok))))) != 0))) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_retrytok-mcReserved_recordtok)) | (1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))))) != 0))))
5792 {
5793 /* avoid gcc warning by using compound statement even if not strictly necessary. */
5794 /* seen optional [ | ] expression */
5795 if (mcLexBuf_currenttoken == mcReserved_identtok)
5796 {
5797 AssignmentOrProcedureCall (stopset0, stopset1, stopset2);
5798 }
5799 else if (mcLexBuf_currenttoken == mcReserved_iftok)
5800 {
5801 /* avoid dangling else. */
5802 IfStatement (stopset0, stopset1, stopset2);
5803 }
5804 else if (mcLexBuf_currenttoken == mcReserved_casetok)
5805 {
5806 /* avoid dangling else. */
5807 CaseStatement (stopset0, stopset1, stopset2);
5808 }
5809 else if (mcLexBuf_currenttoken == mcReserved_whiletok)
5810 {
5811 /* avoid dangling else. */
5812 WhileStatement (stopset0, stopset1, stopset2);
5813 }
5814 else if (mcLexBuf_currenttoken == mcReserved_repeattok)
5815 {
5816 /* avoid dangling else. */
5817 RepeatStatement (stopset0, stopset1, stopset2);
5818 }
5819 else if (mcLexBuf_currenttoken == mcReserved_looptok)
5820 {
5821 /* avoid dangling else. */
5822 LoopStatement (stopset0, stopset1, stopset2);
5823 }
5824 else if (mcLexBuf_currenttoken == mcReserved_fortok)
5825 {
5826 /* avoid dangling else. */
5827 ForStatement (stopset0, stopset1, stopset2);
5828 }
5829 else if (mcLexBuf_currenttoken == mcReserved_withtok)
5830 {
5831 /* avoid dangling else. */
5832 WithStatement (stopset0, stopset1, stopset2);
5833 }
5834 else if (mcLexBuf_currenttoken == mcReserved_asmtok)
5835 {
5836 /* avoid dangling else. */
5837 AsmStatement (stopset0, stopset1, stopset2);
5838 }
5839 else if (mcLexBuf_currenttoken == mcReserved_exittok)
5840 {
5841 /* avoid dangling else. */
5842 ExitStatement (stopset0, stopset1, stopset2);
5843 }
5844 else if (mcLexBuf_currenttoken == mcReserved_returntok)
5845 {
5846 /* avoid dangling else. */
5847 ReturnStatement (stopset0, stopset1, stopset2);
5848 }
5849 else if (mcLexBuf_currenttoken == mcReserved_retrytok)
5850 {
5851 /* avoid dangling else. */
5852 RetryStatement (stopset0, stopset1, stopset2);
5853 }
5854 else
5855 {
5856 /* avoid dangling else. */
5857 ErrorArray ((const char *) "expecting one of: RETRY RETURN EXIT ASM WITH FOR LOOP REPEAT WHILE CASE IF identifier", 85);
5858 }
5859 }
5860 /* end of optional [ | ] expression */
5861 }
5862
5863
5864 /*
5865 RetryStatement := 'RETRY'
5866
5867 first symbols:retrytok
5868
5869 cannot reachend
5870 */
5871
5872 static void RetryStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5873 {
5874 Expect (mcReserved_retrytok, stopset0, stopset1, stopset2);
5875 }
5876
5877
5878 /*
5879 AssignmentOrProcedureCall := Designator ( ':=' Expression |
5880 ActualParameters |
5881
5882 % epsilon %
5883 )
5884
5885 first symbols:identtok
5886
5887 cannot reachend
5888 */
5889
5890 static void AssignmentOrProcedureCall (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5891 {
5892 Designator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_becomestok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
5893 if (mcLexBuf_currenttoken == mcReserved_becomestok)
5894 {
5895 Expect (mcReserved_becomestok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5896 Expression (stopset0, stopset1, stopset2);
5897 }
5898 else if (mcLexBuf_currenttoken == mcReserved_lparatok)
5899 {
5900 /* avoid dangling else. */
5901 ActualParameters (stopset0, stopset1, stopset2);
5902 }
5903 /* epsilon */
5904 }
5905
5906
5907 /*
5908 StatementSequence := Statement { ';' Statement }
5909
5910 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok
5911
5912 reachend
5913 */
5914
5915 static void StatementSequence (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5916 {
5917 Statement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
5918 while (mcLexBuf_currenttoken == mcReserved_semicolontok)
5919 {
5920 Expect (mcReserved_semicolontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5921 Statement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
5922 }
5923 /* while */
5924 }
5925
5926
5927 /*
5928 IfStatement := 'IF' Expression 'THEN' StatementSequence
5929 { 'ELSIF' Expression 'THEN' StatementSequence }
5930 [ 'ELSE' StatementSequence ] 'END'
5931
5932 first symbols:iftok
5933
5934 cannot reachend
5935 */
5936
5937 static void IfStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5938 {
5939 Expect (mcReserved_iftok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5940 Expression (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_thentok-mcReserved_recordtok))));
5941 Expect (mcReserved_thentok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_elsiftok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
5942 StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_elsiftok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
5943 while (mcLexBuf_currenttoken == mcReserved_elsiftok)
5944 {
5945 Expect (mcReserved_elsiftok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5946 Expression (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_thentok-mcReserved_recordtok))));
5947 Expect (mcReserved_thentok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_elsiftok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
5948 StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_elsiftok-mcReserved_arraytok))), stopset2);
5949 }
5950 /* while */
5951 if (mcLexBuf_currenttoken == mcReserved_elsetok)
5952 {
5953 Expect (mcReserved_elsetok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
5954 StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
5955 }
5956 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
5957 }
5958
5959
5960 /*
5961 CaseStatement := 'CASE' Expression 'OF' Case { '|'
5962 Case }
5963 CaseEndStatement
5964
5965 first symbols:casetok
5966
5967 cannot reachend
5968 */
5969
5970 static void CaseStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5971 {
5972 Expect (mcReserved_casetok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
5973 Expression (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
5974 Expect (mcReserved_oftok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
5975 Case (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
5976 while (mcLexBuf_currenttoken == mcReserved_bartok)
5977 {
5978 Expect (mcReserved_bartok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
5979 Case (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok))), stopset2);
5980 }
5981 /* while */
5982 CaseEndStatement (stopset0, stopset1, stopset2);
5983 }
5984
5985
5986 /*
5987 CaseEndStatement := 'END' | 'ELSE' StatementSequence
5988 'END'
5989
5990 first symbols:elsetok, endtok
5991
5992 cannot reachend
5993 */
5994
5995 static void CaseEndStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
5996 {
5997 if (mcLexBuf_currenttoken == mcReserved_endtok)
5998 {
5999 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
6000 }
6001 else if (mcLexBuf_currenttoken == mcReserved_elsetok)
6002 {
6003 /* avoid dangling else. */
6004 Expect (mcReserved_elsetok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6005 StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
6006 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
6007 }
6008 else
6009 {
6010 /* avoid dangling else. */
6011 ErrorArray ((const char *) "expecting one of: ELSE END", 26);
6012 }
6013 }
6014
6015
6016 /*
6017 Case := [ CaseLabelList ':' StatementSequence ]
6018
6019 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
6020
6021 reachend
6022 */
6023
6024 static void Case (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6025 {
6026 if ((((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_nottok)) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))))) != 0))))
6027 {
6028 CaseLabelList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
6029 Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6030 StatementSequence (stopset0, stopset1, stopset2);
6031 }
6032 }
6033
6034
6035 /*
6036 CaseLabelList := CaseLabels { ',' CaseLabels }
6037
6038 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
6039
6040 cannot reachend
6041 */
6042
6043 static void CaseLabelList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6044 {
6045 CaseLabels (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
6046 while (mcLexBuf_currenttoken == mcReserved_commatok)
6047 {
6048 Expect (mcReserved_commatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))));
6049 CaseLabels (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
6050 }
6051 /* while */
6052 }
6053
6054
6055 /*
6056 CaseLabels := ConstExpressionNop [ '..' ConstExpressionNop ]
6057
6058 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
6059
6060 cannot reachend
6061 */
6062
6063 static void CaseLabels (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6064 {
6065 ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodperiodtok-mcReserved_eoftok))), stopset1, stopset2);
6066 if (mcLexBuf_currenttoken == mcReserved_periodperiodtok)
6067 {
6068 Expect (mcReserved_periodperiodtok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
6069 ConstExpressionNop (stopset0, stopset1, stopset2);
6070 }
6071 }
6072
6073
6074 /*
6075 WhileStatement := 'WHILE' Expression 'DO' StatementSequence
6076 'END'
6077
6078 first symbols:whiletok
6079
6080 cannot reachend
6081 */
6082
6083 static void WhileStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6084 {
6085 Expect (mcReserved_whiletok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
6086 Expression (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_dotok-mcReserved_arraytok))), stopset2);
6087 Expect (mcReserved_dotok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6088 StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
6089 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
6090 }
6091
6092
6093 /*
6094 RepeatStatement := 'REPEAT' StatementSequence 'UNTIL'
6095 Expression
6096
6097 first symbols:repeattok
6098
6099 cannot reachend
6100 */
6101
6102 static void RepeatStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6103 {
6104 Expect (mcReserved_repeattok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_untiltok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6105 StatementSequence (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_untiltok-mcReserved_recordtok))));
6106 Expect (mcReserved_untiltok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
6107 Expression (stopset0, stopset1, stopset2);
6108 }
6109
6110
6111 /*
6112 ForStatement := 'FOR' Ident ':=' Expression 'TO'
6113 Expression [ 'BY' ConstExpressionNop ]
6114 'DO' StatementSequence 'END'
6115
6116 first symbols:fortok
6117
6118 cannot reachend
6119 */
6120
6121 static void ForStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6122 {
6123 Expect (mcReserved_fortok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6124 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_becomestok-mcReserved_eoftok))), stopset1, stopset2);
6125 Expect (mcReserved_becomestok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
6126 Expression (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_totok-mcReserved_recordtok))));
6127 Expect (mcReserved_totok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
6128 Expression (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_bytok-mcReserved_arraytok)) | (1 << (mcReserved_dotok-mcReserved_arraytok))), stopset2);
6129 if (mcLexBuf_currenttoken == mcReserved_bytok)
6130 {
6131 Expect (mcReserved_bytok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
6132 ConstExpressionNop (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_dotok-mcReserved_arraytok))), stopset2);
6133 }
6134 Expect (mcReserved_dotok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6135 StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
6136 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
6137 }
6138
6139
6140 /*
6141 LoopStatement := 'LOOP' StatementSequence 'END'
6142
6143 first symbols:looptok
6144
6145 cannot reachend
6146 */
6147
6148 static void LoopStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6149 {
6150 Expect (mcReserved_looptok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6151 StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
6152 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
6153 }
6154
6155
6156 /*
6157 WithStatement := 'WITH' Designator 'DO' StatementSequence
6158 'END'
6159
6160 first symbols:withtok
6161
6162 cannot reachend
6163 */
6164
6165 static void WithStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6166 {
6167 Expect (mcReserved_withtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6168 Designator (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_dotok-mcReserved_arraytok))), stopset2);
6169 Expect (mcReserved_dotok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6170 StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
6171 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
6172 }
6173
6174
6175 /*
6176 ProcedureDeclaration := ProcedureHeading ';' ProcedureBlock
6177 Ident
6178 % leaveScope %
6179
6180
6181 first symbols:proceduretok
6182
6183 cannot reachend
6184 */
6185
6186 static void ProcedureDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6187 {
6188 ProcedureHeading (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
6189 Expect (mcReserved_semicolontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
6190 ProcedureBlock (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6191 Ident (stopset0, stopset1, stopset2);
6192 decl_leaveScope ();
6193 }
6194
6195
6196 /*
6197 ProcedureIdent := Ident
6198 % curproc := lookupSym (curident) %
6199
6200 % enterScope (curproc) %
6201
6202
6203 first symbols:identtok
6204
6205 cannot reachend
6206 */
6207
6208 static void ProcedureIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6209 {
6210 Ident (stopset0, stopset1, stopset2);
6211 curproc = decl_lookupSym (curident);
6212 decl_enterScope (curproc);
6213 }
6214
6215
6216 /*
6217 DefProcedureIdent := Ident
6218 % curproc := lookupSym (curident) %
6219
6220
6221 first symbols:identtok
6222
6223 cannot reachend
6224 */
6225
6226 static void DefProcedureIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6227 {
6228 Ident (stopset0, stopset1, stopset2);
6229 curproc = decl_lookupSym (curident);
6230 }
6231
6232
6233 /*
6234 DefineBuiltinProcedure := [ '__ATTRIBUTE__' '__BUILTIN__'
6235 '(' '(' Ident ')' ')' |
6236 '__INLINE__' ]
6237
6238 first symbols:inlinetok, attributetok
6239
6240 reachend
6241 */
6242
6243 static void DefineBuiltinProcedure (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6244 {
6245 if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_inlinetok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))))) != 0)))
6246 {
6247 /* avoid gcc warning by using compound statement even if not strictly necessary. */
6248 /* seen optional [ | ] expression */
6249 if (mcLexBuf_currenttoken == mcReserved_attributetok)
6250 {
6251 Expect (mcReserved_attributetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_builtintok-mcReserved_recordtok))));
6252 Expect (mcReserved_builtintok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
6253 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
6254 Expect (mcReserved_lparatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6255 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
6256 Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
6257 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
6258 }
6259 else if (mcLexBuf_currenttoken == mcReserved_inlinetok)
6260 {
6261 /* avoid dangling else. */
6262 Expect (mcReserved_inlinetok, stopset0, stopset1, stopset2);
6263 }
6264 else
6265 {
6266 /* avoid dangling else. */
6267 ErrorArray ((const char *) "expecting one of: __INLINE__ __ATTRIBUTE__", 42);
6268 }
6269 }
6270 /* end of optional [ | ] expression */
6271 }
6272
6273
6274 /*
6275 ProcedureHeading := 'PROCEDURE' DefineBuiltinProcedure
6276 ( ProcedureIdent [ FormalParameters ]
6277 AttributeNoReturn )
6278
6279 first symbols:proceduretok
6280
6281 cannot reachend
6282 */
6283
6284 static void ProcedureHeading (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6285 {
6286 Expect (mcReserved_proceduretok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_inlinetok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
6287 DefineBuiltinProcedure (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6288 ProcedureIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
6289 if (mcLexBuf_currenttoken == mcReserved_lparatok)
6290 {
6291 FormalParameters (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
6292 }
6293 AttributeNoReturn (stopset0, stopset1, stopset2);
6294 }
6295
6296
6297 /*
6298 Builtin := [ '__BUILTIN__' | '__INLINE__' ]
6299
6300 first symbols:inlinetok, builtintok
6301
6302 reachend
6303 */
6304
6305 static void Builtin (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6306 {
6307 if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_inlinetok-mcReserved_recordtok)) | (1 << (mcReserved_builtintok-mcReserved_recordtok))))) != 0)))
6308 {
6309 /* avoid gcc warning by using compound statement even if not strictly necessary. */
6310 /* seen optional [ | ] expression */
6311 if (mcLexBuf_currenttoken == mcReserved_builtintok)
6312 {
6313 Expect (mcReserved_builtintok, stopset0, stopset1, stopset2);
6314 }
6315 else if (mcLexBuf_currenttoken == mcReserved_inlinetok)
6316 {
6317 /* avoid dangling else. */
6318 Expect (mcReserved_inlinetok, stopset0, stopset1, stopset2);
6319 }
6320 else
6321 {
6322 /* avoid dangling else. */
6323 ErrorArray ((const char *) "expecting one of: __INLINE__ __BUILTIN__", 40);
6324 }
6325 }
6326 /* end of optional [ | ] expression */
6327 }
6328
6329
6330 /*
6331 DefProcedureHeading := 'PROCEDURE' Builtin ( DefProcedureIdent
6332 [ DefFormalParameters ]
6333 AttributeNoReturn )
6334
6335 first symbols:proceduretok
6336
6337 cannot reachend
6338 */
6339
6340 static void DefProcedureHeading (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6341 {
6342 Expect (mcReserved_proceduretok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_inlinetok-mcReserved_recordtok)) | (1 << (mcReserved_builtintok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
6343 Builtin (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6344 DefProcedureIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
6345 if (mcLexBuf_currenttoken == mcReserved_lparatok)
6346 {
6347 DefFormalParameters (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
6348 }
6349 AttributeNoReturn (stopset0, stopset1, stopset2);
6350 }
6351
6352
6353 /*
6354 ProcedureBlock := { Declaration } [ 'BEGIN' ProcedureBlockBody ]
6355 'END'
6356
6357 first symbols:proceduretok, moduletok, consttok, typetok, vartok, endtok, begintok
6358
6359 cannot reachend
6360 */
6361
6362 static void ProcedureBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6363 {
6364 while ((((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok))))) != 0))) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))))) != 0))))
6365 {
6366 Declaration (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
6367 }
6368 /* while */
6369 if (mcLexBuf_currenttoken == mcReserved_begintok)
6370 {
6371 Expect (mcReserved_begintok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_excepttok-mcReserved_arraytok)) | (1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6372 ProcedureBlockBody (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
6373 }
6374 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
6375 }
6376
6377
6378 /*
6379 Block := { Declaration } InitialBlock FinalBlock
6380 'END'
6381
6382 first symbols:proceduretok, moduletok, finallytok, begintok, consttok, typetok, vartok, endtok
6383
6384 cannot reachend
6385 */
6386
6387 static void Block (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6388 {
6389 while ((((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok))))) != 0))) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))))) != 0))))
6390 {
6391 Declaration (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
6392 }
6393 /* while */
6394 InitialBlock (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok))), stopset2);
6395 FinalBlock (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
6396 Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
6397 }
6398
6399
6400 /*
6401 InitialBlock := [ 'BEGIN' InitialBlockBody ]
6402
6403 first symbols:begintok
6404
6405 reachend
6406 */
6407
6408 static void InitialBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6409 {
6410 if (mcLexBuf_currenttoken == mcReserved_begintok)
6411 {
6412 Expect (mcReserved_begintok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_excepttok-mcReserved_arraytok)) | (1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6413 InitialBlockBody (stopset0, stopset1, stopset2);
6414 }
6415 }
6416
6417
6418 /*
6419 FinalBlock := [ 'FINALLY' FinalBlockBody ]
6420
6421 first symbols:finallytok
6422
6423 reachend
6424 */
6425
6426 static void FinalBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6427 {
6428 if (mcLexBuf_currenttoken == mcReserved_finallytok)
6429 {
6430 Expect (mcReserved_finallytok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_excepttok-mcReserved_arraytok)) | (1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok))));
6431 FinalBlockBody (stopset0, stopset1, stopset2);
6432 }
6433 }
6434
6435
6436 /*
6437 InitialBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
6438
6439 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
6440
6441 reachend
6442 */
6443
6444 static void InitialBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6445 {
6446 NormalPart (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_excepttok-mcReserved_arraytok))), stopset2);
6447 if (mcLexBuf_currenttoken == mcReserved_excepttok)
6448 {
6449 Expect (mcReserved_excepttok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
6450 ExceptionalPart (stopset0, stopset1, stopset2);
6451 }
6452 }
6453
6454
6455 /*
6456 FinalBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
6457
6458 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
6459
6460 reachend
6461 */
6462
6463 static void FinalBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6464 {
6465 NormalPart (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_excepttok-mcReserved_arraytok))), stopset2);
6466 if (mcLexBuf_currenttoken == mcReserved_excepttok)
6467 {
6468 Expect (mcReserved_excepttok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
6469 ExceptionalPart (stopset0, stopset1, stopset2);
6470 }
6471 }
6472
6473
6474 /*
6475 ProcedureBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
6476
6477 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
6478
6479 reachend
6480 */
6481
6482 static void ProcedureBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6483 {
6484 NormalPart (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_excepttok-mcReserved_arraytok))), stopset2);
6485 if (mcLexBuf_currenttoken == mcReserved_excepttok)
6486 {
6487 Expect (mcReserved_excepttok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_exittok-mcReserved_arraytok)) | (1 << (mcReserved_fortok-mcReserved_arraytok)) | (1 << (mcReserved_looptok-mcReserved_arraytok)) | (1 << (mcReserved_casetok-mcReserved_arraytok)) | (1 << (mcReserved_iftok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_returntok-mcReserved_recordtok)) | (1 << (mcReserved_retrytok-mcReserved_recordtok)) | (1 << (mcReserved_asmtok-mcReserved_recordtok)) | (1 << (mcReserved_withtok-mcReserved_recordtok)) | (1 << (mcReserved_repeattok-mcReserved_recordtok)) | (1 << (mcReserved_whiletok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
6488 ExceptionalPart (stopset0, stopset1, stopset2);
6489 }
6490 }
6491
6492
6493 /*
6494 NormalPart := StatementSequence
6495
6496 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
6497
6498 reachend
6499 */
6500
6501 static void NormalPart (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6502 {
6503 StatementSequence (stopset0, stopset1, stopset2);
6504 }
6505
6506
6507 /*
6508 ExceptionalPart := StatementSequence
6509
6510 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
6511
6512 reachend
6513 */
6514
6515 static void ExceptionalPart (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6516 {
6517 StatementSequence (stopset0, stopset1, stopset2);
6518 }
6519
6520
6521 /*
6522 Declaration := 'CONST' { ConstantDeclaration ';' } |
6523 'TYPE' { TypeDeclaration } |
6524 'VAR' { VariableDeclaration ';' } |
6525 ProcedureDeclaration ';' |
6526 ModuleDeclaration ';'
6527
6528 first symbols:moduletok, proceduretok, vartok, typetok, consttok
6529
6530 cannot reachend
6531 */
6532
6533 static void Declaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6534 {
6535 if (mcLexBuf_currenttoken == mcReserved_consttok)
6536 {
6537 Expect (mcReserved_consttok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6538 while (mcLexBuf_currenttoken == mcReserved_identtok)
6539 {
6540 ConstantDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
6541 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6542 }
6543 /* while */
6544 }
6545 else if (mcLexBuf_currenttoken == mcReserved_typetok)
6546 {
6547 /* avoid dangling else. */
6548 Expect (mcReserved_typetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6549 while (mcLexBuf_currenttoken == mcReserved_identtok)
6550 {
6551 TypeDeclaration (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6552 }
6553 /* while */
6554 }
6555 else if (mcLexBuf_currenttoken == mcReserved_vartok)
6556 {
6557 /* avoid dangling else. */
6558 Expect (mcReserved_vartok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6559 while (mcLexBuf_currenttoken == mcReserved_identtok)
6560 {
6561 VariableDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
6562 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6563 }
6564 /* while */
6565 }
6566 else if (mcLexBuf_currenttoken == mcReserved_proceduretok)
6567 {
6568 /* avoid dangling else. */
6569 ProcedureDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
6570 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
6571 }
6572 else if (mcLexBuf_currenttoken == mcReserved_moduletok)
6573 {
6574 /* avoid dangling else. */
6575 ModuleDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
6576 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
6577 }
6578 else
6579 {
6580 /* avoid dangling else. */
6581 ErrorArray ((const char *) "expecting one of: MODULE PROCEDURE VAR TYPE CONST", 49);
6582 }
6583 }
6584
6585
6586 /*
6587 DefFormalParameters := '('
6588 % paramEnter (curproc) %
6589 [ DefMultiFPSection ] ')'
6590
6591 % paramLeave (curproc) %
6592 FormalReturn
6593
6594 first symbols:lparatok
6595
6596 cannot reachend
6597 */
6598
6599 static void DefFormalParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6600 {
6601 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
6602 decl_paramEnter (curproc);
6603 if ((mcLexBuf_currenttoken == mcReserved_lsbratok) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))))) != 0))))
6604 {
6605 DefMultiFPSection (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
6606 }
6607 Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
6608 decl_paramLeave (curproc);
6609 FormalReturn (stopset0, stopset1, stopset2);
6610 }
6611
6612
6613 /*
6614 DefMultiFPSection := DefExtendedFP |
6615 FPSection [ ';' DefMultiFPSection ]
6616
6617 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
6618
6619 cannot reachend
6620 */
6621
6622 static void DefMultiFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6623 {
6624 if ((mcLexBuf_currenttoken == mcReserved_lsbratok) || (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok))
6625 {
6626 DefExtendedFP (stopset0, stopset1, stopset2);
6627 }
6628 else if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))))) != 0)))
6629 {
6630 /* avoid dangling else. */
6631 FPSection (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
6632 if (mcLexBuf_currenttoken == mcReserved_semicolontok)
6633 {
6634 Expect (mcReserved_semicolontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
6635 DefMultiFPSection (stopset0, stopset1, stopset2);
6636 }
6637 }
6638 else
6639 {
6640 /* avoid dangling else. */
6641 ErrorArray ((const char *) "expecting one of: identifier VAR ... [", 38);
6642 }
6643 }
6644
6645
6646 /*
6647 FormalParameters := '('
6648 % paramEnter (curproc) %
6649 [ MultiFPSection ] ')'
6650 % paramLeave (curproc) %
6651 FormalReturn
6652
6653 first symbols:lparatok
6654
6655 cannot reachend
6656 */
6657
6658 static void FormalParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6659 {
6660 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
6661 decl_paramEnter (curproc);
6662 if ((mcLexBuf_currenttoken == mcReserved_lsbratok) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))))) != 0))))
6663 {
6664 MultiFPSection (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
6665 }
6666 Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
6667 decl_paramLeave (curproc);
6668 FormalReturn (stopset0, stopset1, stopset2);
6669 }
6670
6671
6672 /*
6673 AttributeNoReturn := [ NoReturn |
6674 % setNoReturn (curproc, FALSE) %
6675 ]
6676
6677 first symbols:ldirectivetok
6678
6679 reachend
6680 */
6681
6682 static void AttributeNoReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6683 {
6684 if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
6685 {
6686 /* avoid gcc warning by using compound statement even if not strictly necessary. */
6687 /* seen optional [ | ] expression */
6688 if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
6689 {
6690 NoReturn (stopset0, stopset1, stopset2);
6691 }
6692 else
6693 {
6694 decl_setNoReturn (curproc, FALSE);
6695 }
6696 }
6697 /* end of optional [ | ] expression */
6698 }
6699
6700
6701 /*
6702 NoReturn := ''
6703
6704 first symbols:ldirectivetok
6705
6706 cannot reachend
6707 */
6708
6709 static void NoReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6710 {
6711 Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6712 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
6713 decl_setNoReturn (curproc, TRUE);
6714 checkReturnAttribute ();
6715 Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
6716 }
6717
6718
6719 /*
6720 AttributeUnused := [ Unused ]
6721
6722 first symbols:ldirectivetok
6723
6724 reachend
6725 */
6726
6727 static void AttributeUnused (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6728 {
6729 if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
6730 {
6731 Unused (stopset0, stopset1, stopset2);
6732 }
6733 }
6734
6735
6736 /*
6737 Unused := ''
6738
6739 first symbols:ldirectivetok
6740
6741 cannot reachend
6742 */
6743
6744 static void Unused (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6745 {
6746 Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6747 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
6748 curisused = FALSE;
6749 checkParameterAttribute ();
6750 Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
6751 }
6752
6753
6754 /*
6755 MultiFPSection := ExtendedFP | FPSection [ ';'
6756 MultiFPSection ]
6757
6758 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
6759
6760 cannot reachend
6761 */
6762
6763 static void MultiFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6764 {
6765 if ((mcLexBuf_currenttoken == mcReserved_lsbratok) || (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok))
6766 {
6767 ExtendedFP (stopset0, stopset1, stopset2);
6768 }
6769 else if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))))) != 0)))
6770 {
6771 /* avoid dangling else. */
6772 FPSection (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
6773 if (mcLexBuf_currenttoken == mcReserved_semicolontok)
6774 {
6775 Expect (mcReserved_semicolontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
6776 MultiFPSection (stopset0, stopset1, stopset2);
6777 }
6778 }
6779 else
6780 {
6781 /* avoid dangling else. */
6782 ErrorArray ((const char *) "expecting one of: identifier VAR ... [", 38);
6783 }
6784 }
6785
6786
6787 /*
6788 FPSection := NonVarFPSection |
6789 VarFPSection
6790
6791 first symbols:vartok, identtok
6792
6793 cannot reachend
6794 */
6795
6796 static void FPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6797 {
6798 if (mcLexBuf_currenttoken == mcReserved_identtok)
6799 {
6800 NonVarFPSection (stopset0, stopset1, stopset2);
6801 }
6802 else if (mcLexBuf_currenttoken == mcReserved_vartok)
6803 {
6804 /* avoid dangling else. */
6805 VarFPSection (stopset0, stopset1, stopset2);
6806 }
6807 else
6808 {
6809 /* avoid dangling else. */
6810 ErrorArray ((const char *) "expecting one of: VAR identifier", 32);
6811 }
6812 }
6813
6814
6815 /*
6816 DefExtendedFP := DefOptArg | '...'
6817 % addParameter (curproc, makeVarargs ()) %
6818
6819
6820 first symbols:lsbratok, periodperiodperiodtok
6821
6822 cannot reachend
6823 */
6824
6825 static void DefExtendedFP (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6826 {
6827 if (mcLexBuf_currenttoken == mcReserved_lsbratok)
6828 {
6829 DefOptArg (stopset0, stopset1, stopset2);
6830 }
6831 else if (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok)
6832 {
6833 /* avoid dangling else. */
6834 Expect (mcReserved_periodperiodperiodtok, stopset0, stopset1, stopset2);
6835 decl_addParameter (curproc, decl_makeVarargs ());
6836 }
6837 else
6838 {
6839 /* avoid dangling else. */
6840 ErrorArray ((const char *) "expecting one of: ... [", 23);
6841 }
6842 }
6843
6844
6845 /*
6846 ExtendedFP := OptArg | '...'
6847
6848 first symbols:lsbratok, periodperiodperiodtok
6849
6850 cannot reachend
6851 */
6852
6853 static void ExtendedFP (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6854 {
6855 if (mcLexBuf_currenttoken == mcReserved_lsbratok)
6856 {
6857 OptArg (stopset0, stopset1, stopset2);
6858 }
6859 else if (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok)
6860 {
6861 /* avoid dangling else. */
6862 Expect (mcReserved_periodperiodperiodtok, stopset0, stopset1, stopset2);
6863 }
6864 else
6865 {
6866 /* avoid dangling else. */
6867 ErrorArray ((const char *) "expecting one of: ... [", 23);
6868 }
6869 }
6870
6871
6872 /*
6873 VarFPSection := 'VAR' PushIdentList
6874 % VAR l, t: node ; %
6875 ':' FormalType
6876 % t := pop () %
6877
6878 % l := pop () %
6879
6880 % curisused := TRUE %
6881 [ AttributeUnused ]
6882 % addVarParameters (curproc, l, t, curisused) %
6883
6884
6885 first symbols:vartok
6886
6887 cannot reachend
6888 */
6889
6890 static void VarFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6891 {
6892 decl_node l;
6893 decl_node t;
6894
6895 Expect (mcReserved_vartok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6896 PushIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
6897 Expect (mcReserved_colontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6898 FormalType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
6899 t = pop ();
6900 l = pop ();
6901 curisused = TRUE;
6902 if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
6903 {
6904 AttributeUnused (stopset0, stopset1, stopset2);
6905 }
6906 decl_addVarParameters (curproc, l, t, curisused);
6907 }
6908
6909
6910 /*
6911 NonVarFPSection := PushIdentList
6912 % VAR l, t: node ; %
6913 ':' FormalType
6914 % t := pop () %
6915
6916 % l := pop () %
6917
6918 % curisused := TRUE %
6919 [ AttributeUnused ]
6920 % addNonVarParameters (curproc, l, t, curisused) %
6921
6922
6923 first symbols:identtok
6924
6925 cannot reachend
6926 */
6927
6928 static void NonVarFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6929 {
6930 decl_node l;
6931 decl_node t;
6932
6933 PushIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
6934 Expect (mcReserved_colontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6935 FormalType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
6936 t = pop ();
6937 l = pop ();
6938 curisused = TRUE;
6939 if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
6940 {
6941 AttributeUnused (stopset0, stopset1, stopset2);
6942 }
6943 decl_addNonVarParameters (curproc, l, t, curisused);
6944 }
6945
6946
6947 /*
6948 OptArg :=
6949 % VAR p, init, type: node ; id: Name ; %
6950 '[' Ident
6951 % id := curident %
6952 ':' FormalType
6953 % type := pop () %
6954
6955 % init := NIL %
6956 [ '=' ConstExpression
6957 % init := pop () %
6958 ] ']'
6959 % p := addOptParameter (curproc, id, type, init) %
6960
6961
6962 first symbols:lsbratok
6963
6964 cannot reachend
6965 */
6966
6967 static void OptArg (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
6968 {
6969 decl_node p;
6970 decl_node init;
6971 decl_node type;
6972 nameKey_Name id;
6973
6974 Expect (mcReserved_lsbratok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6975 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
6976 id = curident;
6977 Expect (mcReserved_colontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
6978 FormalType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_equaltok-mcReserved_eoftok)) | (1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
6979 type = pop ();
6980 init = static_cast<decl_node> (NULL);
6981 if (mcLexBuf_currenttoken == mcReserved_equaltok)
6982 {
6983 Expect (mcReserved_equaltok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
6984 ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
6985 init = pop ();
6986 }
6987 Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
6988 p = decl_addOptParameter (curproc, id, type, init);
6989 }
6990
6991
6992 /*
6993 DefOptArg :=
6994 % VAR p, init, type: node ; id: Name ; %
6995 '[' Ident
6996 % id := curident %
6997 ':' FormalType
6998 % type := pop () %
6999 '=' ConstExpression
7000 % init := pop () %
7001 ']'
7002 % p := addOptParameter (curproc, id, type, init) %
7003
7004
7005 first symbols:lsbratok
7006
7007 cannot reachend
7008 */
7009
7010 static void DefOptArg (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7011 {
7012 decl_node p;
7013 decl_node init;
7014 decl_node type;
7015 nameKey_Name id;
7016
7017 Expect (mcReserved_lsbratok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7018 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
7019 id = curident;
7020 Expect (mcReserved_colontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7021 FormalType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_equaltok-mcReserved_eoftok))), stopset1, stopset2);
7022 type = pop ();
7023 Expect (mcReserved_equaltok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
7024 ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
7025 init = pop ();
7026 Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
7027 p = decl_addOptParameter (curproc, id, type, init);
7028 }
7029
7030
7031 /*
7032 FormalType :=
7033 % VAR c: CARDINAL ; %
7034
7035 % VAR n, a, s: node ; %
7036
7037 % c := 0 %
7038 { 'ARRAY' 'OF'
7039 % INC (c) %
7040 } PushQualident
7041 % pushNunbounded (c) %
7042
7043
7044 first symbols:identtok, arraytok
7045
7046 cannot reachend
7047 */
7048
7049 static void FormalType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7050 {
7051 unsigned int c;
7052 decl_node n;
7053 decl_node a;
7054 decl_node s;
7055
7056 c = 0;
7057 while (mcLexBuf_currenttoken == mcReserved_arraytok)
7058 {
7059 Expect (mcReserved_arraytok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
7060 Expect (mcReserved_oftok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7061 c += 1;
7062 }
7063 /* while */
7064 PushQualident (stopset0, stopset1, stopset2);
7065 pushNunbounded (c);
7066 }
7067
7068
7069 /*
7070 ModuleDeclaration := 'MODULE' Ident [ Priority ]
7071 ';' { Import } [ Export ]
7072 Block Ident
7073
7074 first symbols:moduletok
7075
7076 cannot reachend
7077 */
7078
7079 static void ModuleDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7080 {
7081 Expect (mcReserved_moduletok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7082 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
7083 if (mcLexBuf_currenttoken == mcReserved_lsbratok)
7084 {
7085 Priority (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7086 }
7087 Expect (mcReserved_semicolontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_importtok-mcReserved_arraytok)) | (1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_exporttok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
7088 while (((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_importtok-mcReserved_arraytok))))) != 0)))
7089 {
7090 Import (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok)) | (1 << (mcReserved_exporttok-mcReserved_arraytok)) | (1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_importtok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_typetok-mcReserved_recordtok))));
7091 }
7092 /* while */
7093 if (mcLexBuf_currenttoken == mcReserved_exporttok)
7094 {
7095 Export (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_begintok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok)) | (1 << (mcReserved_moduletok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_typetok-mcReserved_recordtok))));
7096 }
7097 Block (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7098 Ident (stopset0, stopset1, stopset2);
7099 }
7100
7101
7102 /*
7103 Priority := '[' ConstExpressionNop ']'
7104
7105 first symbols:lsbratok
7106
7107 cannot reachend
7108 */
7109
7110 static void Priority (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7111 {
7112 Expect (mcReserved_lsbratok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_stringtok-mcReserved_recordtok))));
7113 ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
7114 Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
7115 }
7116
7117
7118 /*
7119 Export := 'EXPORT' ( 'QUALIFIED' IdentList |
7120 'UNQUALIFIED' IdentList |
7121 IdentList ) ';'
7122
7123 first symbols:exporttok
7124
7125 cannot reachend
7126 */
7127
7128 static void Export (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7129 {
7130 Expect (mcReserved_exporttok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_qualifiedtok-mcReserved_arraytok)) | (1 << (mcReserved_unqualifiedtok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7131 if (mcLexBuf_currenttoken == mcReserved_qualifiedtok)
7132 {
7133 Expect (mcReserved_qualifiedtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7134 IdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7135 }
7136 else if (mcLexBuf_currenttoken == mcReserved_unqualifiedtok)
7137 {
7138 /* avoid dangling else. */
7139 Expect (mcReserved_unqualifiedtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7140 IdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7141 }
7142 else if (mcLexBuf_currenttoken == mcReserved_identtok)
7143 {
7144 /* avoid dangling else. */
7145 IdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7146 }
7147 else
7148 {
7149 /* avoid dangling else. */
7150 ErrorArray ((const char *) "expecting one of: identifier UNQUALIFIED QUALIFIED", 50);
7151 }
7152 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
7153 }
7154
7155
7156 /*
7157 FromIdentList := Ident
7158 % importInto (frommodule, curident, curmodule) %
7159 { ',' Ident
7160 % importInto (frommodule, curident, curmodule) %
7161 }
7162
7163 first symbols:identtok
7164
7165 cannot reachend
7166 */
7167
7168 static void FromIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7169 {
7170 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7171 importInto (frommodule, curident, curmodule);
7172 while (mcLexBuf_currenttoken == mcReserved_commatok)
7173 {
7174 Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7175 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7176 importInto (frommodule, curident, curmodule);
7177 }
7178 /* while */
7179 }
7180
7181
7182 /*
7183 FromImport := 'FROM' Ident
7184 % frommodule := lookupDef (curident) %
7185 'IMPORT' FromIdentList ';'
7186
7187 first symbols:fromtok
7188
7189 cannot reachend
7190 */
7191
7192 static void FromImport (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7193 {
7194 Expect (mcReserved_fromtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7195 Ident (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_importtok-mcReserved_arraytok))), stopset2);
7196 frommodule = decl_lookupDef (curident);
7197 Expect (mcReserved_importtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7198 FromIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7199 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
7200 }
7201
7202
7203 /*
7204 ImportModuleList := Ident { ',' Ident }
7205
7206 first symbols:identtok
7207
7208 cannot reachend
7209 */
7210
7211 static void ImportModuleList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7212 {
7213 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7214 while (mcLexBuf_currenttoken == mcReserved_commatok)
7215 {
7216 Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7217 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7218 }
7219 /* while */
7220 }
7221
7222
7223 /*
7224 WithoutFromImport := 'IMPORT' ImportModuleList ';'
7225
7226 first symbols:importtok
7227
7228 cannot reachend
7229 */
7230
7231 static void WithoutFromImport (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7232 {
7233 Expect (mcReserved_importtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7234 ImportModuleList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7235 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
7236 }
7237
7238
7239 /*
7240 Import := FromImport | WithoutFromImport
7241
7242 first symbols:importtok, fromtok
7243
7244 cannot reachend
7245 */
7246
7247 static void Import (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7248 {
7249 if (mcLexBuf_currenttoken == mcReserved_fromtok)
7250 {
7251 FromImport (stopset0, stopset1, stopset2);
7252 }
7253 else if (mcLexBuf_currenttoken == mcReserved_importtok)
7254 {
7255 /* avoid dangling else. */
7256 WithoutFromImport (stopset0, stopset1, stopset2);
7257 }
7258 else
7259 {
7260 /* avoid dangling else. */
7261 ErrorArray ((const char *) "expecting one of: IMPORT FROM", 29);
7262 }
7263 }
7264
7265
7266 /*
7267 DefinitionModule := 'DEFINITION' 'MODULE' [ 'FOR'
7268 string ]
7269 Ident ';'
7270 % curmodule := lookupDef (curident) %
7271
7272 % enterScope (curmodule) %
7273
7274 % resetEnumPos (curmodule) %
7275 { Import } [ Export ] { Definition }
7276 'END' Ident '.'
7277 % checkEndName (curmodule, curident, 'definition module') %
7278
7279 % setConstExpComplete (curmodule) %
7280
7281 % leaveScope %
7282
7283
7284 first symbols:definitiontok
7285
7286 cannot reachend
7287 */
7288
7289 static void DefinitionModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7290 {
7291 Expect (mcReserved_definitiontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2);
7292 Expect (mcReserved_moduletok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7293 if (mcLexBuf_currenttoken == mcReserved_fortok)
7294 {
7295 Expect (mcReserved_fortok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
7296 string (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7297 }
7298 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7299 Expect (mcReserved_semicolontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_importtok-mcReserved_arraytok)) | (1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_exporttok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_vartok-mcReserved_recordtok)) | (1 << (mcReserved_typetok-mcReserved_recordtok))));
7300 curmodule = decl_lookupDef (curident);
7301 decl_enterScope (curmodule);
7302 decl_resetEnumPos (curmodule);
7303 while (((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_importtok-mcReserved_arraytok))))) != 0)))
7304 {
7305 Import (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_exporttok-mcReserved_arraytok)) | (1 << (mcReserved_fromtok-mcReserved_arraytok)) | (1 << (mcReserved_importtok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
7306 }
7307 /* while */
7308 if (mcLexBuf_currenttoken == mcReserved_exporttok)
7309 {
7310 Export (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
7311 }
7312 while ((((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok))))) != 0))) || ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))))) != 0))))
7313 {
7314 Definition (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_consttok-mcReserved_arraytok)) | (1 << (mcReserved_proceduretok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_typetok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))));
7315 }
7316 /* while */
7317 Expect (mcReserved_endtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7318 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
7319 Expect (mcReserved_periodtok, stopset0, stopset1, stopset2);
7320 checkEndName (curmodule, curident, (const char *) "definition module", 17);
7321 decl_setConstExpComplete (curmodule);
7322 decl_leaveScope ();
7323 }
7324
7325
7326 /*
7327 PushQualident := Ident
7328 % typeExp := push (lookupSym (curident)) %
7329
7330 % IF typeExp = NIL
7331 THEN
7332 metaError1 ('the symbol {%1k} is not visible in this scope (or any other nested scope)', curident)
7333 END %
7334 [ '.'
7335 % IF NOT isDef (typeExp)
7336 THEN
7337 ErrorArray ('the first component of this qualident must be a definition module')
7338 END %
7339 Ident
7340 % typeExp := replace (lookupInScope (typeExp, curident)) ;
7341 IF typeExp=NIL
7342 THEN
7343 ErrorArray ('identifier not found in definition module')
7344 END %
7345 ]
7346
7347 first symbols:identtok
7348
7349 cannot reachend
7350 */
7351
7352 static void PushQualident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7353 {
7354 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
7355 typeExp = push (decl_lookupSym (curident));
7356 if (typeExp == NULL)
7357 {
7358 mcMetaError_metaError1 ((const char *) "the symbol {%1k} is not visible in this scope (or any other nested scope)", 73, (const unsigned char *) &curident, (sizeof (curident)-1));
7359 }
7360 if (mcLexBuf_currenttoken == mcReserved_periodtok)
7361 {
7362 Expect (mcReserved_periodtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7363 if (! (decl_isDef (typeExp)))
7364 {
7365 ErrorArray ((const char *) "the first component of this qualident must be a definition module", 65);
7366 }
7367 Ident (stopset0, stopset1, stopset2);
7368 typeExp = replace (decl_lookupInScope (typeExp, curident));
7369 if (typeExp == NULL)
7370 {
7371 ErrorArray ((const char *) "identifier not found in definition module", 41);
7372 }
7373 }
7374 }
7375
7376
7377 /*
7378 OptSubrange := [ SubrangeType
7379 % VAR q, s: node ; %
7380
7381 % s := pop () %
7382
7383 % q := pop () %
7384
7385 % putSubrangeType (s, q) %
7386
7387 % typeExp := push (s) %
7388 ]
7389
7390 first symbols:lsbratok
7391
7392 reachend
7393 */
7394
7395 static void OptSubrange (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7396 {
7397 decl_node q;
7398 decl_node s;
7399
7400 if (mcLexBuf_currenttoken == mcReserved_lsbratok)
7401 {
7402 SubrangeType (stopset0, stopset1, stopset2);
7403 s = pop ();
7404 q = pop ();
7405 decl_putSubrangeType (s, q);
7406 typeExp = push (s);
7407 }
7408 }
7409
7410
7411 /*
7412 TypeEquiv := PushQualident OptSubrange
7413
7414 first symbols:identtok
7415
7416 cannot reachend
7417 */
7418
7419 static void TypeEquiv (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7420 {
7421 PushQualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
7422 OptSubrange (stopset0, stopset1, stopset2);
7423 }
7424
7425
7426 /*
7427 EnumIdentList :=
7428 % VAR f: node ; %
7429
7430 % typeExp := push (makeEnum ()) %
7431 Ident
7432 % f := makeEnumField (typeExp, curident) %
7433 { ',' Ident
7434 % f := makeEnumField (typeExp, curident) %
7435 }
7436
7437 first symbols:identtok
7438
7439 cannot reachend
7440 */
7441
7442 static void EnumIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7443 {
7444 decl_node f;
7445
7446 typeExp = push (decl_makeEnum ());
7447 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7448 f = decl_makeEnumField (typeExp, curident);
7449 while (mcLexBuf_currenttoken == mcReserved_commatok)
7450 {
7451 Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7452 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7453 f = decl_makeEnumField (typeExp, curident);
7454 }
7455 /* while */
7456 }
7457
7458
7459 /*
7460 Enumeration := '(' EnumIdentList ')'
7461
7462 first symbols:lparatok
7463
7464 cannot reachend
7465 */
7466
7467 static void Enumeration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7468 {
7469 Expect (mcReserved_lparatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7470 EnumIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
7471 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
7472 }
7473
7474
7475 /*
7476 SimpleType :=
7477 % VAR d: CARDINAL ; %
7478
7479 % d := depth () %
7480 ( TypeEquiv | Enumeration |
7481 SubrangeType )
7482 % assert (d = depth () - 1) %
7483
7484
7485 first symbols:lsbratok, lparatok, identtok
7486
7487 cannot reachend
7488 */
7489
7490 static void SimpleType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7491 {
7492 unsigned int d;
7493
7494 d = depth ();
7495 if (mcLexBuf_currenttoken == mcReserved_identtok)
7496 {
7497 TypeEquiv (stopset0, stopset1, stopset2);
7498 }
7499 else if (mcLexBuf_currenttoken == mcReserved_lparatok)
7500 {
7501 /* avoid dangling else. */
7502 Enumeration (stopset0, stopset1, stopset2);
7503 }
7504 else if (mcLexBuf_currenttoken == mcReserved_lsbratok)
7505 {
7506 /* avoid dangling else. */
7507 SubrangeType (stopset0, stopset1, stopset2);
7508 }
7509 else
7510 {
7511 /* avoid dangling else. */
7512 ErrorArray ((const char *) "expecting one of: [ ( identifier", 32);
7513 }
7514 mcDebug_assert (d == ((depth ())-1));
7515 }
7516
7517
7518 /*
7519 Type := SimpleType | ArrayType | RecordType |
7520 SetType | PointerType | ProcedureType
7521
7522 first symbols:proceduretok, pointertok, settok, packedsettok, oftok, recordtok, arraytok, identtok, lparatok, lsbratok
7523
7524 cannot reachend
7525 */
7526
7527 static void Type (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7528 {
7529 if (((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_identtok))
7530 {
7531 SimpleType (stopset0, stopset1, stopset2);
7532 }
7533 else if (mcLexBuf_currenttoken == mcReserved_arraytok)
7534 {
7535 /* avoid dangling else. */
7536 ArrayType (stopset0, stopset1, stopset2);
7537 }
7538 else if (mcLexBuf_currenttoken == mcReserved_recordtok)
7539 {
7540 /* avoid dangling else. */
7541 RecordType (stopset0, stopset1, stopset2);
7542 }
7543 else if ((((mcLexBuf_currenttoken >= mcReserved_arraytok) && (mcLexBuf_currenttoken < mcReserved_recordtok)) && ((((1 << (mcLexBuf_currenttoken-mcReserved_arraytok)) & ((mcp3_SetOfStop1) ((1 << (mcReserved_packedsettok-mcReserved_arraytok)) | (1 << (mcReserved_oftok-mcReserved_arraytok))))) != 0))) || (mcLexBuf_currenttoken == mcReserved_settok))
7544 {
7545 /* avoid dangling else. */
7546 SetType (stopset0, stopset1, stopset2);
7547 }
7548 else if (mcLexBuf_currenttoken == mcReserved_pointertok)
7549 {
7550 /* avoid dangling else. */
7551 PointerType (stopset0, stopset1, stopset2);
7552 }
7553 else if (mcLexBuf_currenttoken == mcReserved_proceduretok)
7554 {
7555 /* avoid dangling else. */
7556 ProcedureType (stopset0, stopset1, stopset2);
7557 }
7558 else
7559 {
7560 /* avoid dangling else. */
7561 ErrorArray ((const char *) "expecting one of: PROCEDURE POINTER SET PACKEDSET OF RECORD ARRAY identifier ( [", 80);
7562 }
7563 }
7564
7565
7566 /*
7567 TypeDeclaration := { Ident
7568 % typeDes := lookupSym (curident) %
7569 ( ';' | '=' Type
7570 % putType (typeDes, pop ()) %
7571 Alignment ';' ) }
7572
7573 first symbols:identtok
7574
7575 reachend
7576 */
7577
7578 static void TypeDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7579 {
7580 while (mcLexBuf_currenttoken == mcReserved_identtok)
7581 {
7582 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok)) | (1 << (mcReserved_equaltok-mcReserved_eoftok))), stopset1, stopset2);
7583 typeDes = decl_lookupSym (curident);
7584 if (mcLexBuf_currenttoken == mcReserved_semicolontok)
7585 {
7586 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7587 }
7588 else if (mcLexBuf_currenttoken == mcReserved_equaltok)
7589 {
7590 /* avoid dangling else. */
7591 Expect (mcReserved_equaltok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_proceduretok-mcReserved_arraytok)) | (1 << (mcReserved_pointertok-mcReserved_arraytok)) | (1 << (mcReserved_packedsettok-mcReserved_arraytok)) | (1 << (mcReserved_oftok-mcReserved_arraytok)) | (1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_settok-mcReserved_recordtok)) | (1 << (mcReserved_recordtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
7592 Type (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok)) | (1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7593 decl_putType (typeDes, pop ());
7594 Alignment (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7595 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7596 }
7597 else
7598 {
7599 /* avoid dangling else. */
7600 ErrorArray ((const char *) "expecting one of: = ;", 21);
7601 }
7602 }
7603 /* while */
7604 }
7605
7606
7607 /*
7608 Definition := 'CONST' { ConstantDeclaration ';' } |
7609 'TYPE' { TypeDeclaration } |
7610 'VAR' { VariableDeclaration ';' } |
7611 DefProcedureHeading ';'
7612
7613 first symbols:proceduretok, vartok, typetok, consttok
7614
7615 cannot reachend
7616 */
7617
7618 static void Definition (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7619 {
7620 if (mcLexBuf_currenttoken == mcReserved_consttok)
7621 {
7622 Expect (mcReserved_consttok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7623 while (mcLexBuf_currenttoken == mcReserved_identtok)
7624 {
7625 ConstantDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7626 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7627 }
7628 /* while */
7629 }
7630 else if (mcLexBuf_currenttoken == mcReserved_typetok)
7631 {
7632 /* avoid dangling else. */
7633 Expect (mcReserved_typetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7634 while (mcLexBuf_currenttoken == mcReserved_identtok)
7635 {
7636 TypeDeclaration (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7637 }
7638 /* while */
7639 }
7640 else if (mcLexBuf_currenttoken == mcReserved_vartok)
7641 {
7642 /* avoid dangling else. */
7643 Expect (mcReserved_vartok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7644 while (mcLexBuf_currenttoken == mcReserved_identtok)
7645 {
7646 VariableDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7647 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7648 }
7649 /* while */
7650 }
7651 else if (mcLexBuf_currenttoken == mcReserved_proceduretok)
7652 {
7653 /* avoid dangling else. */
7654 DefProcedureHeading (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
7655 Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
7656 }
7657 else
7658 {
7659 /* avoid dangling else. */
7660 ErrorArray ((const char *) "expecting one of: PROCEDURE VAR TYPE CONST", 42);
7661 }
7662 }
7663
7664
7665 /*
7666 AsmStatement := 'ASM' [ 'VOLATILE' ] '(' AsmOperands
7667 ')'
7668
7669 first symbols:asmtok
7670
7671 cannot reachend
7672 */
7673
7674 static void AsmStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7675 {
7676 Expect (mcReserved_asmtok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_volatiletok-mcReserved_recordtok))));
7677 if (mcLexBuf_currenttoken == mcReserved_volatiletok)
7678 {
7679 Expect (mcReserved_volatiletok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
7680 }
7681 Expect (mcReserved_lparatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
7682 AsmOperands (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
7683 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
7684 }
7685
7686
7687 /*
7688 AsmOperands := string [ AsmOperandSpec ]
7689
7690 first symbols:stringtok
7691
7692 cannot reachend
7693 */
7694
7695 static void AsmOperands (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7696 {
7697 string (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
7698 if (mcLexBuf_currenttoken == mcReserved_colontok)
7699 {
7700 AsmOperandSpec (stopset0, stopset1, stopset2);
7701 }
7702 }
7703
7704
7705 /*
7706 AsmOperandSpec := [ ':' AsmList [ ':' AsmList [
7707 ':' TrashList ] ] ]
7708
7709 first symbols:colontok
7710
7711 reachend
7712 */
7713
7714 static void AsmOperandSpec (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7715 {
7716 if (mcLexBuf_currenttoken == mcReserved_colontok)
7717 {
7718 Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok)) | (1 << (mcReserved_commatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
7719 AsmList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
7720 if (mcLexBuf_currenttoken == mcReserved_colontok)
7721 {
7722 Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok)) | (1 << (mcReserved_commatok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
7723 AsmList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
7724 if (mcLexBuf_currenttoken == mcReserved_colontok)
7725 {
7726 Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
7727 TrashList (stopset0, stopset1, stopset2);
7728 }
7729 }
7730 }
7731 }
7732
7733
7734 /*
7735 AsmList := [ AsmElement ] { ',' AsmElement }
7736
7737 first symbols:lsbratok, stringtok, commatok
7738
7739 reachend
7740 */
7741
7742 static void AsmList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7743 {
7744 if ((mcLexBuf_currenttoken == mcReserved_lsbratok) || (mcLexBuf_currenttoken == mcReserved_stringtok))
7745 {
7746 AsmElement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7747 }
7748 while (mcLexBuf_currenttoken == mcReserved_commatok)
7749 {
7750 Expect (mcReserved_commatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
7751 AsmElement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7752 }
7753 /* while */
7754 }
7755
7756
7757 /*
7758 NamedOperand := '[' Ident ']'
7759
7760 first symbols:lsbratok
7761
7762 cannot reachend
7763 */
7764
7765 static void NamedOperand (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7766 {
7767 Expect (mcReserved_lsbratok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
7768 Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
7769 Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
7770 }
7771
7772
7773 /*
7774 AsmOperandName := [ NamedOperand ]
7775
7776 first symbols:lsbratok
7777
7778 reachend
7779 */
7780
7781 static void AsmOperandName (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7782 {
7783 if (mcLexBuf_currenttoken == mcReserved_lsbratok)
7784 {
7785 NamedOperand (stopset0, stopset1, stopset2);
7786 }
7787 }
7788
7789
7790 /*
7791 AsmElement := AsmOperandName string '(' Expression
7792 ')'
7793
7794 first symbols:stringtok, lsbratok
7795
7796 cannot reachend
7797 */
7798
7799 static void AsmElement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7800 {
7801 AsmOperandName (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
7802 string (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
7803 Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_nottok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok)) | (1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
7804 Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
7805 Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
7806 }
7807
7808
7809 /*
7810 TrashList := [ string ] { ',' string }
7811
7812 first symbols:commatok, stringtok
7813
7814 reachend
7815 */
7816
7817 static void TrashList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
7818 {
7819 if (mcLexBuf_currenttoken == mcReserved_stringtok)
7820 {
7821 string (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7822 }
7823 while (mcLexBuf_currenttoken == mcReserved_commatok)
7824 {
7825 Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
7826 string (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
7827 }
7828 /* while */
7829 }
7830
7831
7832 /*
7833 CompilationUnit - returns TRUE if the input was correct enough to parse
7834 in future passes.
7835 */
7836
7837 extern "C" unsigned int mcp3_CompilationUnit (void)
7838 {
7839 stk = mcStack_init ();
7840 WasNoError = TRUE;
7841 FileUnit ((mcp3_SetOfStop0) ((1 << (mcReserved_eoftok-mcReserved_eoftok))), (mcp3_SetOfStop1) 0, (mcp3_SetOfStop2) 0);
7842 mcStack_kill (&stk);
7843 return WasNoError;
7844 /* static analysis guarentees a RETURN statement will be used before here. */
7845 __builtin_unreachable ();
7846 }
7847
7848 extern "C" void _M2_mcp3_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
7849 {
7850 }
7851
7852 extern "C" void _M2_mcp3_finish (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
7853 {
7854 }