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