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