1 /* do not edit automatically generated by mc from mcp3. */
2 /* output from mc-3.bnf, automatically generated do not edit.
4 Copyright (C) 2015-2022 Free Software Foundation, Inc.
5 Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
7 This file is part of GNU Modula-2.
9 GNU Modula-2 is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 GNU Modula-2 is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GNU Modula-2; see the file COPYING. If not,
21 see <https://www.gnu.org/licenses/>. */
25 # if !defined (PROC_D)
27 typedef void (*PROC_t
) (void);
28 typedef struct { PROC_t proc
; } PROC
;
39 #if defined(__cplusplus)
46 # include "GDynamicStrings.h"
47 # include "GmcError.h"
48 # include "GnameKey.h"
49 # include "GmcPrintf.h"
50 # include "GmcDebug.h"
51 # include "GmcReserved.h"
52 # include "GmcMetaError.h"
53 # include "GmcStack.h"
54 # include "GmcLexBuf.h"
58 # define Debugging FALSE
59 typedef unsigned int mcp3_stop0
;
61 typedef unsigned int mcp3_SetOfStop0
;
63 typedef unsigned int mcp3_stop1
;
65 typedef unsigned int mcp3_SetOfStop1
;
67 typedef unsigned int mcp3_stop2
;
69 typedef unsigned int mcp3_SetOfStop2
;
71 static unsigned int WasNoError
;
72 static unsigned int curisused
;
73 static nameKey_Name curstring
;
74 static nameKey_Name curident
;
75 static decl_node curproc
;
76 static decl_node frommodule
;
77 static decl_node typeDes
;
78 static decl_node typeExp
;
79 static decl_node curmodule
;
80 static mcStack_stack stk
;
83 CompilationUnit - returns TRUE if the input was correct enough to parse
87 extern "C" unsigned int mcp3_CompilationUnit (void);
93 static decl_node
push (decl_node n
);
99 static decl_node
pop (void);
105 static decl_node
replace (decl_node n
);
108 peep - returns the top node on the stack without removing it.
111 static decl_node
peep (void);
114 depth - returns the depth of the stack.
117 static unsigned int depth (void);
123 static void checkDuplicate (unsigned int b
);
129 static void ErrorString (DynamicStrings_String s
);
135 static void ErrorArray (const char *a_
, unsigned int _a_high
);
138 checkParameterAttribute -
141 static void checkParameterAttribute (void);
144 checkReturnAttribute -
147 static void checkReturnAttribute (void);
153 static void pushNunbounded (unsigned int c
);
156 makeIndexedArray - builds and returns an array of type, t, with, c, indices.
159 static decl_node
makeIndexedArray (unsigned int c
, decl_node t
);
162 importInto - from, m, import, name, into module, current.
163 It checks to see if curident is an enumeration type
164 and if so automatically includes all enumeration fields
168 static void importInto (decl_node m
, nameKey_Name name
, decl_node current
);
171 checkEndName - if module does not have, name, then issue an error containing, desc.
174 static void checkEndName (decl_node module
, nameKey_Name name
, const char *desc_
, unsigned int _desc_high
);
177 DescribeStop - issues a message explaining what tokens were expected
180 static DynamicStrings_String
DescribeStop (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
183 DescribeError - issues a message explaining what tokens were expected
186 static void DescribeError (void);
189 SyntaxError - after a syntax error we skip all tokens up until we reach
193 static void SyntaxError (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
199 static void SyntaxCheck (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
202 WarnMissingToken - generates a warning message about a missing token, t.
205 static void WarnMissingToken (mcReserved_toktype t
);
208 MissingToken - generates a warning message about a missing token, t.
211 static void MissingToken (mcReserved_toktype t
);
217 static unsigned int CheckAndInsert (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
223 static unsigned int InStopSet (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
226 PeepToken - peep token checks to see whether the stopset is satisfied by currenttoken
227 If it is not then it will insert a token providing the token
228 is one of ; ] ) } . OF END ,
230 if the stopset contains <identtok> then we do not insert a token
233 static void PeepToken (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
239 static void Expect (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
242 Ident - error checking varient of Ident
245 static void Ident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
251 static void string (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
257 static void Integer (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
263 static void Real (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
266 FileUnit := DefinitionModule |
267 ImplementationOrProgramModule
269 first symbols:implementationtok, moduletok, definitiontok
274 static void FileUnit (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
277 ProgramModule := 'MODULE' Ident
278 % curmodule := lookupModule (curident) %
280 % enterScope (curmodule) %
282 % resetEnumPos (curmodule) %
283 [ Priority ] ';' { Import } Block
285 % checkEndName (curmodule, curident, 'program module') %
287 % setConstExpComplete (curmodule) %
292 first symbols:moduletok
297 static void ProgramModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
300 ImplementationModule := 'IMPLEMENTATION' 'MODULE'
302 % curmodule := lookupImp (curident) %
304 % enterScope (lookupDef (curident)) %
306 % enterScope (curmodule) %
308 % resetEnumPos (curmodule) %
309 [ Priority ] ';' { Import }
311 % checkEndName (curmodule, curident, 'implementation module') %
313 % setConstExpComplete (curmodule) %
315 % leaveScope ; leaveScope %
318 first symbols:implementationtok
323 static void ImplementationModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
326 ImplementationOrProgramModule := ImplementationModule |
329 first symbols:moduletok, implementationtok
334 static void ImplementationOrProgramModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
337 Number := Integer | Real
339 first symbols:realtok, integertok
344 static void Number (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
347 Qualident := Ident { '.' Ident }
349 first symbols:identtok
354 static void Qualident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
357 ConstantDeclaration :=
360 % d := lookupSym (curident) %
364 % assert (isConst (d)) %
369 first symbols:identtok
374 static void ConstantDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
377 ConstExpressionNop := SimpleConstExpr
379 [ Relation SimpleConstExpr ]
381 % n := makeConstExp () %
384 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
389 static void ConstExpressionNop (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
395 % n := push (makeConstExp ()) %
396 SimpleConstExpr [ Relation SimpleConstExpr ]
398 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
403 static void ConstExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
406 Relation := '=' | '#' | '<>' | '<' | '<=' |
409 first symbols:intok, greaterequaltok, greatertok, lessequaltok, lesstok, lessgreatertok, hashtok, equaltok
414 static void Relation (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
417 SimpleConstExpr := UnaryOrConstTerm { AddOperator
420 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
425 static void SimpleConstExpr (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
428 UnaryOrConstTerm := '+' ConstTerm |
432 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
437 static void UnaryOrConstTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
440 AddOperator := '+' | '-' | 'OR'
442 first symbols:ortok, minustok, plustok
447 static void AddOperator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
450 ConstTerm := ConstFactor { MulOperator ConstFactor }
452 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok
457 static void ConstTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
460 MulOperator := '*' | '/' | 'DIV' | 'MOD' |
463 first symbols:ambersandtok, andtok, remtok, modtok, divtok, dividetok, timestok
468 static void MulOperator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
471 ConstFactor := Number | ConstString |
472 ConstSetOrQualidentOrFunction |
473 '(' ConstExpressionNop ')' |
477 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok
482 static void ConstFactor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
485 ConstString := string
487 first symbols:stringtok
492 static void ConstString (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
495 ComponentElement := ConstExpressionNop [ '..' ConstExpressionNop ]
497 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
502 static void ComponentElement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
505 ComponentValue := ComponentElement [ 'BY' ConstExpressionNop ]
507 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
512 static void ComponentValue (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
515 ArraySetRecordValue := ComponentValue { ',' ComponentValue }
517 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
522 static void ArraySetRecordValue (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
525 Constructor := '{' [ ArraySetRecordValue ] '}'
527 first symbols:lcbratok
532 static void Constructor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
535 ConstSetOrQualidentOrFunction := Qualident [ Constructor |
536 ConstActualParameters ] |
539 first symbols:lcbratok, identtok
544 static void ConstSetOrQualidentOrFunction (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
547 ConstActualParameters := '(' [ ConstExpList ] ')'
549 first symbols:lparatok
554 static void ConstActualParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
557 ConstExpList := ConstExpressionNop { ',' ConstExpressionNop }
559 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
564 static void ConstExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
567 ConstAttribute := '__ATTRIBUTE__' '__BUILTIN__'
568 '(' '(' ConstAttributeExpression
571 first symbols:attributetok
576 static void ConstAttribute (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
579 ConstAttributeExpression := Ident | '<' Qualident
582 first symbols:lesstok, identtok
587 static void ConstAttributeExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
592 first symbols:ldirectivetok
597 static void ByteAlignment (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
600 OptAlignmentExpression := [ AlignmentExpression ]
602 first symbols:lparatok
607 static void OptAlignmentExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
610 AlignmentExpression := '(' ConstExpressionNop ')'
612 first symbols:lparatok
617 static void AlignmentExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
620 Alignment := [ ByteAlignment ]
622 first symbols:ldirectivetok
627 static void Alignment (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
630 IdentList := Ident { ',' Ident }
632 first symbols:identtok
637 static void IdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
643 % n := makeIdentList () %
645 % checkDuplicate (putIdent (n, curident)) %
647 % checkDuplicate (putIdent (n, curident)) %
652 first symbols:identtok
657 static void PushIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
661 % VAR low, high: node ; d: CARDINAL ; %
667 % assert (d = depth ()) %
671 % assert (d = depth ()) %
673 % typeExp := push (makeSubrange (low, high)) %
675 % assert (d = depth () - 1) %
678 first symbols:lsbratok
683 static void SubrangeType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
687 % VAR c: CARDINAL ; t, n: node ; %
695 % n := push (makeIndexedArray (c, pop ())) %
698 first symbols:arraytok
703 static void ArrayType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
706 RecordType := 'RECORD'
709 % n := push (makeRecord ()) %
711 % n := push (NIL) no varient %
712 [ DefaultRecordAttributes ] FieldListSequence
714 % assert (pop ()=NIL) %
717 first symbols:recordtok
722 static void RecordType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
725 DefaultRecordAttributes := ''
727 first symbols:ldirectivetok
732 static void DefaultRecordAttributes (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
735 RecordFieldPragma := [ '' ]
737 first symbols:ldirectivetok
742 static void RecordFieldPragma (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
745 FieldPragmaExpression := Ident PragmaConstExpression
747 first symbols:identtok
752 static void FieldPragmaExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
755 PragmaConstExpression := [ '(' ConstExpressionNop
758 first symbols:lparatok
763 static void PragmaConstExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
766 AttributeExpression := Ident '(' ConstExpressionNop
769 first symbols:identtok
774 static void AttributeExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
777 FieldListSequence := FieldListStatement { ';' FieldListStatement }
779 first symbols:casetok, identtok, semicolontok
784 static void FieldListSequence (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
787 FieldListStatement := [ FieldList ]
789 first symbols:identtok, casetok
794 static void FieldListStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
798 % VAR r, i, f, t, n, v, w: node ; d: CARDINAL ; %
802 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
804 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
808 % assert (d=depth ()) %
810 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isVarientField (r))) %
812 % assert (d=depth () - 1) %
816 % assert (d=depth () - 1) %
820 % assert (d=depth ()) %
822 % r := addFieldsToRecord (r, v, i, t) %
824 % assert (d=depth ()) %
831 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
833 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
837 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isRecordField (r))) %
839 % w := push (makeVarient (r)) %
841 % assert (d = depth () - 1) %
845 % assert (d = depth () - 1) %
847 % assert (d = depth () - 1) %
849 % assert (d = depth () - 1) %
851 % w := peep () ; assert (isVarient (w)) %
853 % assert (d = depth () - 1) %
854 [ 'ELSE' FieldListSequence ] 'END'
856 % w := pop () ; assert (isVarient (w)) %
858 % assert (d=depth ()) %
861 first symbols:casetok, identtok
866 static void FieldList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
870 % curident := NulName %
873 first symbols:identtok
878 static void TagIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
882 % VAR tagident: Name ; q, v, w, r: node ; %
884 % w := pop () ; v := pop () ; r := peep () ; v := push (v) ; w := push (w) %
886 % assert (isVarient (w)) %
888 % assert ((v=NIL) OR isVarient (v)) %
890 % assert (isRecord (r) OR isVarientField (r)) %
892 % assert (isVarient (push (pop ()))) %
894 % tagident := curident %
898 % assert (isVarient (push (pop ()))) %
902 % buildVarientSelector (r, w, tagident, q) %
905 first symbols:colontok, identtok
910 static void CaseTag (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
914 % VAR p, r, v, f: node ; d: CARDINAL ; %
918 % assert (isVarient (peep ())) %
920 % v := pop () ; assert (isVarient (v)) %
928 % f := push (buildVarientFieldRecord (v, p)) %
931 VarientCaseLabelList ':' FieldListSequence
937 % assert (isVarientField (f)) %
939 % assert (isVarient (v)) %
943 % assert (isVarient (peep ())) %
945 % assert (d=depth ()) %
948 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
953 static void Varient (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
956 VarientCaseLabelList := VarientCaseLabels { ','
959 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
964 static void VarientCaseLabelList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
973 [ '..' ConstExpression
976 % l, h could be saved if necessary. %
979 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
984 static void VarientCaseLabels (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
987 SetType := ( 'SET' | 'PACKEDSET' ) 'OF' SimpleType
991 % n := push (makeSet (pop ())) %
994 first symbols:oftok, packedsettok, settok
999 static void SetType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1002 PointerType := 'POINTER' 'TO' Type
1005 % n := push (makePointer (pop ())) %
1008 first symbols:pointertok
1013 static void PointerType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1016 ProcedureType := 'PROCEDURE'
1017 % curproc := push (makeProcType ()) %
1020 first symbols:proceduretok
1025 static void ProcedureType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1028 FormalTypeList := '(' ( ')' FormalReturn |
1029 ProcedureParameters ')'
1032 first symbols:lparatok
1037 static void FormalTypeList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1040 FormalReturn := [ ':' OptReturnType ]
1042 first symbols:colontok
1047 static void FormalReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1050 OptReturnType := '[' PushQualident
1051 % putReturnType (curproc, pop ()) %
1053 % putOptReturn (curproc) %
1055 % putReturnType (curproc, pop ()) %
1058 first symbols:identtok, lsbratok
1063 static void OptReturnType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1066 ProcedureParameters := ProcedureParameter
1067 % addParameter (curproc, pop ()) %
1068 { ',' ProcedureParameter
1070 % addParameter (curproc, pop ()) %
1073 first symbols:identtok, arraytok, periodperiodperiodtok, vartok
1078 static void ProcedureParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1081 ProcedureParameter := '...'
1084 % n := push (makeVarargs ()) %
1086 % n := push (makeVarParameter (NIL, pop (), curproc, TRUE)) %
1088 % n := push (makeNonVarParameter (NIL, pop (), curproc, TRUE)) %
1091 first symbols:identtok, arraytok, vartok, periodperiodperiodtok
1096 static void ProcedureParameter (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1100 % VAR n, a: node ; %
1104 % checkDuplicate (putIdent (n, curident)) %
1107 [ '[' ConstExpression
1108 % a := pop () could store, a, into, n. %
1111 first symbols:identtok
1116 static void VarIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1122 % n := makeIdentList () %
1125 VarIdent { ',' VarIdent }
1127 first symbols:identtok
1132 static void VarIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1135 VariableDeclaration :=
1136 % VAR v, d: node ; %
1140 % d := makeVarDecl (v, pop ()) %
1143 first symbols:identtok
1148 static void VariableDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1151 Designator := Qualident { SubDesignator }
1153 first symbols:identtok
1158 static void Designator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1161 SubDesignator := '.' Ident | '[' ArrayExpList ']' |
1164 first symbols:uparrowtok, lsbratok, periodtok
1169 static void SubDesignator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1172 ArrayExpList := Expression { ',' Expression }
1174 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
1179 static void ArrayExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1182 ExpList := Expression { ',' Expression }
1184 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
1189 static void ExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1192 Expression := SimpleExpression [ Relation SimpleExpression ]
1194 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
1199 static void Expression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1202 SimpleExpression := UnaryOrTerm { AddOperator Term }
1204 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
1209 static void SimpleExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1212 UnaryOrTerm := '+' Term | '-' Term |
1215 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
1220 static void UnaryOrTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1223 Term := Factor { MulOperator Factor }
1225 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok
1230 static void Term (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1233 Factor := Number | string | SetOrDesignatorOrFunction |
1234 '(' Expression ')' |
1235 'NOT' ( Factor | ConstAttribute )
1237 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok
1242 static void Factor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1245 SetOrDesignatorOrFunction := Qualident [ Constructor |
1247 [ ActualParameters ] ] |
1250 first symbols:lcbratok, identtok
1255 static void SetOrDesignatorOrFunction (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1258 SimpleDes := { SubDesignator }
1260 first symbols:periodtok, lsbratok, uparrowtok
1265 static void SimpleDes (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1268 ActualParameters := '(' [ ExpList ] ')'
1270 first symbols:lparatok
1275 static void ActualParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1278 ExitStatement := 'EXIT'
1280 first symbols:exittok
1285 static void ExitStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1288 ReturnStatement := 'RETURN' [ Expression ]
1290 first symbols:returntok
1295 static void ReturnStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1298 Statement := [ AssignmentOrProcedureCall |
1299 IfStatement | CaseStatement |
1302 LoopStatement | ForStatement |
1303 WithStatement | AsmStatement |
1304 ExitStatement | ReturnStatement |
1307 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok
1312 static void Statement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1315 RetryStatement := 'RETRY'
1317 first symbols:retrytok
1322 static void RetryStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1325 AssignmentOrProcedureCall := Designator ( ':=' Expression |
1331 first symbols:identtok
1336 static void AssignmentOrProcedureCall (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1339 StatementSequence := Statement { ';' Statement }
1341 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok
1346 static void StatementSequence (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1349 IfStatement := 'IF' Expression 'THEN' StatementSequence
1350 { 'ELSIF' Expression 'THEN' StatementSequence }
1351 [ 'ELSE' StatementSequence ] 'END'
1358 static void IfStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1361 CaseStatement := 'CASE' Expression 'OF' Case { '|'
1365 first symbols:casetok
1370 static void CaseStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1373 CaseEndStatement := 'END' | 'ELSE' StatementSequence
1376 first symbols:elsetok, endtok
1381 static void CaseEndStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1384 Case := [ CaseLabelList ':' StatementSequence ]
1386 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
1391 static void Case (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1394 CaseLabelList := CaseLabels { ',' CaseLabels }
1396 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
1401 static void CaseLabelList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1404 CaseLabels := ConstExpressionNop [ '..' ConstExpressionNop ]
1406 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
1411 static void CaseLabels (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1414 WhileStatement := 'WHILE' Expression 'DO' StatementSequence
1417 first symbols:whiletok
1422 static void WhileStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1425 RepeatStatement := 'REPEAT' StatementSequence 'UNTIL'
1428 first symbols:repeattok
1433 static void RepeatStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1436 ForStatement := 'FOR' Ident ':=' Expression 'TO'
1437 Expression [ 'BY' ConstExpressionNop ]
1438 'DO' StatementSequence 'END'
1440 first symbols:fortok
1445 static void ForStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1448 LoopStatement := 'LOOP' StatementSequence 'END'
1450 first symbols:looptok
1455 static void LoopStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1458 WithStatement := 'WITH' Designator 'DO' StatementSequence
1461 first symbols:withtok
1466 static void WithStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1469 ProcedureDeclaration := ProcedureHeading ';' ProcedureBlock
1474 first symbols:proceduretok
1479 static void ProcedureDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1482 ProcedureIdent := Ident
1483 % curproc := lookupSym (curident) %
1485 % enterScope (curproc) %
1488 first symbols:identtok
1493 static void ProcedureIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1496 DefProcedureIdent := Ident
1497 % curproc := lookupSym (curident) %
1500 first symbols:identtok
1505 static void DefProcedureIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1508 DefineBuiltinProcedure := [ '__ATTRIBUTE__' '__BUILTIN__'
1509 '(' '(' Ident ')' ')' |
1512 first symbols:inlinetok, attributetok
1517 static void DefineBuiltinProcedure (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1520 ProcedureHeading := 'PROCEDURE' DefineBuiltinProcedure
1521 ( ProcedureIdent [ FormalParameters ]
1524 first symbols:proceduretok
1529 static void ProcedureHeading (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1532 Builtin := [ '__BUILTIN__' | '__INLINE__' ]
1534 first symbols:inlinetok, builtintok
1539 static void Builtin (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1542 DefProcedureHeading := 'PROCEDURE' Builtin ( DefProcedureIdent
1543 [ DefFormalParameters ]
1546 first symbols:proceduretok
1551 static void DefProcedureHeading (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1554 ProcedureBlock := { Declaration } [ 'BEGIN' ProcedureBlockBody ]
1557 first symbols:proceduretok, moduletok, consttok, typetok, vartok, endtok, begintok
1562 static void ProcedureBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1565 Block := { Declaration } InitialBlock FinalBlock
1568 first symbols:proceduretok, moduletok, finallytok, begintok, consttok, typetok, vartok, endtok
1573 static void Block (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1576 InitialBlock := [ 'BEGIN' InitialBlockBody ]
1578 first symbols:begintok
1583 static void InitialBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1586 FinalBlock := [ 'FINALLY' FinalBlockBody ]
1588 first symbols:finallytok
1593 static void FinalBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1596 InitialBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
1598 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
1603 static void InitialBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1606 FinalBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
1608 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
1613 static void FinalBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1616 ProcedureBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
1618 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
1623 static void ProcedureBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1626 NormalPart := StatementSequence
1628 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
1633 static void NormalPart (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1636 ExceptionalPart := StatementSequence
1638 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
1643 static void ExceptionalPart (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1646 Declaration := 'CONST' { ConstantDeclaration ';' } |
1647 'TYPE' { TypeDeclaration } |
1648 'VAR' { VariableDeclaration ';' } |
1649 ProcedureDeclaration ';' |
1650 ModuleDeclaration ';'
1652 first symbols:moduletok, proceduretok, vartok, typetok, consttok
1657 static void Declaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1660 DefFormalParameters := '('
1661 % paramEnter (curproc) %
1662 [ DefMultiFPSection ] ')'
1664 % paramLeave (curproc) %
1667 first symbols:lparatok
1672 static void DefFormalParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1675 DefMultiFPSection := DefExtendedFP |
1676 FPSection [ ';' DefMultiFPSection ]
1678 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
1683 static void DefMultiFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1686 FormalParameters := '('
1687 % paramEnter (curproc) %
1688 [ MultiFPSection ] ')'
1689 % paramLeave (curproc) %
1692 first symbols:lparatok
1697 static void FormalParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1700 AttributeNoReturn := [ NoReturn |
1701 % setNoReturn (curproc, FALSE) %
1704 first symbols:ldirectivetok
1709 static void AttributeNoReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1714 first symbols:ldirectivetok
1719 static void NoReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1722 AttributeUnused := [ Unused ]
1724 first symbols:ldirectivetok
1729 static void AttributeUnused (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1734 first symbols:ldirectivetok
1739 static void Unused (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1742 MultiFPSection := ExtendedFP | FPSection [ ';'
1745 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
1750 static void MultiFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1753 FPSection := NonVarFPSection |
1756 first symbols:vartok, identtok
1761 static void FPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1764 DefExtendedFP := DefOptArg | '...'
1765 % addParameter (curproc, makeVarargs ()) %
1768 first symbols:lsbratok, periodperiodperiodtok
1773 static void DefExtendedFP (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1776 ExtendedFP := OptArg | '...'
1778 first symbols:lsbratok, periodperiodperiodtok
1783 static void ExtendedFP (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1786 VarFPSection := 'VAR' PushIdentList
1787 % VAR l, t: node ; %
1793 % curisused := TRUE %
1795 % addVarParameters (curproc, l, t, curisused) %
1798 first symbols:vartok
1803 static void VarFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1806 NonVarFPSection := PushIdentList
1807 % VAR l, t: node ; %
1813 % curisused := TRUE %
1815 % addNonVarParameters (curproc, l, t, curisused) %
1818 first symbols:identtok
1823 static void NonVarFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1827 % VAR p, init, type: node ; id: Name ; %
1834 [ '=' ConstExpression
1837 % p := addOptParameter (curproc, id, type, init) %
1840 first symbols:lsbratok
1845 static void OptArg (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1849 % VAR p, init, type: node ; id: Name ; %
1857 % p := addOptParameter (curproc, id, type, init) %
1860 first symbols:lsbratok
1865 static void DefOptArg (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1869 % VAR c: CARDINAL ; %
1871 % VAR n, a, s: node ; %
1877 % pushNunbounded (c) %
1880 first symbols:identtok, arraytok
1885 static void FormalType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1888 ModuleDeclaration := 'MODULE' Ident [ Priority ]
1889 ';' { Import } [ Export ]
1892 first symbols:moduletok
1897 static void ModuleDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1900 Priority := '[' ConstExpressionNop ']'
1902 first symbols:lsbratok
1907 static void Priority (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1910 Export := 'EXPORT' ( 'QUALIFIED' IdentList |
1911 'UNQUALIFIED' IdentList |
1914 first symbols:exporttok
1919 static void Export (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1922 FromIdentList := Ident
1923 % importInto (frommodule, curident, curmodule) %
1925 % importInto (frommodule, curident, curmodule) %
1928 first symbols:identtok
1933 static void FromIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1936 FromImport := 'FROM' Ident
1937 % frommodule := lookupDef (curident) %
1938 'IMPORT' FromIdentList ';'
1940 first symbols:fromtok
1945 static void FromImport (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1948 ImportModuleList := Ident { ',' Ident }
1950 first symbols:identtok
1955 static void ImportModuleList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1958 WithoutFromImport := 'IMPORT' ImportModuleList ';'
1960 first symbols:importtok
1965 static void WithoutFromImport (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1968 Import := FromImport | WithoutFromImport
1970 first symbols:importtok, fromtok
1975 static void Import (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1978 DefinitionModule := 'DEFINITION' 'MODULE' [ 'FOR'
1981 % curmodule := lookupDef (curident) %
1983 % enterScope (curmodule) %
1985 % resetEnumPos (curmodule) %
1986 { Import } [ Export ] { Definition }
1988 % checkEndName (curmodule, curident, 'definition module') %
1990 % setConstExpComplete (curmodule) %
1995 first symbols:definitiontok
2000 static void DefinitionModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2003 PushQualident := Ident
2004 % typeExp := push (lookupSym (curident)) %
2008 metaError1 ('the symbol {%1k} is not visible in this scope (or any other nested scope)', curident)
2011 % IF NOT isDef (typeExp)
2013 ErrorArray ('the first component of this qualident must be a definition module')
2016 % typeExp := replace (lookupInScope (typeExp, curident)) ;
2019 ErrorArray ('identifier not found in definition module')
2023 first symbols:identtok
2028 static void PushQualident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2031 OptSubrange := [ SubrangeType
2032 % VAR q, s: node ; %
2038 % putSubrangeType (s, q) %
2040 % typeExp := push (s) %
2043 first symbols:lsbratok
2048 static void OptSubrange (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2051 TypeEquiv := PushQualident OptSubrange
2053 first symbols:identtok
2058 static void TypeEquiv (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2064 % typeExp := push (makeEnum ()) %
2066 % f := makeEnumField (typeExp, curident) %
2068 % f := makeEnumField (typeExp, curident) %
2071 first symbols:identtok
2076 static void EnumIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2079 Enumeration := '(' EnumIdentList ')'
2081 first symbols:lparatok
2086 static void Enumeration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2090 % VAR d: CARDINAL ; %
2093 ( TypeEquiv | Enumeration |
2095 % assert (d = depth () - 1) %
2098 first symbols:lsbratok, lparatok, identtok
2103 static void SimpleType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2106 Type := SimpleType | ArrayType | RecordType |
2107 SetType | PointerType | ProcedureType
2109 first symbols:proceduretok, pointertok, settok, packedsettok, oftok, recordtok, arraytok, identtok, lparatok, lsbratok
2114 static void Type (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2117 TypeDeclaration := { Ident
2118 % typeDes := lookupSym (curident) %
2120 % putType (typeDes, pop ()) %
2123 first symbols:identtok
2128 static void TypeDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2131 Definition := 'CONST' { ConstantDeclaration ';' } |
2132 'TYPE' { TypeDeclaration } |
2133 'VAR' { VariableDeclaration ';' } |
2134 DefProcedureHeading ';'
2136 first symbols:proceduretok, vartok, typetok, consttok
2141 static void Definition (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2144 AsmStatement := 'ASM' [ 'VOLATILE' ] '(' AsmOperands
2147 first symbols:asmtok
2152 static void AsmStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2155 AsmOperands := string [ AsmOperandSpec ]
2157 first symbols:stringtok
2162 static void AsmOperands (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2165 AsmOperandSpec := [ ':' AsmList [ ':' AsmList [
2168 first symbols:colontok
2173 static void AsmOperandSpec (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2176 AsmList := [ AsmElement ] { ',' AsmElement }
2178 first symbols:lsbratok, stringtok, commatok
2183 static void AsmList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2186 NamedOperand := '[' Ident ']'
2188 first symbols:lsbratok
2193 static void NamedOperand (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2196 AsmOperandName := [ NamedOperand ]
2198 first symbols:lsbratok
2203 static void AsmOperandName (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2206 AsmElement := AsmOperandName string '(' Expression
2209 first symbols:stringtok, lsbratok
2214 static void AsmElement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2217 TrashList := [ string ] { ',' string }
2219 first symbols:commatok, stringtok
2224 static void TrashList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2231 static decl_node
push (decl_node n
)
2233 return static_cast<decl_node
> (mcStack_push (stk
, reinterpret_cast<void *> (n
)));
2234 /* static analysis guarentees a RETURN statement will be used before here. */
2235 __builtin_unreachable ();
2243 static decl_node
pop (void)
2245 return static_cast<decl_node
> (mcStack_pop (stk
));
2246 /* static analysis guarentees a RETURN statement will be used before here. */
2247 __builtin_unreachable ();
2255 static decl_node
replace (decl_node n
)
2257 return static_cast<decl_node
> (mcStack_replace (stk
, reinterpret_cast<void *> (n
)));
2258 /* static analysis guarentees a RETURN statement will be used before here. */
2259 __builtin_unreachable ();
2264 peep - returns the top node on the stack without removing it.
2267 static decl_node
peep (void)
2269 return push (pop ());
2270 /* static analysis guarentees a RETURN statement will be used before here. */
2271 __builtin_unreachable ();
2276 depth - returns the depth of the stack.
2279 static unsigned int depth (void)
2281 return mcStack_depth (stk
);
2282 /* static analysis guarentees a RETURN statement will be used before here. */
2283 __builtin_unreachable ();
2291 static void checkDuplicate (unsigned int b
)
2300 static void ErrorString (DynamicStrings_String s
)
2302 mcError_errorStringAt (s
, mcLexBuf_getTokenNo ());
2311 static void ErrorArray (const char *a_
, unsigned int _a_high
)
2315 /* make a local copy of each unbounded array. */
2316 memcpy (a
, a_
, _a_high
+1);
2318 ErrorString (DynamicStrings_InitString ((const char *) a
, _a_high
));
2323 checkParameterAttribute -
2326 static void checkParameterAttribute (void)
2328 if ((nameKey_makeKey ((const char *) "unused", 6)) != curident
)
2330 mcMetaError_metaError1 ((const char *) "attribute {%1k} is not allowed in the formal parameter section, currently only unused is allowed", 96, (const unsigned char *) &curident
, (sizeof (curident
)-1));
2336 checkReturnAttribute -
2339 static void checkReturnAttribute (void)
2341 if ((nameKey_makeKey ((const char *) "noreturn", 8)) != curident
)
2343 mcMetaError_metaError1 ((const char *) "attribute {%1k} is not allowed in the procedure return type, only noreturn is allowed", 85, (const unsigned char *) &curident
, (sizeof (curident
)-1));
2352 static void pushNunbounded (unsigned int c
)
2361 subrange
= decl_makeSubrange (static_cast<decl_node
> (NULL
), static_cast<decl_node
> (NULL
));
2362 decl_putSubrangeType (subrange
, decl_getCardinal ());
2363 array
= decl_makeArray (subrange
, type
);
2364 decl_putUnbounded (array
);
2365 type
= push (array
);
2372 makeIndexedArray - builds and returns an array of type, t, with, c, indices.
2375 static decl_node
makeIndexedArray (unsigned int c
, decl_node t
)
2381 t
= decl_makeArray (pop (), t
);
2385 /* static analysis guarentees a RETURN statement will be used before here. */
2386 __builtin_unreachable ();
2391 importInto - from, m, import, name, into module, current.
2392 It checks to see if curident is an enumeration type
2393 and if so automatically includes all enumeration fields
2397 static void importInto (decl_node m
, nameKey_Name name
, decl_node current
)
2402 mcDebug_assert (decl_isDef (m
));
2403 mcDebug_assert (((decl_isDef (current
)) || (decl_isModule (current
))) || (decl_isImp (current
)));
2404 s
= decl_lookupExported (m
, name
);
2407 mcMetaError_metaError2 ((const char *) "{%1k} was not exported from definition module {%2a}", 51, (const unsigned char *) &name
, (sizeof (name
)-1), (const unsigned char *) &m
, (sizeof (m
)-1));
2411 o
= decl_import (current
, s
);
2414 mcMetaError_metaError2 ((const char *) "{%1ad} cannot be imported into the current module as it causes a name clash with {%2ad}", 87, (const unsigned char *) &s
, (sizeof (s
)-1), (const unsigned char *) &o
, (sizeof (o
)-1));
2421 checkEndName - if module does not have, name, then issue an error containing, desc.
2424 static void checkEndName (decl_node module
, nameKey_Name name
, const char *desc_
, unsigned int _desc_high
)
2426 DynamicStrings_String s
;
2427 char desc
[_desc_high
+1];
2429 /* make a local copy of each unbounded array. */
2430 memcpy (desc
, desc_
, _desc_high
+1);
2432 if ((decl_getSymName (module
)) != name
)
2434 s
= DynamicStrings_InitString ((const char *) "inconsistent module name found with this ", 41);
2435 s
= DynamicStrings_ConCat (s
, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) desc
, _desc_high
)));
2442 DescribeStop - issues a message explaining what tokens were expected
2445 static DynamicStrings_String
DescribeStop (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
2448 DynamicStrings_String str
;
2449 DynamicStrings_String message
;
2452 message
= DynamicStrings_InitString ((const char *) "", 0);
2453 if ((((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2455 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "string", 6)));
2458 if ((((1 << (mcReserved_realtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2460 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "real number", 11)));
2463 if ((((1 << (mcReserved_identtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2465 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "identifier", 10)));
2468 if ((((1 << (mcReserved_integertok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2470 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "integer number", 14)));
2473 if ((((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2475 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__INLINE__", 10)));
2478 if ((((1 << (mcReserved_builtintok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2480 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__BUILTIN__", 11)));
2483 if ((((1 << (mcReserved_attributetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2485 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__ATTRIBUTE__", 13)));
2488 if ((((1 << (mcReserved_filetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2490 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__FILE__", 8)));
2493 if ((((1 << (mcReserved_linetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2495 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__LINE__", 8)));
2498 if ((((1 << (mcReserved_datetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2500 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__DATE__", 8)));
2503 if ((((1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2505 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "...", 3)));
2508 if ((((1 << (mcReserved_volatiletok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2510 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "VOLATILE", 8)));
2513 if ((((1 << (mcReserved_asmtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2515 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ASM", 3)));
2518 if ((((1 << (mcReserved_withtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2520 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "WITH", 4)));
2523 if ((((1 << (mcReserved_whiletok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2525 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "WHILE", 5)));
2528 if ((((1 << (mcReserved_vartok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2530 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "VAR", 3)));
2533 if ((((1 << (mcReserved_untiltok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2535 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "UNTIL", 5)));
2538 if ((((1 << (mcReserved_typetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2540 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "TYPE", 4)));
2543 if ((((1 << (mcReserved_totok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2545 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "TO", 2)));
2548 if ((((1 << (mcReserved_thentok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2550 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "THEN", 4)));
2553 if ((((1 << (mcReserved_settok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2555 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "SET", 3)));
2558 if ((((1 << (mcReserved_returntok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2560 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RETURN", 6)));
2563 if ((((1 << (mcReserved_retrytok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2565 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RETRY", 5)));
2568 if ((((1 << (mcReserved_repeattok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2570 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "REPEAT", 6)));
2573 if ((((1 << (mcReserved_remtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2575 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "REM", 3)));
2578 if ((((1 << (mcReserved_recordtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2580 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RECORD", 6)));
2583 if ((((1 << (mcReserved_unqualifiedtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2585 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "UNQUALIFIED", 11)));
2588 if ((((1 << (mcReserved_qualifiedtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2590 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "QUALIFIED", 9)));
2593 if ((((1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2595 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "PROCEDURE", 9)));
2598 if ((((1 << (mcReserved_pointertok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2600 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "POINTER", 7)));
2603 if ((((1 << (mcReserved_packedsettok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2605 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "PACKEDSET", 9)));
2608 if ((((1 << (mcReserved_ortok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2610 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "OR", 2)));
2613 if ((((1 << (mcReserved_oftok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2615 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "OF", 2)));
2618 if ((((1 << (mcReserved_nottok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2620 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "NOT", 3)));
2623 if ((((1 << (mcReserved_moduletok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2625 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MODULE", 6)));
2628 if ((((1 << (mcReserved_modtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2630 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MOD", 3)));
2633 if ((((1 << (mcReserved_looptok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2635 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "LOOP", 4)));
2638 if ((((1 << (mcReserved_intok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2640 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IN", 2)));
2643 if ((((1 << (mcReserved_importtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2645 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IMPORT", 6)));
2648 if ((((1 << (mcReserved_implementationtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2650 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IMPLEMENTATION", 14)));
2653 if ((((1 << (mcReserved_iftok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2655 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IF", 2)));
2658 if ((((1 << (mcReserved_fromtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2660 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FROM", 4)));
2663 if ((((1 << (mcReserved_fortok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2665 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FOR", 3)));
2668 if ((((1 << (mcReserved_finallytok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2670 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FINALLY", 7)));
2673 if ((((1 << (mcReserved_exporttok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2675 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXPORT", 6)));
2678 if ((((1 << (mcReserved_exittok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2680 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXIT", 4)));
2683 if ((((1 << (mcReserved_excepttok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2685 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXCEPT", 6)));
2688 if ((((1 << (mcReserved_endtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2690 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "END", 3)));
2693 if ((((1 << (mcReserved_elsiftok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2695 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ELSIF", 5)));
2698 if ((((1 << (mcReserved_elsetok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2700 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ELSE", 4)));
2703 if ((((1 << (mcReserved_dotok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2705 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DO", 2)));
2708 if ((((1 << (mcReserved_divtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2710 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DIV", 3)));
2713 if ((((1 << (mcReserved_definitiontok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2715 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DEFINITION", 10)));
2718 if ((((1 << (mcReserved_consttok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2720 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "CONST", 5)));
2723 if ((((1 << (mcReserved_casetok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2725 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "CASE", 4)));
2728 if ((((1 << (mcReserved_bytok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2730 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "BY", 2)));
2733 if ((((1 << (mcReserved_begintok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2735 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "BEGIN", 5)));
2738 if ((((1 << (mcReserved_arraytok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2740 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ARRAY", 5)));
2743 if ((((1 << (mcReserved_andtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2745 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "AND", 3)));
2748 if ((((1 << (mcReserved_colontok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2750 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ":", 1)));
2753 if ((((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2755 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "..", 2)));
2758 if ((((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2760 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "*>", 2)));
2763 if ((((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2765 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<*", 2)));
2768 if ((((1 << (mcReserved_greaterequaltok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2770 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ">=", 2)));
2773 if ((((1 << (mcReserved_lessequaltok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2775 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<=", 2)));
2778 if ((((1 << (mcReserved_lessgreatertok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2780 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<>", 2)));
2783 if ((((1 << (mcReserved_hashtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2785 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "#", 1)));
2788 if ((((1 << (mcReserved_equaltok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2790 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "=", 1)));
2793 if ((((1 << (mcReserved_uparrowtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2795 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "^", 1)));
2798 if ((((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2800 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ";", 1)));
2803 if ((((1 << (mcReserved_commatok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2805 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ",", 1)));
2808 if ((((1 << (mcReserved_periodtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2810 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1)));
2813 if ((((1 << (mcReserved_ambersandtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2815 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "&", 1)));
2818 if ((((1 << (mcReserved_dividetok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2820 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "/", 1)));
2823 if ((((1 << (mcReserved_timestok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2825 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "*", 1)));
2828 if ((((1 << (mcReserved_minustok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2830 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "-", 1)));
2833 if ((((1 << (mcReserved_plustok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2835 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "+", 1)));
2838 if ((((1 << (mcReserved_doublequotestok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2840 message
= DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (message
, ' '), '`'), '"'), '\''), ',');
2843 if ((((1 << (mcReserved_singlequotetok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2845 message
= DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (message
, ' '), '"'), '\''), '"'), ',');
2848 if ((((1 << (mcReserved_greatertok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2850 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ">", 1)));
2853 if ((((1 << (mcReserved_lesstok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2855 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<", 1)));
2858 if ((((1 << (mcReserved_rparatok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2860 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ")", 1)));
2863 if ((((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2865 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "(", 1)));
2868 if ((((1 << (mcReserved_rcbratok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2870 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "}", 1)));
2873 if ((((1 << (mcReserved_lcbratok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2875 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "{", 1)));
2878 if ((((1 << (mcReserved_rsbratok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2880 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "]", 1)));
2883 if ((((1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2885 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "[", 1)));
2888 if ((((1 << (mcReserved_bartok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2890 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "|", 1)));
2893 if ((((1 << (mcReserved_becomestok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2895 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ":=", 2)));
2898 if ((((1 << (mcReserved_eoftok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2900 /* eoftok has no token name (needed to generate error messages) */
2903 str
= DynamicStrings_InitString ((const char *) " syntax error", 13);
2904 message
= DynamicStrings_KillString (message
);
2908 /* avoid dangling else. */
2909 str
= DynamicStrings_ConCat (message
, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " missing ", 9)));
2913 /* avoid dangling else. */
2914 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) " expecting one of", 17), message
);
2915 message
= DynamicStrings_KillString (message
);
2918 /* static analysis guarentees a RETURN statement will be used before here. */
2919 __builtin_unreachable ();
2924 DescribeError - issues a message explaining what tokens were expected
2927 static void DescribeError (void)
2929 DynamicStrings_String str
;
2931 str
= DynamicStrings_InitString ((const char *) "", 0);
2932 switch (mcLexBuf_currenttoken
)
2934 case mcReserved_stringtok
:
2935 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found string", 26), DynamicStrings_Mark (str
));
2938 case mcReserved_realtok
:
2939 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found real number", 31), DynamicStrings_Mark (str
));
2942 case mcReserved_identtok
:
2943 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found identifier", 30), DynamicStrings_Mark (str
));
2946 case mcReserved_integertok
:
2947 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found integer number", 34), DynamicStrings_Mark (str
));
2950 case mcReserved_inlinetok
:
2951 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __INLINE__", 30), DynamicStrings_Mark (str
));
2954 case mcReserved_builtintok
:
2955 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __BUILTIN__", 31), DynamicStrings_Mark (str
));
2958 case mcReserved_attributetok
:
2959 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __ATTRIBUTE__", 33), DynamicStrings_Mark (str
));
2962 case mcReserved_filetok
:
2963 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __FILE__", 28), DynamicStrings_Mark (str
));
2966 case mcReserved_linetok
:
2967 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __LINE__", 28), DynamicStrings_Mark (str
));
2970 case mcReserved_datetok
:
2971 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __DATE__", 28), DynamicStrings_Mark (str
));
2974 case mcReserved_periodperiodperiodtok
:
2975 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ...", 23), DynamicStrings_Mark (str
));
2978 case mcReserved_volatiletok
:
2979 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found VOLATILE", 28), DynamicStrings_Mark (str
));
2982 case mcReserved_asmtok
:
2983 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ASM", 23), DynamicStrings_Mark (str
));
2986 case mcReserved_withtok
:
2987 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found WITH", 24), DynamicStrings_Mark (str
));
2990 case mcReserved_whiletok
:
2991 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found WHILE", 25), DynamicStrings_Mark (str
));
2994 case mcReserved_vartok
:
2995 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found VAR", 23), DynamicStrings_Mark (str
));
2998 case mcReserved_untiltok
:
2999 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found UNTIL", 25), DynamicStrings_Mark (str
));
3002 case mcReserved_typetok
:
3003 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found TYPE", 24), DynamicStrings_Mark (str
));
3006 case mcReserved_totok
:
3007 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found TO", 22), DynamicStrings_Mark (str
));
3010 case mcReserved_thentok
:
3011 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found THEN", 24), DynamicStrings_Mark (str
));
3014 case mcReserved_settok
:
3015 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found SET", 23), DynamicStrings_Mark (str
));
3018 case mcReserved_returntok
:
3019 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RETURN", 26), DynamicStrings_Mark (str
));
3022 case mcReserved_retrytok
:
3023 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RETRY", 25), DynamicStrings_Mark (str
));
3026 case mcReserved_repeattok
:
3027 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found REPEAT", 26), DynamicStrings_Mark (str
));
3030 case mcReserved_remtok
:
3031 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found REM", 23), DynamicStrings_Mark (str
));
3034 case mcReserved_recordtok
:
3035 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RECORD", 26), DynamicStrings_Mark (str
));
3038 case mcReserved_unqualifiedtok
:
3039 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found UNQUALIFIED", 31), DynamicStrings_Mark (str
));
3042 case mcReserved_qualifiedtok
:
3043 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found QUALIFIED", 29), DynamicStrings_Mark (str
));
3046 case mcReserved_proceduretok
:
3047 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found PROCEDURE", 29), DynamicStrings_Mark (str
));
3050 case mcReserved_pointertok
:
3051 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found POINTER", 27), DynamicStrings_Mark (str
));
3054 case mcReserved_packedsettok
:
3055 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found PACKEDSET", 29), DynamicStrings_Mark (str
));
3058 case mcReserved_ortok
:
3059 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found OR", 22), DynamicStrings_Mark (str
));
3062 case mcReserved_oftok
:
3063 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found OF", 22), DynamicStrings_Mark (str
));
3066 case mcReserved_nottok
:
3067 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found NOT", 23), DynamicStrings_Mark (str
));
3070 case mcReserved_moduletok
:
3071 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found MODULE", 26), DynamicStrings_Mark (str
));
3074 case mcReserved_modtok
:
3075 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found MOD", 23), DynamicStrings_Mark (str
));
3078 case mcReserved_looptok
:
3079 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found LOOP", 24), DynamicStrings_Mark (str
));
3082 case mcReserved_intok
:
3083 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IN", 22), DynamicStrings_Mark (str
));
3086 case mcReserved_importtok
:
3087 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IMPORT", 26), DynamicStrings_Mark (str
));
3090 case mcReserved_implementationtok
:
3091 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IMPLEMENTATION", 34), DynamicStrings_Mark (str
));
3094 case mcReserved_iftok
:
3095 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IF", 22), DynamicStrings_Mark (str
));
3098 case mcReserved_fromtok
:
3099 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FROM", 24), DynamicStrings_Mark (str
));
3102 case mcReserved_fortok
:
3103 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FOR", 23), DynamicStrings_Mark (str
));
3106 case mcReserved_finallytok
:
3107 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FINALLY", 27), DynamicStrings_Mark (str
));
3110 case mcReserved_exporttok
:
3111 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXPORT", 26), DynamicStrings_Mark (str
));
3114 case mcReserved_exittok
:
3115 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXIT", 24), DynamicStrings_Mark (str
));
3118 case mcReserved_excepttok
:
3119 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXCEPT", 26), DynamicStrings_Mark (str
));
3122 case mcReserved_endtok
:
3123 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found END", 23), DynamicStrings_Mark (str
));
3126 case mcReserved_elsiftok
:
3127 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ELSIF", 25), DynamicStrings_Mark (str
));
3130 case mcReserved_elsetok
:
3131 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ELSE", 24), DynamicStrings_Mark (str
));
3134 case mcReserved_dotok
:
3135 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DO", 22), DynamicStrings_Mark (str
));
3138 case mcReserved_divtok
:
3139 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DIV", 23), DynamicStrings_Mark (str
));
3142 case mcReserved_definitiontok
:
3143 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DEFINITION", 30), DynamicStrings_Mark (str
));
3146 case mcReserved_consttok
:
3147 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found CONST", 25), DynamicStrings_Mark (str
));
3150 case mcReserved_casetok
:
3151 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found CASE", 24), DynamicStrings_Mark (str
));
3154 case mcReserved_bytok
:
3155 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found BY", 22), DynamicStrings_Mark (str
));
3158 case mcReserved_begintok
:
3159 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found BEGIN", 25), DynamicStrings_Mark (str
));
3162 case mcReserved_arraytok
:
3163 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ARRAY", 25), DynamicStrings_Mark (str
));
3166 case mcReserved_andtok
:
3167 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found AND", 23), DynamicStrings_Mark (str
));
3170 case mcReserved_colontok
:
3171 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found :", 21), DynamicStrings_Mark (str
));
3174 case mcReserved_periodperiodtok
:
3175 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ..", 22), DynamicStrings_Mark (str
));
3178 case mcReserved_rdirectivetok
:
3179 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found *>", 22), DynamicStrings_Mark (str
));
3182 case mcReserved_ldirectivetok
:
3183 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <*", 22), DynamicStrings_Mark (str
));
3186 case mcReserved_greaterequaltok
:
3187 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found >=", 22), DynamicStrings_Mark (str
));
3190 case mcReserved_lessequaltok
:
3191 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <=", 22), DynamicStrings_Mark (str
));
3194 case mcReserved_lessgreatertok
:
3195 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <>", 22), DynamicStrings_Mark (str
));
3198 case mcReserved_hashtok
:
3199 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found #", 21), DynamicStrings_Mark (str
));
3202 case mcReserved_equaltok
:
3203 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found =", 21), DynamicStrings_Mark (str
));
3206 case mcReserved_uparrowtok
:
3207 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ^", 21), DynamicStrings_Mark (str
));
3210 case mcReserved_semicolontok
:
3211 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ;", 21), DynamicStrings_Mark (str
));
3214 case mcReserved_commatok
:
3215 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ,", 21), DynamicStrings_Mark (str
));
3218 case mcReserved_periodtok
:
3219 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found .", 21), DynamicStrings_Mark (str
));
3222 case mcReserved_ambersandtok
:
3223 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found &", 21), DynamicStrings_Mark (str
));
3226 case mcReserved_dividetok
:
3227 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found /", 21), DynamicStrings_Mark (str
));
3230 case mcReserved_timestok
:
3231 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found *", 21), DynamicStrings_Mark (str
));
3234 case mcReserved_minustok
:
3235 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found -", 21), DynamicStrings_Mark (str
));
3238 case mcReserved_plustok
:
3239 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found +", 21), DynamicStrings_Mark (str
));
3242 case mcReserved_doublequotestok
:
3243 str
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_InitString ((const char *) "syntax error, found '", 21), '"'), '\''), DynamicStrings_Mark (str
));
3246 case mcReserved_singlequotetok
:
3247 str
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_InitString ((const char *) "syntax error, found \"", 21), '\''), '"'), DynamicStrings_Mark (str
));
3250 case mcReserved_greatertok
:
3251 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found >", 21), DynamicStrings_Mark (str
));
3254 case mcReserved_lesstok
:
3255 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <", 21), DynamicStrings_Mark (str
));
3258 case mcReserved_rparatok
:
3259 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found )", 21), DynamicStrings_Mark (str
));
3262 case mcReserved_lparatok
:
3263 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found (", 21), DynamicStrings_Mark (str
));
3266 case mcReserved_rcbratok
:
3267 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found }", 21), DynamicStrings_Mark (str
));
3270 case mcReserved_lcbratok
:
3271 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found {", 21), DynamicStrings_Mark (str
));
3274 case mcReserved_rsbratok
:
3275 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ]", 21), DynamicStrings_Mark (str
));
3278 case mcReserved_lsbratok
:
3279 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found [", 21), DynamicStrings_Mark (str
));
3282 case mcReserved_bartok
:
3283 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found |", 21), DynamicStrings_Mark (str
));
3286 case mcReserved_becomestok
:
3287 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found :=", 22), DynamicStrings_Mark (str
));
3290 case mcReserved_eoftok
:
3291 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ", 20), DynamicStrings_Mark (str
));
3303 SyntaxError - after a syntax error we skip all tokens up until we reach
3307 static void SyntaxError (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3312 mcPrintf_printf0 ((const char *) "\\nskipping token *** ", 21);
3315 yes the ORD(currenttoken) looks ugly, but it is *much* safer than
3316 using currenttoken<sometok as a change to the ordering of the
3317 token declarations below would cause this to break. Using ORD() we are
3318 immune from such changes
3320 while (! (((( ((unsigned int) (mcLexBuf_currenttoken
)) < 32) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & (stopset0
)) != 0))) || ((( ((unsigned int) (mcLexBuf_currenttoken
)) >= 32) && ( ((unsigned int) (mcLexBuf_currenttoken
)) < 64)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & (stopset1
)) != 0)))) || (( ((unsigned int) (mcLexBuf_currenttoken
)) >= 64) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & (stopset2
)) != 0)))))
3322 mcLexBuf_getToken ();
3326 mcPrintf_printf0 ((const char *) " ***\\n", 6);
3335 static void SyntaxCheck (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3337 /* and again (see above re: ORD)
3339 if (! (((( ((unsigned int) (mcLexBuf_currenttoken
)) < 32) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & (stopset0
)) != 0))) || ((( ((unsigned int) (mcLexBuf_currenttoken
)) >= 32) && ( ((unsigned int) (mcLexBuf_currenttoken
)) < 64)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & (stopset1
)) != 0)))) || (( ((unsigned int) (mcLexBuf_currenttoken
)) >= 64) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & (stopset2
)) != 0)))))
3341 SyntaxError (stopset0
, stopset1
, stopset2
);
3347 WarnMissingToken - generates a warning message about a missing token, t.
3350 static void WarnMissingToken (mcReserved_toktype t
)
3355 DynamicStrings_String str
;
3357 s0
= (mcp3_SetOfStop0
) 0;
3358 s1
= (mcp3_SetOfStop1
) 0;
3359 s2
= (mcp3_SetOfStop2
) 0;
3360 if ( ((unsigned int) (t
)) < 32)
3362 s0
= (mcp3_SetOfStop0
) ((1 << (t
-mcReserved_eoftok
)));
3364 else if ( ((unsigned int) (t
)) < 64)
3366 /* avoid dangling else. */
3367 s1
= (mcp3_SetOfStop1
) ((1 << (t
-mcReserved_arraytok
)));
3371 /* avoid dangling else. */
3372 s2
= (mcp3_SetOfStop2
) ((1 << (t
-mcReserved_recordtok
)));
3374 str
= DescribeStop (s0
, s1
, s2
);
3375 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error,", 13), DynamicStrings_Mark (str
));
3376 mcError_errorStringAt (str
, mcLexBuf_getTokenNo ());
3381 MissingToken - generates a warning message about a missing token, t.
3384 static void MissingToken (mcReserved_toktype t
)
3386 WarnMissingToken (t
);
3387 if ((((t
!= mcReserved_identtok
) && (t
!= mcReserved_integertok
)) && (t
!= mcReserved_realtok
)) && (t
!= mcReserved_stringtok
))
3391 mcPrintf_printf0 ((const char *) "inserting token\\n", 17);
3393 mcLexBuf_insertToken (t
);
3402 static unsigned int CheckAndInsert (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3404 if (((( ((unsigned int) (t
)) < 32) && ((((1 << (t
-mcReserved_eoftok
)) & (stopset0
)) != 0))) || ((( ((unsigned int) (t
)) >= 32) && ( ((unsigned int) (t
)) < 64)) && ((((1 << (t
-mcReserved_arraytok
)) & (stopset1
)) != 0)))) || (( ((unsigned int) (t
)) >= 64) && ((((1 << (t
-mcReserved_recordtok
)) & (stopset2
)) != 0))))
3406 WarnMissingToken (t
);
3407 mcLexBuf_insertTokenAndRewind (t
);
3414 /* static analysis guarentees a RETURN statement will be used before here. */
3415 __builtin_unreachable ();
3423 static unsigned int InStopSet (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3425 if (((( ((unsigned int) (t
)) < 32) && ((((1 << (t
-mcReserved_eoftok
)) & (stopset0
)) != 0))) || ((( ((unsigned int) (t
)) >= 32) && ( ((unsigned int) (t
)) < 64)) && ((((1 << (t
-mcReserved_arraytok
)) & (stopset1
)) != 0)))) || (( ((unsigned int) (t
)) >= 64) && ((((1 << (t
-mcReserved_recordtok
)) & (stopset2
)) != 0))))
3433 /* static analysis guarentees a RETURN statement will be used before here. */
3434 __builtin_unreachable ();
3439 PeepToken - peep token checks to see whether the stopset is satisfied by currenttoken
3440 If it is not then it will insert a token providing the token
3441 is one of ; ] ) } . OF END ,
3443 if the stopset contains <identtok> then we do not insert a token
3446 static void PeepToken (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3448 /* and again (see above re: ORD)
3450 if ((! (((( ((unsigned int) (mcLexBuf_currenttoken
)) < 32) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & (stopset0
)) != 0))) || ((( ((unsigned int) (mcLexBuf_currenttoken
)) >= 32) && ( ((unsigned int) (mcLexBuf_currenttoken
)) < 64)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & (stopset1
)) != 0)))) || (( ((unsigned int) (mcLexBuf_currenttoken
)) >= 64) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & (stopset2
)) != 0))))) && (! (InStopSet (mcReserved_identtok
, stopset0
, stopset1
, stopset2
))))
3452 /* SyntaxCheck would fail since currentoken is not part of the stopset
3453 we check to see whether any of currenttoken might be a commonly omitted token */
3454 if ((((((((CheckAndInsert (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
)) || (CheckAndInsert (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
))) || (CheckAndInsert (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
))) || (CheckAndInsert (mcReserved_rcbratok
, stopset0
, stopset1
, stopset2
))) || (CheckAndInsert (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
))) || (CheckAndInsert (mcReserved_oftok
, stopset0
, stopset1
, stopset2
))) || (CheckAndInsert (mcReserved_endtok
, stopset0
, stopset1
, stopset2
))) || (CheckAndInsert (mcReserved_commatok
, stopset0
, stopset1
, stopset2
)))
3464 static void Expect (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3466 if (mcLexBuf_currenttoken
== t
)
3468 /* avoid dangling else. */
3469 mcLexBuf_getToken ();
3472 PeepToken (stopset0
, stopset1
, stopset2
);
3479 SyntaxCheck (stopset0
, stopset1
, stopset2
);
3484 Ident - error checking varient of Ident
3487 static void Ident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3489 curident
= nameKey_makekey (mcLexBuf_currentstring
);
3490 Expect (mcReserved_identtok
, stopset0
, stopset1
, stopset2
);
3498 static void string (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3500 curstring
= nameKey_makekey (mcLexBuf_currentstring
);
3501 Expect (mcReserved_stringtok
, stopset0
, stopset1
, stopset2
);
3509 static void Integer (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3511 Expect (mcReserved_integertok
, stopset0
, stopset1
, stopset2
);
3519 static void Real (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3521 Expect (mcReserved_realtok
, stopset0
, stopset1
, stopset2
);
3526 FileUnit := DefinitionModule |
3527 ImplementationOrProgramModule
3529 first symbols:implementationtok, moduletok, definitiontok
3534 static void FileUnit (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3536 if (mcLexBuf_currenttoken
== mcReserved_definitiontok
)
3538 DefinitionModule (stopset0
, stopset1
, stopset2
);
3540 else if (((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_implementationtok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
))))) != 0)))
3542 /* avoid dangling else. */
3543 ImplementationOrProgramModule (stopset0
, stopset1
, stopset2
);
3547 /* avoid dangling else. */
3548 ErrorArray ((const char *) "expecting one of: IMPLEMENTATION MODULE DEFINITION", 50);
3554 ProgramModule := 'MODULE' Ident
3555 % curmodule := lookupModule (curident) %
3557 % enterScope (curmodule) %
3559 % resetEnumPos (curmodule) %
3560 [ Priority ] ';' { Import } Block
3562 % checkEndName (curmodule, curident, 'program module') %
3564 % setConstExpComplete (curmodule) %
3569 first symbols:moduletok
3574 static void ProgramModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3576 Expect (mcReserved_moduletok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3577 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3578 curmodule
= decl_lookupModule (curident
);
3579 decl_enterScope (curmodule
);
3580 decl_resetEnumPos (curmodule
);
3581 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
3583 Priority (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3585 Expect (mcReserved_semicolontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_importtok
-mcReserved_arraytok
)) | (1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
3586 while (((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_importtok
-mcReserved_arraytok
))))) != 0)))
3588 Import (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_importtok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_typetok
-mcReserved_recordtok
))));
3591 Block (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3592 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3593 checkEndName (curmodule
, curident
, (const char *) "program module", 14);
3594 decl_setConstExpComplete (curmodule
);
3596 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
);
3601 ImplementationModule := 'IMPLEMENTATION' 'MODULE'
3603 % curmodule := lookupImp (curident) %
3605 % enterScope (lookupDef (curident)) %
3607 % enterScope (curmodule) %
3609 % resetEnumPos (curmodule) %
3610 [ Priority ] ';' { Import }
3612 % checkEndName (curmodule, curident, 'implementation module') %
3614 % setConstExpComplete (curmodule) %
3616 % leaveScope ; leaveScope %
3619 first symbols:implementationtok
3624 static void ImplementationModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3626 Expect (mcReserved_implementationtok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
);
3627 Expect (mcReserved_moduletok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3628 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3629 curmodule
= decl_lookupImp (curident
);
3630 decl_enterScope (decl_lookupDef (curident
));
3631 decl_enterScope (curmodule
);
3632 decl_resetEnumPos (curmodule
);
3633 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
3635 Priority (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3637 Expect (mcReserved_semicolontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_importtok
-mcReserved_arraytok
)) | (1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
3638 while (((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_importtok
-mcReserved_arraytok
))))) != 0)))
3640 Import (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_importtok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_typetok
-mcReserved_recordtok
))));
3643 Block (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3644 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3645 checkEndName (curmodule
, curident
, (const char *) "implementation module", 21);
3646 decl_setConstExpComplete (curmodule
);
3649 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
);
3654 ImplementationOrProgramModule := ImplementationModule |
3657 first symbols:moduletok, implementationtok
3662 static void ImplementationOrProgramModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3664 if (mcLexBuf_currenttoken
== mcReserved_implementationtok
)
3666 ImplementationModule (stopset0
, stopset1
, stopset2
);
3668 else if (mcLexBuf_currenttoken
== mcReserved_moduletok
)
3670 /* avoid dangling else. */
3671 ProgramModule (stopset0
, stopset1
, stopset2
);
3675 /* avoid dangling else. */
3676 ErrorArray ((const char *) "expecting one of: MODULE IMPLEMENTATION", 39);
3682 Number := Integer | Real
3684 first symbols:realtok, integertok
3689 static void Number (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3691 if (mcLexBuf_currenttoken
== mcReserved_integertok
)
3693 Integer (stopset0
, stopset1
, stopset2
);
3695 else if (mcLexBuf_currenttoken
== mcReserved_realtok
)
3697 /* avoid dangling else. */
3698 Real (stopset0
, stopset1
, stopset2
);
3702 /* avoid dangling else. */
3703 ErrorArray ((const char *) "expecting one of: real number integer number", 44);
3709 Qualident := Ident { '.' Ident }
3711 first symbols:identtok
3716 static void Qualident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3718 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3719 while (mcLexBuf_currenttoken
== mcReserved_periodtok
)
3721 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3722 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3729 ConstantDeclaration :=
3730 % VAR d, e: node ; %
3732 % d := lookupSym (curident) %
3736 % assert (isConst (d)) %
3741 first symbols:identtok
3746 static void ConstantDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3751 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_equaltok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3752 d
= decl_lookupSym (curident
);
3753 Expect (mcReserved_equaltok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
3754 ConstExpression (stopset0
, stopset1
, stopset2
);
3756 mcDebug_assert (decl_isConst (d
));
3757 decl_putConst (d
, e
);
3762 ConstExpressionNop := SimpleConstExpr
3764 [ Relation SimpleConstExpr ]
3766 % n := makeConstExp () %
3769 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
3774 static void ConstExpressionNop (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3778 SimpleConstExpr (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_greaterequaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_greatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessequaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_lesstok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessgreatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_hashtok
-mcReserved_eoftok
)) | (1 << (mcReserved_equaltok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_intok
-mcReserved_arraytok
))), stopset2
);
3779 if (((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_equaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_hashtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessgreatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_lesstok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessequaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_greatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_greaterequaltok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_intok
))
3781 Relation (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
3782 SimpleConstExpr (stopset0
, stopset1
, stopset2
);
3784 n
= decl_makeConstExp ();
3792 % n := push (makeConstExp ()) %
3793 SimpleConstExpr [ Relation SimpleConstExpr ]
3795 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
3800 static void ConstExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3804 n
= push (decl_makeConstExp ());
3805 SimpleConstExpr (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_greaterequaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_greatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessequaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_lesstok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessgreatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_hashtok
-mcReserved_eoftok
)) | (1 << (mcReserved_equaltok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_intok
-mcReserved_arraytok
))), stopset2
);
3806 if (((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_equaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_hashtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessgreatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_lesstok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessequaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_greatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_greaterequaltok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_intok
))
3808 Relation (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
3809 SimpleConstExpr (stopset0
, stopset1
, stopset2
);
3815 Relation := '=' | '#' | '<>' | '<' | '<=' |
3818 first symbols:intok, greaterequaltok, greatertok, lessequaltok, lesstok, lessgreatertok, hashtok, equaltok
3823 static void Relation (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3825 if (mcLexBuf_currenttoken
== mcReserved_equaltok
)
3827 Expect (mcReserved_equaltok
, stopset0
, stopset1
, stopset2
);
3829 else if (mcLexBuf_currenttoken
== mcReserved_hashtok
)
3831 /* avoid dangling else. */
3832 Expect (mcReserved_hashtok
, stopset0
, stopset1
, stopset2
);
3834 else if (mcLexBuf_currenttoken
== mcReserved_lessgreatertok
)
3836 /* avoid dangling else. */
3837 Expect (mcReserved_lessgreatertok
, stopset0
, stopset1
, stopset2
);
3839 else if (mcLexBuf_currenttoken
== mcReserved_lesstok
)
3841 /* avoid dangling else. */
3842 Expect (mcReserved_lesstok
, stopset0
, stopset1
, stopset2
);
3844 else if (mcLexBuf_currenttoken
== mcReserved_lessequaltok
)
3846 /* avoid dangling else. */
3847 Expect (mcReserved_lessequaltok
, stopset0
, stopset1
, stopset2
);
3849 else if (mcLexBuf_currenttoken
== mcReserved_greatertok
)
3851 /* avoid dangling else. */
3852 Expect (mcReserved_greatertok
, stopset0
, stopset1
, stopset2
);
3854 else if (mcLexBuf_currenttoken
== mcReserved_greaterequaltok
)
3856 /* avoid dangling else. */
3857 Expect (mcReserved_greaterequaltok
, stopset0
, stopset1
, stopset2
);
3859 else if (mcLexBuf_currenttoken
== mcReserved_intok
)
3861 /* avoid dangling else. */
3862 Expect (mcReserved_intok
, stopset0
, stopset1
, stopset2
);
3866 /* avoid dangling else. */
3867 ErrorArray ((const char *) "expecting one of: IN >= > <= < <> # =", 37);
3873 SimpleConstExpr := UnaryOrConstTerm { AddOperator
3876 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
3881 static void SimpleConstExpr (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3883 UnaryOrConstTerm (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_ortok
-mcReserved_arraytok
))), stopset2
);
3884 while (((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_ortok
))
3886 AddOperator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
3887 ConstTerm (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_ortok
-mcReserved_arraytok
))), stopset2
);
3894 UnaryOrConstTerm := '+' ConstTerm |
3898 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
3903 static void UnaryOrConstTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3905 if (mcLexBuf_currenttoken
== mcReserved_plustok
)
3907 Expect (mcReserved_plustok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
3908 ConstTerm (stopset0
, stopset1
, stopset2
);
3910 else if (mcLexBuf_currenttoken
== mcReserved_minustok
)
3912 /* avoid dangling else. */
3913 Expect (mcReserved_minustok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
3914 ConstTerm (stopset0
, stopset1
, stopset2
);
3916 else if ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_nottok
)) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))))) != 0))))
3918 /* avoid dangling else. */
3919 ConstTerm (stopset0
, stopset1
, stopset2
);
3923 /* avoid dangling else. */
3924 ErrorArray ((const char *) "expecting one of: NOT ( integer number real number __ATTRIBUTE__ identifier { string - +", 88);
3930 AddOperator := '+' | '-' | 'OR'
3932 first symbols:ortok, minustok, plustok
3937 static void AddOperator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3939 if (mcLexBuf_currenttoken
== mcReserved_plustok
)
3941 Expect (mcReserved_plustok
, stopset0
, stopset1
, stopset2
);
3943 else if (mcLexBuf_currenttoken
== mcReserved_minustok
)
3945 /* avoid dangling else. */
3946 Expect (mcReserved_minustok
, stopset0
, stopset1
, stopset2
);
3948 else if (mcLexBuf_currenttoken
== mcReserved_ortok
)
3950 /* avoid dangling else. */
3951 Expect (mcReserved_ortok
, stopset0
, stopset1
, stopset2
);
3955 /* avoid dangling else. */
3956 ErrorArray ((const char *) "expecting one of: OR - +", 24);
3962 ConstTerm := ConstFactor { MulOperator ConstFactor }
3964 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok
3969 static void ConstTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3971 ConstFactor (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ambersandtok
-mcReserved_eoftok
)) | (1 << (mcReserved_andtok
-mcReserved_eoftok
)) | (1 << (mcReserved_dividetok
-mcReserved_eoftok
)) | (1 << (mcReserved_timestok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_modtok
-mcReserved_arraytok
)) | (1 << (mcReserved_divtok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_remtok
-mcReserved_recordtok
))));
3972 while ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_timestok
-mcReserved_eoftok
)) | (1 << (mcReserved_dividetok
-mcReserved_eoftok
)) | (1 << (mcReserved_andtok
-mcReserved_eoftok
)) | (1 << (mcReserved_ambersandtok
-mcReserved_eoftok
))))) != 0))) || (((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_divtok
-mcReserved_arraytok
)) | (1 << (mcReserved_modtok
-mcReserved_arraytok
))))) != 0)))) || (mcLexBuf_currenttoken
== mcReserved_remtok
))
3974 MulOperator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
3975 ConstFactor (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_timestok
-mcReserved_eoftok
)) | (1 << (mcReserved_dividetok
-mcReserved_eoftok
)) | (1 << (mcReserved_andtok
-mcReserved_eoftok
)) | (1 << (mcReserved_ambersandtok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_divtok
-mcReserved_arraytok
)) | (1 << (mcReserved_modtok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_remtok
-mcReserved_recordtok
))));
3982 MulOperator := '*' | '/' | 'DIV' | 'MOD' |
3985 first symbols:ambersandtok, andtok, remtok, modtok, divtok, dividetok, timestok
3990 static void MulOperator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3992 if (mcLexBuf_currenttoken
== mcReserved_timestok
)
3994 Expect (mcReserved_timestok
, stopset0
, stopset1
, stopset2
);
3996 else if (mcLexBuf_currenttoken
== mcReserved_dividetok
)
3998 /* avoid dangling else. */
3999 Expect (mcReserved_dividetok
, stopset0
, stopset1
, stopset2
);
4001 else if (mcLexBuf_currenttoken
== mcReserved_divtok
)
4003 /* avoid dangling else. */
4004 Expect (mcReserved_divtok
, stopset0
, stopset1
, stopset2
);
4006 else if (mcLexBuf_currenttoken
== mcReserved_modtok
)
4008 /* avoid dangling else. */
4009 Expect (mcReserved_modtok
, stopset0
, stopset1
, stopset2
);
4011 else if (mcLexBuf_currenttoken
== mcReserved_remtok
)
4013 /* avoid dangling else. */
4014 Expect (mcReserved_remtok
, stopset0
, stopset1
, stopset2
);
4016 else if (mcLexBuf_currenttoken
== mcReserved_andtok
)
4018 /* avoid dangling else. */
4019 Expect (mcReserved_andtok
, stopset0
, stopset1
, stopset2
);
4021 else if (mcLexBuf_currenttoken
== mcReserved_ambersandtok
)
4023 /* avoid dangling else. */
4024 Expect (mcReserved_ambersandtok
, stopset0
, stopset1
, stopset2
);
4028 /* avoid dangling else. */
4029 ErrorArray ((const char *) "expecting one of: & AND REM MOD DIV / *", 39);
4035 ConstFactor := Number | ConstString |
4036 ConstSetOrQualidentOrFunction |
4037 '(' ConstExpressionNop ')' |
4041 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok
4046 static void ConstFactor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4048 if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
))))) != 0)))
4050 Number (stopset0
, stopset1
, stopset2
);
4052 else if (mcLexBuf_currenttoken
== mcReserved_stringtok
)
4054 /* avoid dangling else. */
4055 ConstString (stopset0
, stopset1
, stopset2
);
4057 else if ((mcLexBuf_currenttoken
== mcReserved_lcbratok
) || (mcLexBuf_currenttoken
== mcReserved_identtok
))
4059 /* avoid dangling else. */
4060 ConstSetOrQualidentOrFunction (stopset0
, stopset1
, stopset2
);
4062 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
4064 /* avoid dangling else. */
4065 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4066 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4067 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4069 else if (mcLexBuf_currenttoken
== mcReserved_nottok
)
4071 /* avoid dangling else. */
4072 Expect (mcReserved_nottok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4073 ConstFactor (stopset0
, stopset1
, stopset2
);
4075 else if (mcLexBuf_currenttoken
== mcReserved_attributetok
)
4077 /* avoid dangling else. */
4078 ConstAttribute (stopset0
, stopset1
, stopset2
);
4082 /* avoid dangling else. */
4083 ErrorArray ((const char *) "expecting one of: __ATTRIBUTE__ NOT ( identifier { string integer number real number", 84);
4089 ConstString := string
4091 first symbols:stringtok
4096 static void ConstString (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4098 string (stopset0
, stopset1
, stopset2
);
4103 ComponentElement := ConstExpressionNop [ '..' ConstExpressionNop ]
4105 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4110 static void ComponentElement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4112 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4113 if (mcLexBuf_currenttoken
== mcReserved_periodperiodtok
)
4115 Expect (mcReserved_periodperiodtok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4116 ConstExpressionNop (stopset0
, stopset1
, stopset2
);
4122 ComponentValue := ComponentElement [ 'BY' ConstExpressionNop ]
4124 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
4129 static void ComponentValue (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4131 ComponentElement (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_bytok
-mcReserved_arraytok
))), stopset2
);
4132 if (mcLexBuf_currenttoken
== mcReserved_bytok
)
4134 Expect (mcReserved_bytok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4135 ConstExpressionNop (stopset0
, stopset1
, stopset2
);
4141 ArraySetRecordValue := ComponentValue { ',' ComponentValue }
4143 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4148 static void ArraySetRecordValue (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4150 ComponentValue (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4151 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4153 Expect (mcReserved_commatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4154 ComponentValue (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4161 Constructor := '{' [ ArraySetRecordValue ] '}'
4163 first symbols:lcbratok
4168 static void Constructor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4170 Expect (mcReserved_lcbratok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rcbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
4171 if ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_nottok
)) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))))) != 0))))
4173 ArraySetRecordValue (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rcbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4175 Expect (mcReserved_rcbratok
, stopset0
, stopset1
, stopset2
);
4180 ConstSetOrQualidentOrFunction := Qualident [ Constructor |
4181 ConstActualParameters ] |
4184 first symbols:lcbratok, identtok
4189 static void ConstSetOrQualidentOrFunction (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4191 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
4193 /* avoid dangling else. */
4194 Qualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lcbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4195 if ((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0)))
4197 /* avoid gcc warning by using compound statement even if not strictly necessary. */
4198 /* seen optional [ | ] expression */
4199 if (mcLexBuf_currenttoken
== mcReserved_lcbratok
)
4201 Constructor (stopset0
, stopset1
, stopset2
);
4203 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
4205 /* avoid dangling else. */
4206 ConstActualParameters (stopset0
, stopset1
, stopset2
);
4210 /* avoid dangling else. */
4211 ErrorArray ((const char *) "expecting one of: ( {", 21);
4214 /* end of optional [ | ] expression */
4216 else if (mcLexBuf_currenttoken
== mcReserved_lcbratok
)
4218 /* avoid dangling else. */
4219 Constructor (stopset0
, stopset1
, stopset2
);
4223 /* avoid dangling else. */
4224 ErrorArray ((const char *) "expecting one of: { identifier", 30);
4230 ConstActualParameters := '(' [ ConstExpList ] ')'
4232 first symbols:lparatok
4237 static void ConstActualParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4239 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
4240 if ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_nottok
)) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))))) != 0))))
4242 ConstExpList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4244 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4249 ConstExpList := ConstExpressionNop { ',' ConstExpressionNop }
4251 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4256 static void ConstExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4258 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4259 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4261 Expect (mcReserved_commatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4262 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4269 ConstAttribute := '__ATTRIBUTE__' '__BUILTIN__'
4270 '(' '(' ConstAttributeExpression
4273 first symbols:attributetok
4278 static void ConstAttribute (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4280 Expect (mcReserved_attributetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_builtintok
-mcReserved_recordtok
))));
4281 Expect (mcReserved_builtintok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4282 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4283 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lesstok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4284 ConstAttributeExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4285 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4286 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4291 ConstAttributeExpression := Ident | '<' Qualident
4294 first symbols:lesstok, identtok
4299 static void ConstAttributeExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4301 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
4303 Ident (stopset0
, stopset1
, stopset2
);
4305 else if (mcLexBuf_currenttoken
== mcReserved_lesstok
)
4307 /* avoid dangling else. */
4308 Expect (mcReserved_lesstok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4309 Qualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4310 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4311 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_greatertok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4312 Expect (mcReserved_greatertok
, stopset0
, stopset1
, stopset2
);
4316 /* avoid dangling else. */
4317 ErrorArray ((const char *) "expecting one of: < identifier", 30);
4325 first symbols:ldirectivetok
4330 static void ByteAlignment (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4332 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4333 AttributeExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4334 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
4339 OptAlignmentExpression := [ AlignmentExpression ]
4341 first symbols:lparatok
4346 static void OptAlignmentExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4348 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
4350 AlignmentExpression (stopset0
, stopset1
, stopset2
);
4356 AlignmentExpression := '(' ConstExpressionNop ')'
4358 first symbols:lparatok
4363 static void AlignmentExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4365 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4366 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4367 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4372 Alignment := [ ByteAlignment ]
4374 first symbols:ldirectivetok
4379 static void Alignment (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4381 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
4383 ByteAlignment (stopset0
, stopset1
, stopset2
);
4389 IdentList := Ident { ',' Ident }
4391 first symbols:identtok
4396 static void IdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4398 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4399 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4401 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4402 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4412 % n := makeIdentList () %
4414 % checkDuplicate (putIdent (n, curident)) %
4416 % checkDuplicate (putIdent (n, curident)) %
4421 first symbols:identtok
4426 static void PushIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4430 n
= decl_makeIdentList ();
4431 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4432 checkDuplicate (decl_putIdent (n
, curident
));
4433 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4435 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4436 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4437 checkDuplicate (decl_putIdent (n
, curident
));
4446 % VAR low, high: node ; d: CARDINAL ; %
4452 % assert (d = depth ()) %
4453 '..' ConstExpression
4456 % assert (d = depth ()) %
4458 % typeExp := push (makeSubrange (low, high)) %
4460 % assert (d = depth () - 1) %
4463 first symbols:lsbratok
4468 static void SubrangeType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4474 Expect (mcReserved_lsbratok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4476 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4478 mcDebug_assert (d
== (depth ()));
4479 Expect (mcReserved_periodperiodtok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4480 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4482 mcDebug_assert (d
== (depth ()));
4483 typeExp
= push (decl_makeSubrange (low
, high
));
4484 mcDebug_assert (d
== ((depth ())-1));
4485 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
4490 ArrayType := 'ARRAY'
4491 % VAR c: CARDINAL ; t, n: node ; %
4499 % n := push (makeIndexedArray (c, pop ())) %
4502 first symbols:arraytok
4507 static void ArrayType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4513 Expect (mcReserved_arraytok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4515 SimpleType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
4517 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4519 Expect (mcReserved_commatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4520 SimpleType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
4524 Expect (mcReserved_oftok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_pointertok
-mcReserved_arraytok
)) | (1 << (mcReserved_packedsettok
-mcReserved_arraytok
)) | (1 << (mcReserved_oftok
-mcReserved_arraytok
)) | (1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_settok
-mcReserved_recordtok
)) | (1 << (mcReserved_recordtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4525 Type (stopset0
, stopset1
, stopset2
);
4526 n
= push (makeIndexedArray (c
, pop ()));
4531 RecordType := 'RECORD'
4534 % n := push (makeRecord ()) %
4536 % n := push (NIL) no varient %
4537 [ DefaultRecordAttributes ] FieldListSequence
4539 % assert (pop ()=NIL) %
4542 first symbols:recordtok
4547 static void RecordType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4551 Expect (mcReserved_recordtok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
)) | (1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4552 n
= push (decl_makeRecord ());
4553 n
= push (static_cast<decl_node
> (NULL
)); /* no varient */
4554 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
4556 DefaultRecordAttributes (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4558 FieldListSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
4559 mcDebug_assert ((pop ()) == NULL
);
4560 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
4565 DefaultRecordAttributes := ''
4567 first symbols:ldirectivetok
4572 static void DefaultRecordAttributes (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4574 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4575 AttributeExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4576 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
4581 RecordFieldPragma := [ '' ]
4583 first symbols:ldirectivetok
4588 static void RecordFieldPragma (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4590 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
4592 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4593 FieldPragmaExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
)) | (1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4594 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4596 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4597 FieldPragmaExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
)) | (1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4600 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
4606 FieldPragmaExpression := Ident PragmaConstExpression
4608 first symbols:identtok
4613 static void FieldPragmaExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4615 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4616 PragmaConstExpression (stopset0
, stopset1
, stopset2
);
4621 PragmaConstExpression := [ '(' ConstExpressionNop
4624 first symbols:lparatok
4629 static void PragmaConstExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4631 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
4633 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4634 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4635 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4641 AttributeExpression := Ident '(' ConstExpressionNop
4644 first symbols:identtok
4649 static void AttributeExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4651 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4652 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
4653 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4654 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4659 FieldListSequence := FieldListStatement { ';' FieldListStatement }
4661 first symbols:casetok, identtok, semicolontok
4666 static void FieldListSequence (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4668 FieldListStatement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4669 while (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
4671 Expect (mcReserved_semicolontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_casetok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4672 FieldListStatement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4679 FieldListStatement := [ FieldList ]
4681 first symbols:identtok, casetok
4686 static void FieldListStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4688 if ((mcLexBuf_currenttoken
== mcReserved_casetok
) || (mcLexBuf_currenttoken
== mcReserved_identtok
))
4690 FieldList (stopset0
, stopset1
, stopset2
);
4697 % VAR r, i, f, t, n, v, w: node ; d: CARDINAL ; %
4701 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
4703 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
4707 % assert (d=depth ()) %
4709 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isVarientField (r))) %
4711 % assert (d=depth () - 1) %
4715 % assert (d=depth () - 1) %
4719 % assert (d=depth ()) %
4721 % r := addFieldsToRecord (r, v, i, t) %
4723 % assert (d=depth ()) %
4730 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
4732 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
4736 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isRecordField (r))) %
4738 % w := push (makeVarient (r)) %
4740 % assert (d = depth () - 1) %
4742 % addVarientToList %
4744 % assert (d = depth () - 1) %
4746 % assert (d = depth () - 1) %
4748 % assert (d = depth () - 1) %
4750 % w := peep () ; assert (isVarient (w)) %
4752 % assert (d = depth () - 1) %
4753 [ 'ELSE' FieldListSequence ] 'END'
4755 % w := pop () ; assert (isVarient (w)) %
4757 % assert (d=depth ()) %
4760 first symbols:casetok, identtok
4765 static void FieldList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4776 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
4780 mcDebug_assert ((v
== NULL
) || (decl_isVarient (v
)));
4782 mcDebug_assert ((decl_isRecord (r
)) || (decl_isVarientField (r
)));
4784 mcDebug_assert (d
== (depth ()));
4785 mcDebug_assert (((v
== NULL
) && (decl_isRecord (r
))) || ((v
!= NULL
) && (decl_isVarientField (r
))));
4786 PushIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4787 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_pointertok
-mcReserved_arraytok
)) | (1 << (mcReserved_packedsettok
-mcReserved_arraytok
)) | (1 << (mcReserved_oftok
-mcReserved_arraytok
)) | (1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_settok
-mcReserved_recordtok
)) | (1 << (mcReserved_recordtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4788 mcDebug_assert (d
== ((depth ())-1));
4790 Type (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4791 mcDebug_assert (d
== ((depth ())-1));
4793 RecordFieldPragma (stopset0
, stopset1
, stopset2
);
4794 mcDebug_assert (d
== (depth ()));
4795 r
= decl_addFieldsToRecord (r
, v
, i
, t
);
4796 mcDebug_assert (d
== (depth ()));
4798 else if (mcLexBuf_currenttoken
== mcReserved_casetok
)
4800 /* avoid dangling else. */
4801 Expect (mcReserved_casetok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4802 /* addRecordToList */
4805 mcDebug_assert ((v
== NULL
) || (decl_isVarient (v
)));
4807 mcDebug_assert ((decl_isRecord (r
)) || (decl_isVarientField (r
)));
4809 mcDebug_assert (((v
== NULL
) && (decl_isRecord (r
))) || ((v
!= NULL
) && (decl_isRecordField (r
))));
4810 w
= push (decl_makeVarient (r
));
4811 mcDebug_assert (d
== ((depth ())-1));
4812 /* addVarientToList */
4813 CaseTag (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
4814 Expect (mcReserved_oftok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
4815 mcDebug_assert (d
== ((depth ())-1));
4816 Varient (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
4817 mcDebug_assert (d
== ((depth ())-1));
4818 while (mcLexBuf_currenttoken
== mcReserved_bartok
)
4820 Expect (mcReserved_bartok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
4821 Varient (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
))), stopset2
);
4822 mcDebug_assert (d
== ((depth ())-1));
4826 mcDebug_assert (decl_isVarient (w
));
4827 mcDebug_assert (d
== ((depth ())-1));
4828 if (mcLexBuf_currenttoken
== mcReserved_elsetok
)
4830 Expect (mcReserved_elsetok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4831 FieldListSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
4833 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
4835 mcDebug_assert (decl_isVarient (w
));
4836 mcDebug_assert (d
== (depth ()));
4840 /* avoid dangling else. */
4841 ErrorArray ((const char *) "expecting one of: CASE identifier", 33);
4848 % curident := NulName %
4851 first symbols:identtok
4856 static void TagIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4858 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
4860 Ident (stopset0
, stopset1
, stopset2
);
4864 curident
= nameKey_NulName
;
4871 % VAR tagident: Name ; q, v, w, r: node ; %
4873 % w := pop () ; v := pop () ; r := peep () ; v := push (v) ; w := push (w) %
4875 % assert (isVarient (w)) %
4877 % assert ((v=NIL) OR isVarient (v)) %
4879 % assert (isRecord (r) OR isVarientField (r)) %
4881 % assert (isVarient (push (pop ()))) %
4883 % tagident := curident %
4887 % assert (isVarient (push (pop ()))) %
4891 % buildVarientSelector (r, w, tagident, q) %
4894 first symbols:colontok, identtok
4899 static void CaseTag (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4901 nameKey_Name tagident
;
4912 mcDebug_assert (decl_isVarient (w
));
4913 mcDebug_assert ((v
== NULL
) || (decl_isVarient (v
)));
4914 mcDebug_assert ((decl_isRecord (r
)) || (decl_isVarientField (r
)));
4915 mcDebug_assert (decl_isVarient (push (pop ())));
4916 TagIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4917 tagident
= curident
;
4918 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
4920 Expect (mcReserved_colontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4921 PushQualident (stopset0
, stopset1
, stopset2
);
4923 mcDebug_assert (decl_isVarient (push (pop ())));
4927 q
= static_cast<decl_node
> (NULL
);
4929 decl_buildVarientSelector (r
, w
, tagident
, q
);
4935 % VAR p, r, v, f: node ; d: CARDINAL ; %
4939 % assert (isVarient (peep ())) %
4941 % v := pop () ; assert (isVarient (v)) %
4949 % f := push (buildVarientFieldRecord (v, p)) %
4952 VarientCaseLabelList ':' FieldListSequence
4958 % assert (isVarientField (f)) %
4960 % assert (isVarient (v)) %
4964 % assert (isVarient (peep ())) %
4966 % assert (d=depth ()) %
4969 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4974 static void Varient (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4983 mcDebug_assert (decl_isVarient (peep ()));
4984 if ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_nottok
)) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))))) != 0))))
4987 mcDebug_assert (decl_isVarient (v
));
4991 f
= push (decl_buildVarientFieldRecord (v
, p
));
4993 VarientCaseLabelList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4994 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_casetok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4995 FieldListSequence (stopset0
, stopset1
, stopset2
);
4998 mcDebug_assert (decl_isVarientField (f
));
4999 mcDebug_assert (decl_isVarient (v
));
5002 mcDebug_assert (decl_isVarient (peep ()));
5003 mcDebug_assert (d
== (depth ()));
5008 VarientCaseLabelList := VarientCaseLabels { ','
5011 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
5016 static void VarientCaseLabelList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5018 VarientCaseLabels (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5019 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5021 Expect (mcReserved_commatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
5022 VarientCaseLabels (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5029 VarientCaseLabels :=
5030 % VAR l, h: node ; %
5035 [ '..' ConstExpression
5038 % l, h could be saved if necessary. %
5041 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
5046 static void VarientCaseLabels (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5051 h
= static_cast<decl_node
> (NULL
);
5052 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5054 if (mcLexBuf_currenttoken
== mcReserved_periodperiodtok
)
5056 Expect (mcReserved_periodperiodtok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
5057 ConstExpression (stopset0
, stopset1
, stopset2
);
5064 SetType := ( 'SET' | 'PACKEDSET' ) 'OF' SimpleType
5068 % n := push (makeSet (pop ())) %
5071 first symbols:oftok, packedsettok, settok
5076 static void SetType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5080 if (mcLexBuf_currenttoken
== mcReserved_settok
)
5082 Expect (mcReserved_settok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
5084 else if (mcLexBuf_currenttoken
== mcReserved_packedsettok
)
5086 /* avoid dangling else. */
5087 Expect (mcReserved_packedsettok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
5091 /* avoid dangling else. */
5092 ErrorArray ((const char *) "expecting one of: PACKEDSET SET", 31);
5094 Expect (mcReserved_oftok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5095 SimpleType (stopset0
, stopset1
, stopset2
);
5096 n
= push (decl_makeSet (pop ()));
5101 PointerType := 'POINTER' 'TO' Type
5104 % n := push (makePointer (pop ())) %
5107 first symbols:pointertok
5112 static void PointerType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5116 Expect (mcReserved_pointertok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_totok
-mcReserved_recordtok
))));
5117 Expect (mcReserved_totok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_pointertok
-mcReserved_arraytok
)) | (1 << (mcReserved_packedsettok
-mcReserved_arraytok
)) | (1 << (mcReserved_oftok
-mcReserved_arraytok
)) | (1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_settok
-mcReserved_recordtok
)) | (1 << (mcReserved_recordtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5118 Type (stopset0
, stopset1
, stopset2
);
5119 n
= push (decl_makePointer (pop ()));
5124 ProcedureType := 'PROCEDURE'
5125 % curproc := push (makeProcType ()) %
5128 first symbols:proceduretok
5133 static void ProcedureType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5135 Expect (mcReserved_proceduretok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5136 curproc
= push (decl_makeProcType ());
5137 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
5139 FormalTypeList (stopset0
, stopset1
, stopset2
);
5145 FormalTypeList := '(' ( ')' FormalReturn |
5146 ProcedureParameters ')'
5149 first symbols:lparatok
5154 static void FormalTypeList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5156 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5157 if (mcLexBuf_currenttoken
== mcReserved_rparatok
)
5159 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5160 FormalReturn (stopset0
, stopset1
, stopset2
);
5162 else if ((mcLexBuf_currenttoken
== mcReserved_arraytok
) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))))) != 0))))
5164 /* avoid dangling else. */
5165 ProcedureParameters (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5166 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5167 FormalReturn (stopset0
, stopset1
, stopset2
);
5171 /* avoid dangling else. */
5172 ErrorArray ((const char *) "expecting one of: VAR ... ARRAY identifier )", 44);
5178 FormalReturn := [ ':' OptReturnType ]
5180 first symbols:colontok
5185 static void FormalReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5187 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
5189 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5190 OptReturnType (stopset0
, stopset1
, stopset2
);
5196 OptReturnType := '[' PushQualident
5197 % putReturnType (curproc, pop ()) %
5199 % putOptReturn (curproc) %
5201 % putReturnType (curproc, pop ()) %
5204 first symbols:identtok, lsbratok
5209 static void OptReturnType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5211 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
5213 Expect (mcReserved_lsbratok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5214 PushQualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5215 decl_putReturnType (curproc
, pop ());
5216 decl_putOptReturn (curproc
);
5217 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
5219 else if (mcLexBuf_currenttoken
== mcReserved_identtok
)
5221 /* avoid dangling else. */
5222 PushQualident (stopset0
, stopset1
, stopset2
);
5223 decl_putReturnType (curproc
, pop ());
5227 /* avoid dangling else. */
5228 ErrorArray ((const char *) "expecting one of: identifier [", 30);
5234 ProcedureParameters := ProcedureParameter
5235 % addParameter (curproc, pop ()) %
5236 { ',' ProcedureParameter
5238 % addParameter (curproc, pop ()) %
5241 first symbols:identtok, arraytok, periodperiodperiodtok, vartok
5246 static void ProcedureParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5248 ProcedureParameter (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5249 decl_addParameter (curproc
, pop ());
5250 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5252 Expect (mcReserved_commatok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5253 ProcedureParameter (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5254 decl_addParameter (curproc
, pop ());
5261 ProcedureParameter := '...'
5264 % n := push (makeVarargs ()) %
5266 % n := push (makeVarParameter (NIL, pop (), curproc, TRUE)) %
5268 % n := push (makeNonVarParameter (NIL, pop (), curproc, TRUE)) %
5271 first symbols:identtok, arraytok, vartok, periodperiodperiodtok
5276 static void ProcedureParameter (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5280 if (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
)
5282 Expect (mcReserved_periodperiodperiodtok
, stopset0
, stopset1
, stopset2
);
5283 n
= push (decl_makeVarargs ());
5285 else if (mcLexBuf_currenttoken
== mcReserved_vartok
)
5287 /* avoid dangling else. */
5288 Expect (mcReserved_vartok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5289 FormalType (stopset0
, stopset1
, stopset2
);
5290 n
= push (decl_makeVarParameter (static_cast<decl_node
> (NULL
), pop (), curproc
, TRUE
));
5292 else if ((mcLexBuf_currenttoken
== mcReserved_arraytok
) || (mcLexBuf_currenttoken
== mcReserved_identtok
))
5294 /* avoid dangling else. */
5295 FormalType (stopset0
, stopset1
, stopset2
);
5296 n
= push (decl_makeNonVarParameter (static_cast<decl_node
> (NULL
), pop (), curproc
, TRUE
));
5300 /* avoid dangling else. */
5301 ErrorArray ((const char *) "expecting one of: ARRAY identifier VAR ...", 42);
5308 % VAR n, a: node ; %
5312 % checkDuplicate (putIdent (n, curident)) %
5315 [ '[' ConstExpression
5316 % a := pop () could store, a, into, n. %
5319 first symbols:identtok
5324 static void VarIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5330 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5331 checkDuplicate (decl_putIdent (n
, curident
));
5333 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
5335 Expect (mcReserved_lsbratok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
5336 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5337 a
= pop (); /* could store, a, into, n. */
5338 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
5347 % n := makeIdentList () %
5350 VarIdent { ',' VarIdent }
5352 first symbols:identtok
5357 static void VarIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5361 n
= decl_makeIdentList ();
5363 VarIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5364 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5366 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5367 VarIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5374 VariableDeclaration :=
5375 % VAR v, d: node ; %
5379 % d := makeVarDecl (v, pop ()) %
5382 first symbols:identtok
5387 static void VariableDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5392 VarIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5394 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_pointertok
-mcReserved_arraytok
)) | (1 << (mcReserved_packedsettok
-mcReserved_arraytok
)) | (1 << (mcReserved_oftok
-mcReserved_arraytok
)) | (1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_settok
-mcReserved_recordtok
)) | (1 << (mcReserved_recordtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5395 Type (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5396 d
= decl_makeVarDecl (v
, pop ());
5397 Alignment (stopset0
, stopset1
, stopset2
);
5402 Designator := Qualident { SubDesignator }
5404 first symbols:identtok
5409 static void Designator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5411 Qualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_uparrowtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5412 while ((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_uparrowtok
-mcReserved_eoftok
))))) != 0)))
5414 SubDesignator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_uparrowtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5421 SubDesignator := '.' Ident | '[' ArrayExpList ']' |
5424 first symbols:uparrowtok, lsbratok, periodtok
5429 static void SubDesignator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5431 if (mcLexBuf_currenttoken
== mcReserved_periodtok
)
5433 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5434 Ident (stopset0
, stopset1
, stopset2
);
5436 else if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
5438 /* avoid dangling else. */
5439 Expect (mcReserved_lsbratok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5440 ArrayExpList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5441 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
5443 else if (mcLexBuf_currenttoken
== mcReserved_uparrowtok
)
5445 /* avoid dangling else. */
5446 Expect (mcReserved_uparrowtok
, stopset0
, stopset1
, stopset2
);
5450 /* avoid dangling else. */
5451 ErrorArray ((const char *) "expecting one of: ^ [ .", 23);
5457 ArrayExpList := Expression { ',' Expression }
5459 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
5464 static void ArrayExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5466 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5467 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5469 Expect (mcReserved_commatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5470 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5477 ExpList := Expression { ',' Expression }
5479 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
5484 static void ExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5486 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5487 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5489 Expect (mcReserved_commatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5490 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5497 Expression := SimpleExpression [ Relation SimpleExpression ]
5499 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
5504 static void Expression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5506 SimpleExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_greaterequaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_greatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessequaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_lesstok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessgreatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_hashtok
-mcReserved_eoftok
)) | (1 << (mcReserved_equaltok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_intok
-mcReserved_arraytok
))), stopset2
);
5507 if (((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_equaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_hashtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessgreatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_lesstok
-mcReserved_eoftok
)) | (1 << (mcReserved_lessequaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_greatertok
-mcReserved_eoftok
)) | (1 << (mcReserved_greaterequaltok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_intok
))
5509 Relation (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5510 SimpleExpression (stopset0
, stopset1
, stopset2
);
5516 SimpleExpression := UnaryOrTerm { AddOperator Term }
5518 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
5523 static void SimpleExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5525 UnaryOrTerm (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_ortok
-mcReserved_arraytok
))), stopset2
);
5526 while (((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_ortok
))
5528 AddOperator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5529 Term (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_ortok
-mcReserved_arraytok
))), stopset2
);
5536 UnaryOrTerm := '+' Term | '-' Term |
5539 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
5544 static void UnaryOrTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5546 if (mcLexBuf_currenttoken
== mcReserved_plustok
)
5548 Expect (mcReserved_plustok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5549 Term (stopset0
, stopset1
, stopset2
);
5551 else if (mcLexBuf_currenttoken
== mcReserved_minustok
)
5553 /* avoid dangling else. */
5554 Expect (mcReserved_minustok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5555 Term (stopset0
, stopset1
, stopset2
);
5557 else if ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_nottok
)) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))))) != 0))))
5559 /* avoid dangling else. */
5560 Term (stopset0
, stopset1
, stopset2
);
5564 /* avoid dangling else. */
5565 ErrorArray ((const char *) "expecting one of: NOT ( string integer number real number identifier { - +", 74);
5571 Term := Factor { MulOperator Factor }
5573 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok
5578 static void Term (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5580 Factor (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ambersandtok
-mcReserved_eoftok
)) | (1 << (mcReserved_andtok
-mcReserved_eoftok
)) | (1 << (mcReserved_dividetok
-mcReserved_eoftok
)) | (1 << (mcReserved_timestok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_modtok
-mcReserved_arraytok
)) | (1 << (mcReserved_divtok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_remtok
-mcReserved_recordtok
))));
5581 while ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_timestok
-mcReserved_eoftok
)) | (1 << (mcReserved_dividetok
-mcReserved_eoftok
)) | (1 << (mcReserved_andtok
-mcReserved_eoftok
)) | (1 << (mcReserved_ambersandtok
-mcReserved_eoftok
))))) != 0))) || (((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_divtok
-mcReserved_arraytok
)) | (1 << (mcReserved_modtok
-mcReserved_arraytok
))))) != 0)))) || (mcLexBuf_currenttoken
== mcReserved_remtok
))
5583 MulOperator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5584 Factor (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_timestok
-mcReserved_eoftok
)) | (1 << (mcReserved_dividetok
-mcReserved_eoftok
)) | (1 << (mcReserved_andtok
-mcReserved_eoftok
)) | (1 << (mcReserved_ambersandtok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_divtok
-mcReserved_arraytok
)) | (1 << (mcReserved_modtok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_remtok
-mcReserved_recordtok
))));
5591 Factor := Number | string | SetOrDesignatorOrFunction |
5592 '(' Expression ')' |
5593 'NOT' ( Factor | ConstAttribute )
5595 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok
5600 static void Factor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5602 if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
))))) != 0)))
5604 Number (stopset0
, stopset1
, stopset2
);
5606 else if (mcLexBuf_currenttoken
== mcReserved_stringtok
)
5608 /* avoid dangling else. */
5609 string (stopset0
, stopset1
, stopset2
);
5611 else if ((mcLexBuf_currenttoken
== mcReserved_lcbratok
) || (mcLexBuf_currenttoken
== mcReserved_identtok
))
5613 /* avoid dangling else. */
5614 SetOrDesignatorOrFunction (stopset0
, stopset1
, stopset2
);
5616 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
5618 /* avoid dangling else. */
5619 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5620 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5621 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
5623 else if (mcLexBuf_currenttoken
== mcReserved_nottok
)
5625 /* avoid dangling else. */
5626 Expect (mcReserved_nottok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5627 if ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_nottok
)) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))))) != 0))))
5629 Factor (stopset0
, stopset1
, stopset2
);
5631 else if (mcLexBuf_currenttoken
== mcReserved_attributetok
)
5633 /* avoid dangling else. */
5634 ConstAttribute (stopset0
, stopset1
, stopset2
);
5638 /* avoid dangling else. */
5639 ErrorArray ((const char *) "expecting one of: __ATTRIBUTE__ real number integer number string ( NOT { identifier", 84);
5644 /* avoid dangling else. */
5645 ErrorArray ((const char *) "expecting one of: NOT ( identifier { string integer number real number", 70);
5651 SetOrDesignatorOrFunction := Qualident [ Constructor |
5653 [ ActualParameters ] ] |
5656 first symbols:lcbratok, identtok
5661 static void SetOrDesignatorOrFunction (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5663 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
5665 /* avoid dangling else. */
5666 Qualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lcbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_periodtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_uparrowtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5667 if ((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_uparrowtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_periodtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0)))
5669 /* avoid gcc warning by using compound statement even if not strictly necessary. */
5670 /* seen optional [ | ] expression */
5671 if (mcLexBuf_currenttoken
== mcReserved_lcbratok
)
5673 Constructor (stopset0
, stopset1
, stopset2
);
5675 else if ((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_uparrowtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_periodtok
-mcReserved_eoftok
))))) != 0)))
5677 /* avoid dangling else. */
5678 SimpleDes (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5679 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
5681 ActualParameters (stopset0
, stopset1
, stopset2
);
5686 /* avoid dangling else. */
5687 ErrorArray ((const char *) "expecting one of: ( ^ [ . {", 27);
5690 /* end of optional [ | ] expression */
5692 else if (mcLexBuf_currenttoken
== mcReserved_lcbratok
)
5694 /* avoid dangling else. */
5695 Constructor (stopset0
, stopset1
, stopset2
);
5699 /* avoid dangling else. */
5700 ErrorArray ((const char *) "expecting one of: { identifier", 30);
5706 SimpleDes := { SubDesignator }
5708 first symbols:periodtok, lsbratok, uparrowtok
5713 static void SimpleDes (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5715 while ((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_uparrowtok
-mcReserved_eoftok
))))) != 0)))
5717 SubDesignator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_uparrowtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5724 ActualParameters := '(' [ ExpList ] ')'
5726 first symbols:lparatok
5731 static void ActualParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5733 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5734 if ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_nottok
)) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))))) != 0))))
5736 ExpList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5738 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
5743 ExitStatement := 'EXIT'
5745 first symbols:exittok
5750 static void ExitStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5752 Expect (mcReserved_exittok
, stopset0
, stopset1
, stopset2
);
5757 ReturnStatement := 'RETURN' [ Expression ]
5759 first symbols:returntok
5764 static void ReturnStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5766 Expect (mcReserved_returntok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5767 if ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_nottok
)) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))))) != 0))))
5769 Expression (stopset0
, stopset1
, stopset2
);
5775 Statement := [ AssignmentOrProcedureCall |
5776 IfStatement | CaseStatement |
5779 LoopStatement | ForStatement |
5780 WithStatement | AsmStatement |
5781 ExitStatement | ReturnStatement |
5784 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok
5789 static void Statement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5791 if ((((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
))))) != 0))) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_retrytok
-mcReserved_recordtok
)) | (1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))))) != 0))))
5793 /* avoid gcc warning by using compound statement even if not strictly necessary. */
5794 /* seen optional [ | ] expression */
5795 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
5797 AssignmentOrProcedureCall (stopset0
, stopset1
, stopset2
);
5799 else if (mcLexBuf_currenttoken
== mcReserved_iftok
)
5801 /* avoid dangling else. */
5802 IfStatement (stopset0
, stopset1
, stopset2
);
5804 else if (mcLexBuf_currenttoken
== mcReserved_casetok
)
5806 /* avoid dangling else. */
5807 CaseStatement (stopset0
, stopset1
, stopset2
);
5809 else if (mcLexBuf_currenttoken
== mcReserved_whiletok
)
5811 /* avoid dangling else. */
5812 WhileStatement (stopset0
, stopset1
, stopset2
);
5814 else if (mcLexBuf_currenttoken
== mcReserved_repeattok
)
5816 /* avoid dangling else. */
5817 RepeatStatement (stopset0
, stopset1
, stopset2
);
5819 else if (mcLexBuf_currenttoken
== mcReserved_looptok
)
5821 /* avoid dangling else. */
5822 LoopStatement (stopset0
, stopset1
, stopset2
);
5824 else if (mcLexBuf_currenttoken
== mcReserved_fortok
)
5826 /* avoid dangling else. */
5827 ForStatement (stopset0
, stopset1
, stopset2
);
5829 else if (mcLexBuf_currenttoken
== mcReserved_withtok
)
5831 /* avoid dangling else. */
5832 WithStatement (stopset0
, stopset1
, stopset2
);
5834 else if (mcLexBuf_currenttoken
== mcReserved_asmtok
)
5836 /* avoid dangling else. */
5837 AsmStatement (stopset0
, stopset1
, stopset2
);
5839 else if (mcLexBuf_currenttoken
== mcReserved_exittok
)
5841 /* avoid dangling else. */
5842 ExitStatement (stopset0
, stopset1
, stopset2
);
5844 else if (mcLexBuf_currenttoken
== mcReserved_returntok
)
5846 /* avoid dangling else. */
5847 ReturnStatement (stopset0
, stopset1
, stopset2
);
5849 else if (mcLexBuf_currenttoken
== mcReserved_retrytok
)
5851 /* avoid dangling else. */
5852 RetryStatement (stopset0
, stopset1
, stopset2
);
5856 /* avoid dangling else. */
5857 ErrorArray ((const char *) "expecting one of: RETRY RETURN EXIT ASM WITH FOR LOOP REPEAT WHILE CASE IF identifier", 85);
5860 /* end of optional [ | ] expression */
5865 RetryStatement := 'RETRY'
5867 first symbols:retrytok
5872 static void RetryStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5874 Expect (mcReserved_retrytok
, stopset0
, stopset1
, stopset2
);
5879 AssignmentOrProcedureCall := Designator ( ':=' Expression |
5885 first symbols:identtok
5890 static void AssignmentOrProcedureCall (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5892 Designator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_becomestok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5893 if (mcLexBuf_currenttoken
== mcReserved_becomestok
)
5895 Expect (mcReserved_becomestok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5896 Expression (stopset0
, stopset1
, stopset2
);
5898 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
5900 /* avoid dangling else. */
5901 ActualParameters (stopset0
, stopset1
, stopset2
);
5908 StatementSequence := Statement { ';' Statement }
5910 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok
5915 static void StatementSequence (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5917 Statement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5918 while (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
5920 Expect (mcReserved_semicolontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5921 Statement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5928 IfStatement := 'IF' Expression 'THEN' StatementSequence
5929 { 'ELSIF' Expression 'THEN' StatementSequence }
5930 [ 'ELSE' StatementSequence ] 'END'
5937 static void IfStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5939 Expect (mcReserved_iftok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5940 Expression (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_thentok
-mcReserved_recordtok
))));
5941 Expect (mcReserved_thentok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsiftok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
5942 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_elsiftok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
5943 while (mcLexBuf_currenttoken
== mcReserved_elsiftok
)
5945 Expect (mcReserved_elsiftok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5946 Expression (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_thentok
-mcReserved_recordtok
))));
5947 Expect (mcReserved_thentok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsiftok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
5948 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsiftok
-mcReserved_arraytok
))), stopset2
);
5951 if (mcLexBuf_currenttoken
== mcReserved_elsetok
)
5953 Expect (mcReserved_elsetok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
5954 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
5956 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
5961 CaseStatement := 'CASE' Expression 'OF' Case { '|'
5965 first symbols:casetok
5970 static void CaseStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5972 Expect (mcReserved_casetok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5973 Expression (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
5974 Expect (mcReserved_oftok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
5975 Case (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
5976 while (mcLexBuf_currenttoken
== mcReserved_bartok
)
5978 Expect (mcReserved_bartok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
5979 Case (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
))), stopset2
);
5982 CaseEndStatement (stopset0
, stopset1
, stopset2
);
5987 CaseEndStatement := 'END' | 'ELSE' StatementSequence
5990 first symbols:elsetok, endtok
5995 static void CaseEndStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5997 if (mcLexBuf_currenttoken
== mcReserved_endtok
)
5999 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6001 else if (mcLexBuf_currenttoken
== mcReserved_elsetok
)
6003 /* avoid dangling else. */
6004 Expect (mcReserved_elsetok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6005 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6006 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6010 /* avoid dangling else. */
6011 ErrorArray ((const char *) "expecting one of: ELSE END", 26);
6017 Case := [ CaseLabelList ':' StatementSequence ]
6019 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
6024 static void Case (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6026 if ((((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_nottok
)) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))))) != 0))))
6028 CaseLabelList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6029 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6030 StatementSequence (stopset0
, stopset1
, stopset2
);
6036 CaseLabelList := CaseLabels { ',' CaseLabels }
6038 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
6043 static void CaseLabelList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6045 CaseLabels (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6046 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
6048 Expect (mcReserved_commatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))));
6049 CaseLabels (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6056 CaseLabels := ConstExpressionNop [ '..' ConstExpressionNop ]
6058 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
6063 static void CaseLabels (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6065 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6066 if (mcLexBuf_currenttoken
== mcReserved_periodperiodtok
)
6068 Expect (mcReserved_periodperiodtok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
6069 ConstExpressionNop (stopset0
, stopset1
, stopset2
);
6075 WhileStatement := 'WHILE' Expression 'DO' StatementSequence
6078 first symbols:whiletok
6083 static void WhileStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6085 Expect (mcReserved_whiletok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6086 Expression (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_dotok
-mcReserved_arraytok
))), stopset2
);
6087 Expect (mcReserved_dotok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6088 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6089 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6094 RepeatStatement := 'REPEAT' StatementSequence 'UNTIL'
6097 first symbols:repeattok
6102 static void RepeatStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6104 Expect (mcReserved_repeattok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_untiltok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6105 StatementSequence (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_untiltok
-mcReserved_recordtok
))));
6106 Expect (mcReserved_untiltok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6107 Expression (stopset0
, stopset1
, stopset2
);
6112 ForStatement := 'FOR' Ident ':=' Expression 'TO'
6113 Expression [ 'BY' ConstExpressionNop ]
6114 'DO' StatementSequence 'END'
6116 first symbols:fortok
6121 static void ForStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6123 Expect (mcReserved_fortok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6124 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_becomestok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6125 Expect (mcReserved_becomestok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6126 Expression (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_totok
-mcReserved_recordtok
))));
6127 Expect (mcReserved_totok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6128 Expression (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_bytok
-mcReserved_arraytok
)) | (1 << (mcReserved_dotok
-mcReserved_arraytok
))), stopset2
);
6129 if (mcLexBuf_currenttoken
== mcReserved_bytok
)
6131 Expect (mcReserved_bytok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
6132 ConstExpressionNop (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_dotok
-mcReserved_arraytok
))), stopset2
);
6134 Expect (mcReserved_dotok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6135 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6136 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6141 LoopStatement := 'LOOP' StatementSequence 'END'
6143 first symbols:looptok
6148 static void LoopStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6150 Expect (mcReserved_looptok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6151 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6152 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6157 WithStatement := 'WITH' Designator 'DO' StatementSequence
6160 first symbols:withtok
6165 static void WithStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6167 Expect (mcReserved_withtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6168 Designator (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_dotok
-mcReserved_arraytok
))), stopset2
);
6169 Expect (mcReserved_dotok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6170 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6171 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6176 ProcedureDeclaration := ProcedureHeading ';' ProcedureBlock
6181 first symbols:proceduretok
6186 static void ProcedureDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6188 ProcedureHeading (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6189 Expect (mcReserved_semicolontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
6190 ProcedureBlock (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6191 Ident (stopset0
, stopset1
, stopset2
);
6197 ProcedureIdent := Ident
6198 % curproc := lookupSym (curident) %
6200 % enterScope (curproc) %
6203 first symbols:identtok
6208 static void ProcedureIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6210 Ident (stopset0
, stopset1
, stopset2
);
6211 curproc
= decl_lookupSym (curident
);
6212 decl_enterScope (curproc
);
6217 DefProcedureIdent := Ident
6218 % curproc := lookupSym (curident) %
6221 first symbols:identtok
6226 static void DefProcedureIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6228 Ident (stopset0
, stopset1
, stopset2
);
6229 curproc
= decl_lookupSym (curident
);
6234 DefineBuiltinProcedure := [ '__ATTRIBUTE__' '__BUILTIN__'
6235 '(' '(' Ident ')' ')' |
6238 first symbols:inlinetok, attributetok
6243 static void DefineBuiltinProcedure (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6245 if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))))) != 0)))
6247 /* avoid gcc warning by using compound statement even if not strictly necessary. */
6248 /* seen optional [ | ] expression */
6249 if (mcLexBuf_currenttoken
== mcReserved_attributetok
)
6251 Expect (mcReserved_attributetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_builtintok
-mcReserved_recordtok
))));
6252 Expect (mcReserved_builtintok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6253 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6254 Expect (mcReserved_lparatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6255 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6256 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6257 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
6259 else if (mcLexBuf_currenttoken
== mcReserved_inlinetok
)
6261 /* avoid dangling else. */
6262 Expect (mcReserved_inlinetok
, stopset0
, stopset1
, stopset2
);
6266 /* avoid dangling else. */
6267 ErrorArray ((const char *) "expecting one of: __INLINE__ __ATTRIBUTE__", 42);
6270 /* end of optional [ | ] expression */
6275 ProcedureHeading := 'PROCEDURE' DefineBuiltinProcedure
6276 ( ProcedureIdent [ FormalParameters ]
6279 first symbols:proceduretok
6284 static void ProcedureHeading (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6286 Expect (mcReserved_proceduretok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6287 DefineBuiltinProcedure (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6288 ProcedureIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6289 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
6291 FormalParameters (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6293 AttributeNoReturn (stopset0
, stopset1
, stopset2
);
6298 Builtin := [ '__BUILTIN__' | '__INLINE__' ]
6300 first symbols:inlinetok, builtintok
6305 static void Builtin (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6307 if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) | (1 << (mcReserved_builtintok
-mcReserved_recordtok
))))) != 0)))
6309 /* avoid gcc warning by using compound statement even if not strictly necessary. */
6310 /* seen optional [ | ] expression */
6311 if (mcLexBuf_currenttoken
== mcReserved_builtintok
)
6313 Expect (mcReserved_builtintok
, stopset0
, stopset1
, stopset2
);
6315 else if (mcLexBuf_currenttoken
== mcReserved_inlinetok
)
6317 /* avoid dangling else. */
6318 Expect (mcReserved_inlinetok
, stopset0
, stopset1
, stopset2
);
6322 /* avoid dangling else. */
6323 ErrorArray ((const char *) "expecting one of: __INLINE__ __BUILTIN__", 40);
6326 /* end of optional [ | ] expression */
6331 DefProcedureHeading := 'PROCEDURE' Builtin ( DefProcedureIdent
6332 [ DefFormalParameters ]
6335 first symbols:proceduretok
6340 static void DefProcedureHeading (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6342 Expect (mcReserved_proceduretok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) | (1 << (mcReserved_builtintok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6343 Builtin (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6344 DefProcedureIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6345 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
6347 DefFormalParameters (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6349 AttributeNoReturn (stopset0
, stopset1
, stopset2
);
6354 ProcedureBlock := { Declaration } [ 'BEGIN' ProcedureBlockBody ]
6357 first symbols:proceduretok, moduletok, consttok, typetok, vartok, endtok, begintok
6362 static void ProcedureBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6364 while ((((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
))))) != 0))) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))))) != 0))))
6366 Declaration (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
6369 if (mcLexBuf_currenttoken
== mcReserved_begintok
)
6371 Expect (mcReserved_begintok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_excepttok
-mcReserved_arraytok
)) | (1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6372 ProcedureBlockBody (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6374 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6379 Block := { Declaration } InitialBlock FinalBlock
6382 first symbols:proceduretok, moduletok, finallytok, begintok, consttok, typetok, vartok, endtok
6387 static void Block (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6389 while ((((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
))))) != 0))) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))))) != 0))))
6391 Declaration (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
6394 InitialBlock (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
))), stopset2
);
6395 FinalBlock (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6396 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6401 InitialBlock := [ 'BEGIN' InitialBlockBody ]
6403 first symbols:begintok
6408 static void InitialBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6410 if (mcLexBuf_currenttoken
== mcReserved_begintok
)
6412 Expect (mcReserved_begintok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_excepttok
-mcReserved_arraytok
)) | (1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6413 InitialBlockBody (stopset0
, stopset1
, stopset2
);
6419 FinalBlock := [ 'FINALLY' FinalBlockBody ]
6421 first symbols:finallytok
6426 static void FinalBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6428 if (mcLexBuf_currenttoken
== mcReserved_finallytok
)
6430 Expect (mcReserved_finallytok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_excepttok
-mcReserved_arraytok
)) | (1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
))));
6431 FinalBlockBody (stopset0
, stopset1
, stopset2
);
6437 InitialBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
6439 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
6444 static void InitialBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6446 NormalPart (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_excepttok
-mcReserved_arraytok
))), stopset2
);
6447 if (mcLexBuf_currenttoken
== mcReserved_excepttok
)
6449 Expect (mcReserved_excepttok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6450 ExceptionalPart (stopset0
, stopset1
, stopset2
);
6456 FinalBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
6458 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
6463 static void FinalBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6465 NormalPart (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_excepttok
-mcReserved_arraytok
))), stopset2
);
6466 if (mcLexBuf_currenttoken
== mcReserved_excepttok
)
6468 Expect (mcReserved_excepttok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6469 ExceptionalPart (stopset0
, stopset1
, stopset2
);
6475 ProcedureBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
6477 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
6482 static void ProcedureBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6484 NormalPart (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_excepttok
-mcReserved_arraytok
))), stopset2
);
6485 if (mcLexBuf_currenttoken
== mcReserved_excepttok
)
6487 Expect (mcReserved_excepttok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_exittok
-mcReserved_arraytok
)) | (1 << (mcReserved_fortok
-mcReserved_arraytok
)) | (1 << (mcReserved_looptok
-mcReserved_arraytok
)) | (1 << (mcReserved_casetok
-mcReserved_arraytok
)) | (1 << (mcReserved_iftok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_returntok
-mcReserved_recordtok
)) | (1 << (mcReserved_retrytok
-mcReserved_recordtok
)) | (1 << (mcReserved_asmtok
-mcReserved_recordtok
)) | (1 << (mcReserved_withtok
-mcReserved_recordtok
)) | (1 << (mcReserved_repeattok
-mcReserved_recordtok
)) | (1 << (mcReserved_whiletok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6488 ExceptionalPart (stopset0
, stopset1
, stopset2
);
6494 NormalPart := StatementSequence
6496 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
6501 static void NormalPart (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6503 StatementSequence (stopset0
, stopset1
, stopset2
);
6508 ExceptionalPart := StatementSequence
6510 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
6515 static void ExceptionalPart (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6517 StatementSequence (stopset0
, stopset1
, stopset2
);
6522 Declaration := 'CONST' { ConstantDeclaration ';' } |
6523 'TYPE' { TypeDeclaration } |
6524 'VAR' { VariableDeclaration ';' } |
6525 ProcedureDeclaration ';' |
6526 ModuleDeclaration ';'
6528 first symbols:moduletok, proceduretok, vartok, typetok, consttok
6533 static void Declaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6535 if (mcLexBuf_currenttoken
== mcReserved_consttok
)
6537 Expect (mcReserved_consttok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6538 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
6540 ConstantDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6541 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6545 else if (mcLexBuf_currenttoken
== mcReserved_typetok
)
6547 /* avoid dangling else. */
6548 Expect (mcReserved_typetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6549 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
6551 TypeDeclaration (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6555 else if (mcLexBuf_currenttoken
== mcReserved_vartok
)
6557 /* avoid dangling else. */
6558 Expect (mcReserved_vartok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6559 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
6561 VariableDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6562 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6566 else if (mcLexBuf_currenttoken
== mcReserved_proceduretok
)
6568 /* avoid dangling else. */
6569 ProcedureDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6570 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
6572 else if (mcLexBuf_currenttoken
== mcReserved_moduletok
)
6574 /* avoid dangling else. */
6575 ModuleDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6576 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
6580 /* avoid dangling else. */
6581 ErrorArray ((const char *) "expecting one of: MODULE PROCEDURE VAR TYPE CONST", 49);
6587 DefFormalParameters := '('
6588 % paramEnter (curproc) %
6589 [ DefMultiFPSection ] ')'
6591 % paramLeave (curproc) %
6594 first symbols:lparatok
6599 static void DefFormalParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6601 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
6602 decl_paramEnter (curproc
);
6603 if ((mcLexBuf_currenttoken
== mcReserved_lsbratok
) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))))) != 0))))
6605 DefMultiFPSection (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6607 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6608 decl_paramLeave (curproc
);
6609 FormalReturn (stopset0
, stopset1
, stopset2
);
6614 DefMultiFPSection := DefExtendedFP |
6615 FPSection [ ';' DefMultiFPSection ]
6617 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
6622 static void DefMultiFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6624 if ((mcLexBuf_currenttoken
== mcReserved_lsbratok
) || (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
))
6626 DefExtendedFP (stopset0
, stopset1
, stopset2
);
6628 else if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))))) != 0)))
6630 /* avoid dangling else. */
6631 FPSection (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6632 if (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
6634 Expect (mcReserved_semicolontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
6635 DefMultiFPSection (stopset0
, stopset1
, stopset2
);
6640 /* avoid dangling else. */
6641 ErrorArray ((const char *) "expecting one of: identifier VAR ... [", 38);
6647 FormalParameters := '('
6648 % paramEnter (curproc) %
6649 [ MultiFPSection ] ')'
6650 % paramLeave (curproc) %
6653 first symbols:lparatok
6658 static void FormalParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6660 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
6661 decl_paramEnter (curproc
);
6662 if ((mcLexBuf_currenttoken
== mcReserved_lsbratok
) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))))) != 0))))
6664 MultiFPSection (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6666 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6667 decl_paramLeave (curproc
);
6668 FormalReturn (stopset0
, stopset1
, stopset2
);
6673 AttributeNoReturn := [ NoReturn |
6674 % setNoReturn (curproc, FALSE) %
6677 first symbols:ldirectivetok
6682 static void AttributeNoReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6684 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6686 /* avoid gcc warning by using compound statement even if not strictly necessary. */
6687 /* seen optional [ | ] expression */
6688 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6690 NoReturn (stopset0
, stopset1
, stopset2
);
6694 decl_setNoReturn (curproc
, FALSE
);
6697 /* end of optional [ | ] expression */
6704 first symbols:ldirectivetok
6709 static void NoReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6711 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6712 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6713 decl_setNoReturn (curproc
, TRUE
);
6714 checkReturnAttribute ();
6715 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
6720 AttributeUnused := [ Unused ]
6722 first symbols:ldirectivetok
6727 static void AttributeUnused (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6729 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6731 Unused (stopset0
, stopset1
, stopset2
);
6739 first symbols:ldirectivetok
6744 static void Unused (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6746 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6747 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6749 checkParameterAttribute ();
6750 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
6755 MultiFPSection := ExtendedFP | FPSection [ ';'
6758 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
6763 static void MultiFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6765 if ((mcLexBuf_currenttoken
== mcReserved_lsbratok
) || (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
))
6767 ExtendedFP (stopset0
, stopset1
, stopset2
);
6769 else if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))))) != 0)))
6771 /* avoid dangling else. */
6772 FPSection (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6773 if (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
6775 Expect (mcReserved_semicolontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
6776 MultiFPSection (stopset0
, stopset1
, stopset2
);
6781 /* avoid dangling else. */
6782 ErrorArray ((const char *) "expecting one of: identifier VAR ... [", 38);
6788 FPSection := NonVarFPSection |
6791 first symbols:vartok, identtok
6796 static void FPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6798 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
6800 NonVarFPSection (stopset0
, stopset1
, stopset2
);
6802 else if (mcLexBuf_currenttoken
== mcReserved_vartok
)
6804 /* avoid dangling else. */
6805 VarFPSection (stopset0
, stopset1
, stopset2
);
6809 /* avoid dangling else. */
6810 ErrorArray ((const char *) "expecting one of: VAR identifier", 32);
6816 DefExtendedFP := DefOptArg | '...'
6817 % addParameter (curproc, makeVarargs ()) %
6820 first symbols:lsbratok, periodperiodperiodtok
6825 static void DefExtendedFP (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6827 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
6829 DefOptArg (stopset0
, stopset1
, stopset2
);
6831 else if (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
)
6833 /* avoid dangling else. */
6834 Expect (mcReserved_periodperiodperiodtok
, stopset0
, stopset1
, stopset2
);
6835 decl_addParameter (curproc
, decl_makeVarargs ());
6839 /* avoid dangling else. */
6840 ErrorArray ((const char *) "expecting one of: ... [", 23);
6846 ExtendedFP := OptArg | '...'
6848 first symbols:lsbratok, periodperiodperiodtok
6853 static void ExtendedFP (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6855 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
6857 OptArg (stopset0
, stopset1
, stopset2
);
6859 else if (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
)
6861 /* avoid dangling else. */
6862 Expect (mcReserved_periodperiodperiodtok
, stopset0
, stopset1
, stopset2
);
6866 /* avoid dangling else. */
6867 ErrorArray ((const char *) "expecting one of: ... [", 23);
6873 VarFPSection := 'VAR' PushIdentList
6874 % VAR l, t: node ; %
6880 % curisused := TRUE %
6882 % addVarParameters (curproc, l, t, curisused) %
6885 first symbols:vartok
6890 static void VarFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6895 Expect (mcReserved_vartok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6896 PushIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6897 Expect (mcReserved_colontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6898 FormalType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6902 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6904 AttributeUnused (stopset0
, stopset1
, stopset2
);
6906 decl_addVarParameters (curproc
, l
, t
, curisused
);
6911 NonVarFPSection := PushIdentList
6912 % VAR l, t: node ; %
6918 % curisused := TRUE %
6920 % addNonVarParameters (curproc, l, t, curisused) %
6923 first symbols:identtok
6928 static void NonVarFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6933 PushIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6934 Expect (mcReserved_colontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6935 FormalType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6939 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6941 AttributeUnused (stopset0
, stopset1
, stopset2
);
6943 decl_addNonVarParameters (curproc
, l
, t
, curisused
);
6949 % VAR p, init, type: node ; id: Name ; %
6956 [ '=' ConstExpression
6959 % p := addOptParameter (curproc, id, type, init) %
6962 first symbols:lsbratok
6967 static void OptArg (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6974 Expect (mcReserved_lsbratok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6975 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6977 Expect (mcReserved_colontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6978 FormalType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_equaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6980 init
= static_cast<decl_node
> (NULL
);
6981 if (mcLexBuf_currenttoken
== mcReserved_equaltok
)
6983 Expect (mcReserved_equaltok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
6984 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6987 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
6988 p
= decl_addOptParameter (curproc
, id
, type
, init
);
6994 % VAR p, init, type: node ; id: Name ; %
7002 % p := addOptParameter (curproc, id, type, init) %
7005 first symbols:lsbratok
7010 static void DefOptArg (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7017 Expect (mcReserved_lsbratok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7018 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7020 Expect (mcReserved_colontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7021 FormalType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_equaltok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7023 Expect (mcReserved_equaltok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7024 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7026 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
7027 p
= decl_addOptParameter (curproc
, id
, type
, init
);
7033 % VAR c: CARDINAL ; %
7035 % VAR n, a, s: node ; %
7041 % pushNunbounded (c) %
7044 first symbols:identtok, arraytok
7049 static void FormalType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7057 while (mcLexBuf_currenttoken
== mcReserved_arraytok
)
7059 Expect (mcReserved_arraytok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
7060 Expect (mcReserved_oftok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7064 PushQualident (stopset0
, stopset1
, stopset2
);
7070 ModuleDeclaration := 'MODULE' Ident [ Priority ]
7071 ';' { Import } [ Export ]
7074 first symbols:moduletok
7079 static void ModuleDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7081 Expect (mcReserved_moduletok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7082 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7083 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
7085 Priority (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7087 Expect (mcReserved_semicolontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_importtok
-mcReserved_arraytok
)) | (1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_exporttok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
7088 while (((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_importtok
-mcReserved_arraytok
))))) != 0)))
7090 Import (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
)) | (1 << (mcReserved_exporttok
-mcReserved_arraytok
)) | (1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_importtok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_typetok
-mcReserved_recordtok
))));
7093 if (mcLexBuf_currenttoken
== mcReserved_exporttok
)
7095 Export (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_begintok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
)) | (1 << (mcReserved_moduletok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_typetok
-mcReserved_recordtok
))));
7097 Block (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7098 Ident (stopset0
, stopset1
, stopset2
);
7103 Priority := '[' ConstExpressionNop ']'
7105 first symbols:lsbratok
7110 static void Priority (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7112 Expect (mcReserved_lsbratok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7113 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7114 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
7119 Export := 'EXPORT' ( 'QUALIFIED' IdentList |
7120 'UNQUALIFIED' IdentList |
7123 first symbols:exporttok
7128 static void Export (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7130 Expect (mcReserved_exporttok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_qualifiedtok
-mcReserved_arraytok
)) | (1 << (mcReserved_unqualifiedtok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7131 if (mcLexBuf_currenttoken
== mcReserved_qualifiedtok
)
7133 Expect (mcReserved_qualifiedtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7134 IdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7136 else if (mcLexBuf_currenttoken
== mcReserved_unqualifiedtok
)
7138 /* avoid dangling else. */
7139 Expect (mcReserved_unqualifiedtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7140 IdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7142 else if (mcLexBuf_currenttoken
== mcReserved_identtok
)
7144 /* avoid dangling else. */
7145 IdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7149 /* avoid dangling else. */
7150 ErrorArray ((const char *) "expecting one of: identifier UNQUALIFIED QUALIFIED", 50);
7152 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
7157 FromIdentList := Ident
7158 % importInto (frommodule, curident, curmodule) %
7160 % importInto (frommodule, curident, curmodule) %
7163 first symbols:identtok
7168 static void FromIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7170 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7171 importInto (frommodule
, curident
, curmodule
);
7172 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7174 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7175 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7176 importInto (frommodule
, curident
, curmodule
);
7183 FromImport := 'FROM' Ident
7184 % frommodule := lookupDef (curident) %
7185 'IMPORT' FromIdentList ';'
7187 first symbols:fromtok
7192 static void FromImport (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7194 Expect (mcReserved_fromtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7195 Ident (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_importtok
-mcReserved_arraytok
))), stopset2
);
7196 frommodule
= decl_lookupDef (curident
);
7197 Expect (mcReserved_importtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7198 FromIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7199 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
7204 ImportModuleList := Ident { ',' Ident }
7206 first symbols:identtok
7211 static void ImportModuleList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7213 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7214 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7216 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7217 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7224 WithoutFromImport := 'IMPORT' ImportModuleList ';'
7226 first symbols:importtok
7231 static void WithoutFromImport (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7233 Expect (mcReserved_importtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7234 ImportModuleList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7235 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
7240 Import := FromImport | WithoutFromImport
7242 first symbols:importtok, fromtok
7247 static void Import (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7249 if (mcLexBuf_currenttoken
== mcReserved_fromtok
)
7251 FromImport (stopset0
, stopset1
, stopset2
);
7253 else if (mcLexBuf_currenttoken
== mcReserved_importtok
)
7255 /* avoid dangling else. */
7256 WithoutFromImport (stopset0
, stopset1
, stopset2
);
7260 /* avoid dangling else. */
7261 ErrorArray ((const char *) "expecting one of: IMPORT FROM", 29);
7267 DefinitionModule := 'DEFINITION' 'MODULE' [ 'FOR'
7270 % curmodule := lookupDef (curident) %
7272 % enterScope (curmodule) %
7274 % resetEnumPos (curmodule) %
7275 { Import } [ Export ] { Definition }
7277 % checkEndName (curmodule, curident, 'definition module') %
7279 % setConstExpComplete (curmodule) %
7284 first symbols:definitiontok
7289 static void DefinitionModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7291 Expect (mcReserved_definitiontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
);
7292 Expect (mcReserved_moduletok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7293 if (mcLexBuf_currenttoken
== mcReserved_fortok
)
7295 Expect (mcReserved_fortok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7296 string (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7298 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7299 Expect (mcReserved_semicolontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_importtok
-mcReserved_arraytok
)) | (1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_exporttok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_vartok
-mcReserved_recordtok
)) | (1 << (mcReserved_typetok
-mcReserved_recordtok
))));
7300 curmodule
= decl_lookupDef (curident
);
7301 decl_enterScope (curmodule
);
7302 decl_resetEnumPos (curmodule
);
7303 while (((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_importtok
-mcReserved_arraytok
))))) != 0)))
7305 Import (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_exporttok
-mcReserved_arraytok
)) | (1 << (mcReserved_fromtok
-mcReserved_arraytok
)) | (1 << (mcReserved_importtok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
7308 if (mcLexBuf_currenttoken
== mcReserved_exporttok
)
7310 Export (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
7312 while ((((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
))))) != 0))) || ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))))) != 0))))
7314 Definition (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_consttok
-mcReserved_arraytok
)) | (1 << (mcReserved_proceduretok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_typetok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))));
7317 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7318 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7319 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
);
7320 checkEndName (curmodule
, curident
, (const char *) "definition module", 17);
7321 decl_setConstExpComplete (curmodule
);
7327 PushQualident := Ident
7328 % typeExp := push (lookupSym (curident)) %
7332 metaError1 ('the symbol {%1k} is not visible in this scope (or any other nested scope)', curident)
7335 % IF NOT isDef (typeExp)
7337 ErrorArray ('the first component of this qualident must be a definition module')
7340 % typeExp := replace (lookupInScope (typeExp, curident)) ;
7343 ErrorArray ('identifier not found in definition module')
7347 first symbols:identtok
7352 static void PushQualident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7354 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7355 typeExp
= push (decl_lookupSym (curident
));
7356 if (typeExp
== NULL
)
7358 mcMetaError_metaError1 ((const char *) "the symbol {%1k} is not visible in this scope (or any other nested scope)", 73, (const unsigned char *) &curident
, (sizeof (curident
)-1));
7360 if (mcLexBuf_currenttoken
== mcReserved_periodtok
)
7362 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7363 if (! (decl_isDef (typeExp
)))
7365 ErrorArray ((const char *) "the first component of this qualident must be a definition module", 65);
7367 Ident (stopset0
, stopset1
, stopset2
);
7368 typeExp
= replace (decl_lookupInScope (typeExp
, curident
));
7369 if (typeExp
== NULL
)
7371 ErrorArray ((const char *) "identifier not found in definition module", 41);
7378 OptSubrange := [ SubrangeType
7379 % VAR q, s: node ; %
7385 % putSubrangeType (s, q) %
7387 % typeExp := push (s) %
7390 first symbols:lsbratok
7395 static void OptSubrange (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7400 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
7402 SubrangeType (stopset0
, stopset1
, stopset2
);
7405 decl_putSubrangeType (s
, q
);
7412 TypeEquiv := PushQualident OptSubrange
7414 first symbols:identtok
7419 static void TypeEquiv (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7421 PushQualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7422 OptSubrange (stopset0
, stopset1
, stopset2
);
7430 % typeExp := push (makeEnum ()) %
7432 % f := makeEnumField (typeExp, curident) %
7434 % f := makeEnumField (typeExp, curident) %
7437 first symbols:identtok
7442 static void EnumIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7446 typeExp
= push (decl_makeEnum ());
7447 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7448 f
= decl_makeEnumField (typeExp
, curident
);
7449 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7451 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7452 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7453 f
= decl_makeEnumField (typeExp
, curident
);
7460 Enumeration := '(' EnumIdentList ')'
7462 first symbols:lparatok
7467 static void Enumeration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7469 Expect (mcReserved_lparatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7470 EnumIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7471 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
7477 % VAR d: CARDINAL ; %
7480 ( TypeEquiv | Enumeration |
7482 % assert (d = depth () - 1) %
7485 first symbols:lsbratok, lparatok, identtok
7490 static void SimpleType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7495 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
7497 TypeEquiv (stopset0
, stopset1
, stopset2
);
7499 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
7501 /* avoid dangling else. */
7502 Enumeration (stopset0
, stopset1
, stopset2
);
7504 else if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
7506 /* avoid dangling else. */
7507 SubrangeType (stopset0
, stopset1
, stopset2
);
7511 /* avoid dangling else. */
7512 ErrorArray ((const char *) "expecting one of: [ ( identifier", 32);
7514 mcDebug_assert (d
== ((depth ())-1));
7519 Type := SimpleType | ArrayType | RecordType |
7520 SetType | PointerType | ProcedureType
7522 first symbols:proceduretok, pointertok, settok, packedsettok, oftok, recordtok, arraytok, identtok, lparatok, lsbratok
7527 static void Type (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7529 if (((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_identtok
))
7531 SimpleType (stopset0
, stopset1
, stopset2
);
7533 else if (mcLexBuf_currenttoken
== mcReserved_arraytok
)
7535 /* avoid dangling else. */
7536 ArrayType (stopset0
, stopset1
, stopset2
);
7538 else if (mcLexBuf_currenttoken
== mcReserved_recordtok
)
7540 /* avoid dangling else. */
7541 RecordType (stopset0
, stopset1
, stopset2
);
7543 else if ((((mcLexBuf_currenttoken
>= mcReserved_arraytok
) && (mcLexBuf_currenttoken
< mcReserved_recordtok
)) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_arraytok
)) & ((mcp3_SetOfStop1
) ((1 << (mcReserved_packedsettok
-mcReserved_arraytok
)) | (1 << (mcReserved_oftok
-mcReserved_arraytok
))))) != 0))) || (mcLexBuf_currenttoken
== mcReserved_settok
))
7545 /* avoid dangling else. */
7546 SetType (stopset0
, stopset1
, stopset2
);
7548 else if (mcLexBuf_currenttoken
== mcReserved_pointertok
)
7550 /* avoid dangling else. */
7551 PointerType (stopset0
, stopset1
, stopset2
);
7553 else if (mcLexBuf_currenttoken
== mcReserved_proceduretok
)
7555 /* avoid dangling else. */
7556 ProcedureType (stopset0
, stopset1
, stopset2
);
7560 /* avoid dangling else. */
7561 ErrorArray ((const char *) "expecting one of: PROCEDURE POINTER SET PACKEDSET OF RECORD ARRAY identifier ( [", 80);
7567 TypeDeclaration := { Ident
7568 % typeDes := lookupSym (curident) %
7570 % putType (typeDes, pop ()) %
7573 first symbols:identtok
7578 static void TypeDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7580 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
7582 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) | (1 << (mcReserved_equaltok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7583 typeDes
= decl_lookupSym (curident
);
7584 if (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
7586 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7588 else if (mcLexBuf_currenttoken
== mcReserved_equaltok
)
7590 /* avoid dangling else. */
7591 Expect (mcReserved_equaltok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) | (1 << (mcReserved_pointertok
-mcReserved_arraytok
)) | (1 << (mcReserved_packedsettok
-mcReserved_arraytok
)) | (1 << (mcReserved_oftok
-mcReserved_arraytok
)) | (1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_settok
-mcReserved_recordtok
)) | (1 << (mcReserved_recordtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7592 Type (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
)) | (1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7593 decl_putType (typeDes
, pop ());
7594 Alignment (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7595 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7599 /* avoid dangling else. */
7600 ErrorArray ((const char *) "expecting one of: = ;", 21);
7608 Definition := 'CONST' { ConstantDeclaration ';' } |
7609 'TYPE' { TypeDeclaration } |
7610 'VAR' { VariableDeclaration ';' } |
7611 DefProcedureHeading ';'
7613 first symbols:proceduretok, vartok, typetok, consttok
7618 static void Definition (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7620 if (mcLexBuf_currenttoken
== mcReserved_consttok
)
7622 Expect (mcReserved_consttok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7623 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
7625 ConstantDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7626 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7630 else if (mcLexBuf_currenttoken
== mcReserved_typetok
)
7632 /* avoid dangling else. */
7633 Expect (mcReserved_typetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7634 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
7636 TypeDeclaration (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7640 else if (mcLexBuf_currenttoken
== mcReserved_vartok
)
7642 /* avoid dangling else. */
7643 Expect (mcReserved_vartok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7644 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
7646 VariableDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7647 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7651 else if (mcLexBuf_currenttoken
== mcReserved_proceduretok
)
7653 /* avoid dangling else. */
7654 DefProcedureHeading (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7655 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
7659 /* avoid dangling else. */
7660 ErrorArray ((const char *) "expecting one of: PROCEDURE VAR TYPE CONST", 42);
7666 AsmStatement := 'ASM' [ 'VOLATILE' ] '(' AsmOperands
7669 first symbols:asmtok
7674 static void AsmStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7676 Expect (mcReserved_asmtok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_volatiletok
-mcReserved_recordtok
))));
7677 if (mcLexBuf_currenttoken
== mcReserved_volatiletok
)
7679 Expect (mcReserved_volatiletok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7681 Expect (mcReserved_lparatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7682 AsmOperands (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7683 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
7688 AsmOperands := string [ AsmOperandSpec ]
7690 first symbols:stringtok
7695 static void AsmOperands (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7697 string (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7698 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
7700 AsmOperandSpec (stopset0
, stopset1
, stopset2
);
7706 AsmOperandSpec := [ ':' AsmList [ ':' AsmList [
7709 first symbols:colontok
7714 static void AsmOperandSpec (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7716 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
7718 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
)) | (1 << (mcReserved_commatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7719 AsmList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7720 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
7722 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
)) | (1 << (mcReserved_commatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7723 AsmList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7724 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
7726 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7727 TrashList (stopset0
, stopset1
, stopset2
);
7735 AsmList := [ AsmElement ] { ',' AsmElement }
7737 first symbols:lsbratok, stringtok, commatok
7742 static void AsmList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7744 if ((mcLexBuf_currenttoken
== mcReserved_lsbratok
) || (mcLexBuf_currenttoken
== mcReserved_stringtok
))
7746 AsmElement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7748 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7750 Expect (mcReserved_commatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7751 AsmElement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7758 NamedOperand := '[' Ident ']'
7760 first symbols:lsbratok
7765 static void NamedOperand (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7767 Expect (mcReserved_lsbratok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7768 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7769 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
7774 AsmOperandName := [ NamedOperand ]
7776 first symbols:lsbratok
7781 static void AsmOperandName (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7783 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
7785 NamedOperand (stopset0
, stopset1
, stopset2
);
7791 AsmElement := AsmOperandName string '(' Expression
7794 first symbols:stringtok, lsbratok
7799 static void AsmElement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7801 AsmOperandName (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7802 string (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7803 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_nottok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) | (1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7804 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7805 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
7810 TrashList := [ string ] { ',' string }
7812 first symbols:commatok, stringtok
7817 static void TrashList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7819 if (mcLexBuf_currenttoken
== mcReserved_stringtok
)
7821 string (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7823 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7825 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7826 string (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7833 CompilationUnit - returns TRUE if the input was correct enough to parse
7837 extern "C" unsigned int mcp3_CompilationUnit (void)
7839 stk
= mcStack_init ();
7841 FileUnit ((mcp3_SetOfStop0
) ((1 << (mcReserved_eoftok
-mcReserved_eoftok
))), (mcp3_SetOfStop1
) 0, (mcp3_SetOfStop2
) 0);
7842 mcStack_kill (&stk
);
7844 /* static analysis guarentees a RETURN statement will be used before here. */
7845 __builtin_unreachable ();
7848 extern "C" void _M2_mcp3_init (__attribute__((unused
)) int argc
,__attribute__((unused
)) char *argv
[],__attribute__((unused
)) char *envp
[])
7852 extern "C" void _M2_mcp3_finish (__attribute__((unused
)) int argc
,__attribute__((unused
)) char *argv
[],__attribute__((unused
)) char *envp
[])