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-2025 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/>. */
26 # if !defined (PROC_D)
28 typedef void (*PROC_t
) (void);
29 typedef struct { PROC_t proc
; } PROC
;
40 #if defined(__cplusplus)
47 # include "GDynamicStrings.h"
48 # include "GmcError.h"
49 # include "GnameKey.h"
50 # include "GmcPrintf.h"
51 # include "GmcDebug.h"
52 # include "GmcReserved.h"
53 # include "GmcMetaError.h"
54 # include "GmcStack.h"
55 # include "GmcLexBuf.h"
59 # define Debugging false
60 typedef unsigned int mcp3_stop0
;
62 typedef unsigned int mcp3_SetOfStop0
;
64 typedef unsigned int mcp3_stop1
;
66 typedef unsigned int mcp3_SetOfStop1
;
68 typedef unsigned int mcp3_stop2
;
70 typedef unsigned int mcp3_SetOfStop2
;
72 static bool WasNoError
;
73 static bool curisused
;
74 static nameKey_Name curstring
;
75 static nameKey_Name curident
;
76 static decl_node curproc
;
77 static decl_node frommodule
;
78 static decl_node typeDes
;
79 static decl_node typeExp
;
80 static decl_node curmodule
;
81 static mcStack_stack stk
;
84 CompilationUnit - returns TRUE if the input was correct enough to parse
88 extern "C" bool mcp3_CompilationUnit (void);
94 static decl_node
push (decl_node n
);
100 static decl_node
pop (void);
106 static decl_node
replace (decl_node n
);
109 peep - returns the top node on the stack without removing it.
112 static decl_node
peep (void);
115 depth - returns the depth of the stack.
118 static unsigned int depth (void);
124 static void checkDuplicate (bool b
);
130 static void ErrorString (DynamicStrings_String s
);
136 static void ErrorArray (const char *a_
, unsigned int _a_high
);
139 checkParameterAttribute -
142 static void checkParameterAttribute (void);
145 checkReturnAttribute -
148 static void checkReturnAttribute (void);
154 static void pushNunbounded (unsigned int c
);
157 makeIndexedArray - builds and returns an array of type, t, with, c, indices.
160 static decl_node
makeIndexedArray (unsigned int c
, decl_node t
);
163 importInto - from, m, import, name, into module, current.
164 It checks to see if curident is an enumeration type
165 and if so automatically includes all enumeration fields
169 static void importInto (decl_node m
, nameKey_Name name
, decl_node current
);
172 checkEndName - if module does not have, name, then issue an error containing, desc.
175 static void checkEndName (decl_node module
, nameKey_Name name
, const char *desc_
, unsigned int _desc_high
);
178 DescribeStop - issues a message explaining what tokens were expected
181 static DynamicStrings_String
DescribeStop (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
184 DescribeError - issues a message explaining what tokens were expected
187 static void DescribeError (void);
190 SyntaxError - after a syntax error we skip all tokens up until we reach
194 static void SyntaxError (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
200 static void SyntaxCheck (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
203 WarnMissingToken - generates a warning message about a missing token, t.
206 static void WarnMissingToken (mcReserved_toktype t
);
209 MissingToken - generates a warning message about a missing token, t.
212 static void MissingToken (mcReserved_toktype t
);
218 static bool CheckAndInsert (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
224 static bool InStopSet (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
227 PeepToken - peep token checks to see whether the stopset is satisfied by currenttoken
228 If it is not then it will insert a token providing the token
229 is one of ; ] ) } . OF END ,
231 if the stopset contains <identtok> then we do not insert a token
234 static void PeepToken (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
240 static void Expect (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
243 Ident - error checking varient of Ident
246 static void Ident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
252 static void string (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
258 static void Integer (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
264 static void Real (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
267 FileUnit := DefinitionModule |
268 ImplementationOrProgramModule
270 first symbols:implementationtok, moduletok, definitiontok
275 static void FileUnit (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
278 ProgramModule := 'MODULE' Ident
279 % curmodule := lookupModule (curident) %
281 % enterScope (curmodule) %
283 % resetEnumPos (curmodule) %
284 [ Priority ] ';' { Import } Block
286 % checkEndName (curmodule, curident, 'program module') %
288 % setConstExpComplete (curmodule) %
293 first symbols:moduletok
298 static void ProgramModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
301 ImplementationModule := 'IMPLEMENTATION' 'MODULE'
303 % curmodule := lookupImp (curident) %
305 % enterScope (lookupDef (curident)) %
307 % enterScope (curmodule) %
309 % resetEnumPos (curmodule) %
310 [ Priority ] ';' { Import }
312 % checkEndName (curmodule, curident, 'implementation module') %
314 % setConstExpComplete (curmodule) %
316 % leaveScope ; leaveScope %
319 first symbols:implementationtok
324 static void ImplementationModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
327 ImplementationOrProgramModule := ImplementationModule |
330 first symbols:moduletok, implementationtok
335 static void ImplementationOrProgramModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
338 Number := Integer | Real
340 first symbols:realtok, integertok
345 static void Number (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
348 Qualident := Ident { '.' Ident }
350 first symbols:identtok
355 static void Qualident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
358 ConstantDeclaration :=
361 % d := lookupSym (curident) %
365 % assert (isConst (d)) %
370 first symbols:identtok
375 static void ConstantDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
378 ConstExpressionNop := SimpleConstExpr
380 [ Relation SimpleConstExpr ]
382 % n := makeConstExp () %
385 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
390 static void ConstExpressionNop (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
396 % n := push (makeConstExp ()) %
397 SimpleConstExpr [ Relation SimpleConstExpr ]
399 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
404 static void ConstExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
407 Relation := '=' | '#' | '<>' | '<' | '<=' |
410 first symbols:intok, greaterequaltok, greatertok, lessequaltok, lesstok, lessgreatertok, hashtok, equaltok
415 static void Relation (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
418 SimpleConstExpr := UnaryOrConstTerm { AddOperator
421 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
426 static void SimpleConstExpr (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
429 UnaryOrConstTerm := '+' ConstTerm |
433 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
438 static void UnaryOrConstTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
441 AddOperator := '+' | '-' | 'OR'
443 first symbols:ortok, minustok, plustok
448 static void AddOperator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
451 ConstTerm := ConstFactor { MulOperator ConstFactor }
453 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok
458 static void ConstTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
461 MulOperator := '*' | '/' | 'DIV' | 'MOD' |
464 first symbols:ambersandtok, andtok, remtok, modtok, divtok, dividetok, timestok
469 static void MulOperator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
472 ConstFactor := Number | ConstString |
473 ConstSetOrQualidentOrFunction |
474 '(' ConstExpressionNop ')' |
478 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok
483 static void ConstFactor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
486 ConstString := string
488 first symbols:stringtok
493 static void ConstString (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
496 ComponentElement := ConstExpressionNop [ '..' ConstExpressionNop ]
498 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
503 static void ComponentElement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
506 ComponentValue := ComponentElement [ 'BY' ConstExpressionNop ]
508 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
513 static void ComponentValue (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
516 ArraySetRecordValue := ComponentValue { ',' ComponentValue }
518 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
523 static void ArraySetRecordValue (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
526 Constructor := '{' [ ArraySetRecordValue ] '}'
528 first symbols:lcbratok
533 static void Constructor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
536 ConstSetOrQualidentOrFunction := Qualident [ Constructor |
537 ConstActualParameters ] |
540 first symbols:lcbratok, identtok
545 static void ConstSetOrQualidentOrFunction (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
548 ConstActualParameters := '(' [ ConstExpList ] ')'
550 first symbols:lparatok
555 static void ConstActualParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
558 ConstExpList := ConstExpressionNop { ',' ConstExpressionNop }
560 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
565 static void ConstExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
568 ConstAttribute := '__ATTRIBUTE__' '__BUILTIN__'
569 '(' '(' ConstAttributeExpression
572 first symbols:attributetok
577 static void ConstAttribute (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
580 ConstAttributeExpression := Ident | '<' Qualident
583 first symbols:lesstok, identtok
588 static void ConstAttributeExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
593 first symbols:ldirectivetok
598 static void ByteAlignment (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
601 OptAlignmentExpression := [ AlignmentExpression ]
603 first symbols:lparatok
608 static void OptAlignmentExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
611 AlignmentExpression := '(' ConstExpressionNop ')'
613 first symbols:lparatok
618 static void AlignmentExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
621 Alignment := [ ByteAlignment ]
623 first symbols:ldirectivetok
628 static void Alignment (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
631 IdentList := Ident { ',' Ident }
633 first symbols:identtok
638 static void IdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
644 % n := makeIdentList () %
646 % checkDuplicate (putIdent (n, curident)) %
648 % checkDuplicate (putIdent (n, curident)) %
653 first symbols:identtok
658 static void PushIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
662 % VAR low, high: node ; d: CARDINAL ; %
668 % assert (d = depth ()) %
672 % assert (d = depth ()) %
674 % typeExp := push (makeSubrange (low, high)) %
676 % assert (d = depth () - 1) %
679 first symbols:lsbratok
684 static void SubrangeType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
688 % VAR c: CARDINAL ; t, n: node ; %
696 % n := push (makeIndexedArray (c, pop ())) %
699 first symbols:arraytok
704 static void ArrayType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
707 RecordType := 'RECORD'
710 % n := push (makeRecord ()) %
712 % n := push (NIL) no varient %
713 [ DefaultRecordAttributes ] FieldListSequence
715 % assert (pop ()=NIL) %
718 first symbols:recordtok
723 static void RecordType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
726 DefaultRecordAttributes := ''
728 first symbols:ldirectivetok
733 static void DefaultRecordAttributes (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
736 RecordFieldPragma := [ '' ]
738 first symbols:ldirectivetok
743 static void RecordFieldPragma (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
746 FieldPragmaExpression := Ident PragmaConstExpression
748 first symbols:identtok
753 static void FieldPragmaExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
756 PragmaConstExpression := [ '(' ConstExpressionNop
759 first symbols:lparatok
764 static void PragmaConstExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
767 AttributeExpression := Ident '(' ConstExpressionNop
770 first symbols:identtok
775 static void AttributeExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
778 FieldListSequence := FieldListStatement { ';' FieldListStatement }
780 first symbols:casetok, identtok, semicolontok
785 static void FieldListSequence (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
788 FieldListStatement := [ FieldList ]
790 first symbols:identtok, casetok
795 static void FieldListStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
799 % VAR r, i, f, t, n, v, w: node ; d: CARDINAL ; %
803 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
805 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
809 % assert (d=depth ()) %
811 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isVarientField (r))) %
813 % assert (d=depth () - 1) %
817 % assert (d=depth () - 1) %
821 % assert (d=depth ()) %
823 % r := addFieldsToRecord (r, v, i, t) %
825 % assert (d=depth ()) %
832 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
834 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
838 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isRecordField (r))) %
840 % w := push (makeVarient (r)) %
842 % assert (d = depth () - 1) %
846 % assert (d = depth () - 1) %
848 % assert (d = depth () - 1) %
850 % assert (d = depth () - 1) %
852 % w := peep () ; assert (isVarient (w)) %
854 % assert (d = depth () - 1) %
855 [ 'ELSE' FieldListSequence ] 'END'
857 % w := pop () ; assert (isVarient (w)) %
859 % assert (d=depth ()) %
862 first symbols:casetok, identtok
867 static void FieldList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
871 % curident := NulName %
874 first symbols:identtok
879 static void TagIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
883 % VAR tagident: Name ; q, v, w, r: node ; %
885 % w := pop () ; v := pop () ; r := peep () ; v := push (v) ; w := push (w) %
887 % assert (isVarient (w)) %
889 % assert ((v=NIL) OR isVarient (v)) %
891 % assert (isRecord (r) OR isVarientField (r)) %
893 % assert (isVarient (push (pop ()))) %
895 % tagident := curident %
899 % assert (isVarient (push (pop ()))) %
903 % buildVarientSelector (r, w, tagident, q) %
906 first symbols:colontok, identtok
911 static void CaseTag (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
915 % VAR p, r, v, f: node ; d: CARDINAL ; %
919 % assert (isVarient (peep ())) %
921 % v := pop () ; assert (isVarient (v)) %
929 % f := push (buildVarientFieldRecord (v, p)) %
932 VarientCaseLabelList ':' FieldListSequence
938 % assert (isVarientField (f)) %
940 % assert (isVarient (v)) %
944 % assert (isVarient (peep ())) %
946 % assert (d=depth ()) %
949 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
954 static void Varient (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
957 VarientCaseLabelList := VarientCaseLabels { ','
960 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
965 static void VarientCaseLabelList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
974 [ '..' ConstExpression
977 % l, h could be saved if necessary. %
980 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
985 static void VarientCaseLabels (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
988 SetType := ( 'SET' | 'PACKEDSET' ) 'OF' SimpleType
992 % n := push (makeSet (pop ())) %
995 first symbols:oftok, packedsettok, settok
1000 static void SetType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1003 PointerType := 'POINTER' 'TO' Type
1006 % n := push (makePointer (pop ())) %
1009 first symbols:pointertok
1014 static void PointerType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1017 ProcedureType := 'PROCEDURE'
1018 % curproc := push (makeProcType ()) %
1021 first symbols:proceduretok
1026 static void ProcedureType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1029 FormalTypeList := '(' ( ')' FormalReturn |
1030 ProcedureParameters ')'
1033 first symbols:lparatok
1038 static void FormalTypeList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1041 FormalReturn := [ ':' OptReturnType ]
1043 first symbols:colontok
1048 static void FormalReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1051 OptReturnType := '[' PushQualident
1052 % putReturnType (curproc, pop ()) %
1054 % putOptReturn (curproc) %
1056 % putReturnType (curproc, pop ()) %
1059 first symbols:identtok, lsbratok
1064 static void OptReturnType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1067 ProcedureParameters := ProcedureParameter
1068 % addParameter (curproc, pop ()) %
1069 { ',' ProcedureParameter
1071 % addParameter (curproc, pop ()) %
1074 first symbols:identtok, arraytok, periodperiodperiodtok, vartok
1079 static void ProcedureParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1082 ProcedureParameter := '...'
1085 % n := push (makeVarargs ()) %
1087 % n := push (makeVarParameter (NIL, pop (), curproc, TRUE)) %
1089 % n := push (makeNonVarParameter (NIL, pop (), curproc, TRUE)) %
1092 first symbols:identtok, arraytok, vartok, periodperiodperiodtok
1097 static void ProcedureParameter (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1101 % VAR n, a: node ; %
1105 % checkDuplicate (putIdent (n, curident)) %
1108 [ '[' ConstExpression
1109 % a := pop () could store, a, into, n. %
1112 first symbols:identtok
1117 static void VarIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1123 % n := makeIdentList () %
1126 VarIdent { ',' VarIdent }
1128 first symbols:identtok
1133 static void VarIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1136 VariableDeclaration :=
1137 % VAR v, d: node ; %
1141 % d := makeVarDecl (v, pop ()) %
1144 first symbols:identtok
1149 static void VariableDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1152 Designator := Qualident { SubDesignator }
1154 first symbols:identtok
1159 static void Designator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1162 SubDesignator := '.' Ident | '[' ArrayExpList ']' |
1165 first symbols:uparrowtok, lsbratok, periodtok
1170 static void SubDesignator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1173 ArrayExpList := Expression { ',' Expression }
1175 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
1180 static void ArrayExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1183 ExpList := Expression { ',' Expression }
1185 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
1190 static void ExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1193 Expression := SimpleExpression [ Relation SimpleExpression ]
1195 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
1200 static void Expression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1203 SimpleExpression := UnaryOrTerm { AddOperator Term }
1205 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
1210 static void SimpleExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1213 UnaryOrTerm := '+' Term | '-' Term |
1216 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
1221 static void UnaryOrTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1224 Term := Factor { MulOperator Factor }
1226 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok
1231 static void Term (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1234 Factor := Number | string | SetOrDesignatorOrFunction |
1235 '(' Expression ')' |
1236 'NOT' ( Factor | ConstAttribute )
1238 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok
1243 static void Factor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1246 SetOrDesignatorOrFunction := Qualident [ Constructor |
1248 [ ActualParameters ] ] |
1251 first symbols:lcbratok, identtok
1256 static void SetOrDesignatorOrFunction (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1259 SimpleDes := { SubDesignator }
1261 first symbols:periodtok, lsbratok, uparrowtok
1266 static void SimpleDes (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1269 ActualParameters := '(' [ ExpList ] ')'
1271 first symbols:lparatok
1276 static void ActualParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1279 ExitStatement := 'EXIT'
1281 first symbols:exittok
1286 static void ExitStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1289 ReturnStatement := 'RETURN' [ Expression ]
1291 first symbols:returntok
1296 static void ReturnStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1299 Statement := [ AssignmentOrProcedureCall |
1300 IfStatement | CaseStatement |
1303 LoopStatement | ForStatement |
1304 WithStatement | AsmStatement |
1305 ExitStatement | ReturnStatement |
1308 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok
1313 static void Statement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1316 RetryStatement := 'RETRY'
1318 first symbols:retrytok
1323 static void RetryStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1326 AssignmentOrProcedureCall := Designator ( ':=' Expression |
1332 first symbols:identtok
1337 static void AssignmentOrProcedureCall (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1340 StatementSequence := Statement { ';' Statement }
1342 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok
1347 static void StatementSequence (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1350 IfStatement := 'IF' Expression 'THEN' StatementSequence
1351 { 'ELSIF' Expression 'THEN' StatementSequence }
1352 [ 'ELSE' StatementSequence ] 'END'
1359 static void IfStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1362 CaseStatement := 'CASE' Expression 'OF' Case { '|'
1366 first symbols:casetok
1371 static void CaseStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1374 CaseEndStatement := 'END' | 'ELSE' StatementSequence
1377 first symbols:elsetok, endtok
1382 static void CaseEndStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1385 Case := [ CaseLabelList ':' StatementSequence ]
1387 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
1392 static void Case (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1395 CaseLabelList := CaseLabels { ',' CaseLabels }
1397 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
1402 static void CaseLabelList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1405 CaseLabels := ConstExpressionNop [ '..' ConstExpressionNop ]
1407 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
1412 static void CaseLabels (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1415 WhileStatement := 'WHILE' Expression 'DO' StatementSequence
1418 first symbols:whiletok
1423 static void WhileStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1426 RepeatStatement := 'REPEAT' StatementSequence 'UNTIL'
1429 first symbols:repeattok
1434 static void RepeatStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1437 ForStatement := 'FOR' Ident ':=' Expression 'TO'
1438 Expression [ 'BY' ConstExpressionNop ]
1439 'DO' StatementSequence 'END'
1441 first symbols:fortok
1446 static void ForStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1449 LoopStatement := 'LOOP' StatementSequence 'END'
1451 first symbols:looptok
1456 static void LoopStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1459 WithStatement := 'WITH' Designator 'DO' StatementSequence
1462 first symbols:withtok
1467 static void WithStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1470 ProcedureDeclaration := ProcedureHeading ';' ProcedureBlock
1475 first symbols:proceduretok
1480 static void ProcedureDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1483 ProcedureIdent := Ident
1484 % curproc := lookupSym (curident) %
1486 % enterScope (curproc) %
1489 first symbols:identtok
1494 static void ProcedureIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1497 DefProcedureIdent := Ident
1498 % curproc := lookupSym (curident) %
1501 first symbols:identtok
1506 static void DefProcedureIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1509 DefineBuiltinProcedure := [ '__ATTRIBUTE__' '__BUILTIN__'
1510 '(' '(' Ident ')' ')' |
1513 first symbols:inlinetok, attributetok
1518 static void DefineBuiltinProcedure (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1521 ProcedureHeading := 'PROCEDURE' DefineBuiltinProcedure
1522 ( ProcedureIdent [ FormalParameters ]
1525 first symbols:proceduretok
1530 static void ProcedureHeading (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1533 Builtin := [ '__BUILTIN__' | '__INLINE__' ]
1535 first symbols:inlinetok, builtintok
1540 static void Builtin (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1543 DefProcedureHeading := 'PROCEDURE' Builtin ( DefProcedureIdent
1544 [ DefFormalParameters ]
1547 first symbols:proceduretok
1552 static void DefProcedureHeading (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1555 ProcedureBlock := { Declaration } [ 'BEGIN' ProcedureBlockBody ]
1558 first symbols:proceduretok, moduletok, consttok, typetok, vartok, endtok, begintok
1563 static void ProcedureBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1566 Block := { Declaration } InitialBlock FinalBlock
1569 first symbols:proceduretok, moduletok, finallytok, begintok, consttok, typetok, vartok, endtok
1574 static void Block (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1577 InitialBlock := [ 'BEGIN' InitialBlockBody ]
1579 first symbols:begintok
1584 static void InitialBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1587 FinalBlock := [ 'FINALLY' FinalBlockBody ]
1589 first symbols:finallytok
1594 static void FinalBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1597 InitialBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
1599 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
1604 static void InitialBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1607 FinalBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
1609 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
1614 static void FinalBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1617 ProcedureBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
1619 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
1624 static void ProcedureBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1627 NormalPart := StatementSequence
1629 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
1634 static void NormalPart (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1637 ExceptionalPart := StatementSequence
1639 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
1644 static void ExceptionalPart (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1647 Declaration := 'CONST' { ConstantDeclaration ';' } |
1648 'TYPE' { TypeDeclaration } |
1649 'VAR' { VariableDeclaration ';' } |
1650 ProcedureDeclaration ';' |
1651 ModuleDeclaration ';'
1653 first symbols:moduletok, proceduretok, vartok, typetok, consttok
1658 static void Declaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1661 DefFormalParameters := '('
1662 % paramEnter (curproc) %
1663 [ DefMultiFPSection ] ')'
1665 % paramLeave (curproc) %
1668 first symbols:lparatok
1673 static void DefFormalParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1676 DefMultiFPSection := DefExtendedFP |
1677 FPSection [ ';' DefMultiFPSection ]
1679 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
1684 static void DefMultiFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1687 FormalParameters := '('
1688 % paramEnter (curproc) %
1689 [ MultiFPSection ] ')'
1690 % paramLeave (curproc) %
1693 first symbols:lparatok
1698 static void FormalParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1701 AttributeNoReturn := [ NoReturn |
1702 % setNoReturn (curproc, FALSE) %
1705 first symbols:ldirectivetok
1710 static void AttributeNoReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1715 first symbols:ldirectivetok
1720 static void NoReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1723 AttributeUnused := [ Unused ]
1725 first symbols:ldirectivetok
1730 static void AttributeUnused (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1735 first symbols:ldirectivetok
1740 static void Unused (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1743 MultiFPSection := ExtendedFP | FPSection [ ';'
1746 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
1751 static void MultiFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1754 FPSection := NonVarFPSection |
1757 first symbols:vartok, identtok
1762 static void FPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1765 DefExtendedFP := DefOptArg | '...'
1766 % addParameter (curproc, makeVarargs ()) %
1769 first symbols:lsbratok, periodperiodperiodtok
1774 static void DefExtendedFP (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1777 ExtendedFP := OptArg | '...'
1779 first symbols:lsbratok, periodperiodperiodtok
1784 static void ExtendedFP (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1787 VarFPSection := 'VAR' PushIdentList
1788 % VAR l, t: node ; %
1794 % curisused := TRUE %
1796 % addVarParameters (curproc, l, t, curisused) %
1799 first symbols:vartok
1804 static void VarFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1807 NonVarFPSection := PushIdentList
1808 % VAR l, t: node ; %
1814 % curisused := TRUE %
1816 % addNonVarParameters (curproc, l, t, curisused) %
1819 first symbols:identtok
1824 static void NonVarFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1828 % VAR p, init, type: node ; id: Name ; %
1835 [ '=' ConstExpression
1838 % p := addOptParameter (curproc, id, type, init) %
1841 first symbols:lsbratok
1846 static void OptArg (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1850 % VAR p, init, type: node ; id: Name ; %
1858 % p := addOptParameter (curproc, id, type, init) %
1861 first symbols:lsbratok
1866 static void DefOptArg (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1870 % VAR c: CARDINAL ; %
1872 % VAR n, a, s: node ; %
1878 % pushNunbounded (c) %
1881 first symbols:identtok, arraytok
1886 static void FormalType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1889 ModuleDeclaration := 'MODULE' Ident [ Priority ]
1890 ';' { Import } [ Export ]
1893 first symbols:moduletok
1898 static void ModuleDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1901 Priority := '[' ConstExpressionNop ']'
1903 first symbols:lsbratok
1908 static void Priority (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1911 Export := 'EXPORT' ( 'QUALIFIED' IdentList |
1912 'UNQUALIFIED' IdentList |
1915 first symbols:exporttok
1920 static void Export (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1923 FromIdentList := Ident
1924 % importInto (frommodule, curident, curmodule) %
1926 % importInto (frommodule, curident, curmodule) %
1929 first symbols:identtok
1934 static void FromIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1937 FromImport := 'FROM' Ident
1938 % frommodule := lookupDef (curident) %
1939 'IMPORT' FromIdentList ';'
1941 first symbols:fromtok
1946 static void FromImport (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1949 ImportModuleList := Ident { ',' Ident }
1951 first symbols:identtok
1956 static void ImportModuleList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1959 WithoutFromImport := 'IMPORT' ImportModuleList ';'
1961 first symbols:importtok
1966 static void WithoutFromImport (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1969 Import := FromImport | WithoutFromImport
1971 first symbols:importtok, fromtok
1976 static void Import (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
1979 DefinitionModule := 'DEFINITION' 'MODULE' [ 'FOR'
1982 % curmodule := lookupDef (curident) %
1984 % enterScope (curmodule) %
1986 % resetEnumPos (curmodule) %
1987 { Import } [ Export ] { Definition }
1989 % checkEndName (curmodule, curident, 'definition module') %
1991 % setConstExpComplete (curmodule) %
1996 first symbols:definitiontok
2001 static void DefinitionModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2004 PushQualident := Ident
2005 % typeExp := push (lookupSym (curident)) %
2009 metaError1 ('the symbol {%1k} is not visible in this scope (or any other nested scope)', curident)
2012 % IF NOT isDef (typeExp)
2014 ErrorArray ('the first component of this qualident must be a definition module')
2017 % typeExp := replace (lookupInScope (typeExp, curident)) ;
2020 ErrorArray ('identifier not found in definition module')
2024 first symbols:identtok
2029 static void PushQualident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2032 OptSubrange := [ SubrangeType
2033 % VAR q, s: node ; %
2039 % putSubrangeType (s, q) %
2041 % typeExp := push (s) %
2044 first symbols:lsbratok
2049 static void OptSubrange (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2052 TypeEquiv := PushQualident OptSubrange
2054 first symbols:identtok
2059 static void TypeEquiv (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2065 % typeExp := push (makeEnum ()) %
2067 % f := makeEnumField (typeExp, curident) %
2069 % f := makeEnumField (typeExp, curident) %
2072 first symbols:identtok
2077 static void EnumIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2080 Enumeration := '(' EnumIdentList ')'
2082 first symbols:lparatok
2087 static void Enumeration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2091 % VAR d: CARDINAL ; %
2094 ( TypeEquiv | Enumeration |
2096 % assert (d = depth () - 1) %
2099 first symbols:lsbratok, lparatok, identtok
2104 static void SimpleType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2107 Type := SimpleType | ArrayType | RecordType |
2108 SetType | PointerType | ProcedureType
2110 first symbols:proceduretok, pointertok, settok, packedsettok, oftok, recordtok, arraytok, identtok, lparatok, lsbratok
2115 static void Type (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2118 TypeDeclaration := { Ident
2119 % typeDes := lookupSym (curident) %
2121 % putType (typeDes, pop ()) %
2124 first symbols:identtok
2129 static void TypeDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2132 Definition := 'CONST' { ConstantDeclaration ';' } |
2133 'TYPE' { TypeDeclaration } |
2134 'VAR' { VariableDeclaration ';' } |
2135 DefProcedureHeading ';'
2137 first symbols:proceduretok, vartok, typetok, consttok
2142 static void Definition (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2145 AsmStatement := 'ASM' [ 'VOLATILE' ] '(' AsmOperands
2148 first symbols:asmtok
2153 static void AsmStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2156 AsmOperands := string [ AsmOperandSpec ]
2158 first symbols:stringtok
2163 static void AsmOperands (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2166 AsmOperandSpec := [ ':' AsmList [ ':' AsmList [
2169 first symbols:colontok
2174 static void AsmOperandSpec (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2177 AsmList := [ AsmElement ] { ',' AsmElement }
2179 first symbols:lsbratok, stringtok, commatok
2184 static void AsmList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2187 NamedOperand := '[' Ident ']'
2189 first symbols:lsbratok
2194 static void NamedOperand (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2197 AsmOperandName := [ NamedOperand ]
2199 first symbols:lsbratok
2204 static void AsmOperandName (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2207 AsmElement := AsmOperandName string '(' Expression
2210 first symbols:stringtok, lsbratok
2215 static void AsmElement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2218 TrashList := [ string ] { ',' string }
2220 first symbols:commatok, stringtok
2225 static void TrashList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
);
2232 static decl_node
push (decl_node n
)
2234 return static_cast<decl_node
> (mcStack_push (stk
, reinterpret_cast <void *> (n
)));
2235 /* static analysis guarentees a RETURN statement will be used before here. */
2236 __builtin_unreachable ();
2244 static decl_node
pop (void)
2246 return static_cast<decl_node
> (mcStack_pop (stk
));
2247 /* static analysis guarentees a RETURN statement will be used before here. */
2248 __builtin_unreachable ();
2256 static decl_node
replace (decl_node n
)
2258 return static_cast<decl_node
> (mcStack_replace (stk
, reinterpret_cast <void *> (n
)));
2259 /* static analysis guarentees a RETURN statement will be used before here. */
2260 __builtin_unreachable ();
2265 peep - returns the top node on the stack without removing it.
2268 static decl_node
peep (void)
2270 return push (pop ());
2271 /* static analysis guarentees a RETURN statement will be used before here. */
2272 __builtin_unreachable ();
2277 depth - returns the depth of the stack.
2280 static unsigned int depth (void)
2282 return mcStack_depth (stk
);
2283 /* static analysis guarentees a RETURN statement will be used before here. */
2284 __builtin_unreachable ();
2292 static void checkDuplicate (bool b
)
2301 static void ErrorString (DynamicStrings_String s
)
2303 mcError_errorStringAt (s
, mcLexBuf_getTokenNo ());
2312 static void ErrorArray (const char *a_
, unsigned int _a_high
)
2316 /* make a local copy of each unbounded array. */
2317 memcpy (a
, a_
, _a_high
+1);
2319 ErrorString (DynamicStrings_InitString ((const char *) a
, _a_high
));
2324 checkParameterAttribute -
2327 static void checkParameterAttribute (void)
2329 if ((nameKey_makeKey ((const char *) "unused", 6)) != curident
)
2331 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));
2337 checkReturnAttribute -
2340 static void checkReturnAttribute (void)
2342 if ((nameKey_makeKey ((const char *) "noreturn", 8)) != curident
)
2344 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));
2353 static void pushNunbounded (unsigned int c
)
2362 subrange
= decl_makeSubrange (static_cast<decl_node
> (NULL
), static_cast<decl_node
> (NULL
));
2363 decl_putSubrangeType (subrange
, decl_getCardinal ());
2364 array
= decl_makeArray (subrange
, type
);
2365 decl_putUnbounded (array
);
2366 type
= push (array
);
2373 makeIndexedArray - builds and returns an array of type, t, with, c, indices.
2376 static decl_node
makeIndexedArray (unsigned int c
, decl_node t
)
2382 t
= decl_makeArray (pop (), t
);
2386 /* static analysis guarentees a RETURN statement will be used before here. */
2387 __builtin_unreachable ();
2392 importInto - from, m, import, name, into module, current.
2393 It checks to see if curident is an enumeration type
2394 and if so automatically includes all enumeration fields
2398 static void importInto (decl_node m
, nameKey_Name name
, decl_node current
)
2403 mcDebug_assert (decl_isDef (m
));
2404 mcDebug_assert (((decl_isDef (current
)) || (decl_isModule (current
))) || (decl_isImp (current
)));
2405 s
= decl_lookupExported (m
, name
);
2408 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));
2412 o
= decl_import (current
, s
);
2415 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));
2422 checkEndName - if module does not have, name, then issue an error containing, desc.
2425 static void checkEndName (decl_node module
, nameKey_Name name
, const char *desc_
, unsigned int _desc_high
)
2427 DynamicStrings_String s
;
2428 char desc
[_desc_high
+1];
2430 /* make a local copy of each unbounded array. */
2431 memcpy (desc
, desc_
, _desc_high
+1);
2433 if ((decl_getSymName (module
)) != name
)
2435 s
= DynamicStrings_InitString ((const char *) "inconsistent module name found with this ", 41);
2436 s
= DynamicStrings_ConCat (s
, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) desc
, _desc_high
)));
2443 DescribeStop - issues a message explaining what tokens were expected
2446 static DynamicStrings_String
DescribeStop (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
2449 DynamicStrings_String str
;
2450 DynamicStrings_String message
;
2453 message
= DynamicStrings_InitString ((const char *) "", 0);
2454 if ((((1 << (mcReserved_stringtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2456 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "string", 6)));
2459 if ((((1 << (mcReserved_realtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2461 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "real number", 11)));
2464 if ((((1 << (mcReserved_identtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2466 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "identifier", 10)));
2469 if ((((1 << (mcReserved_integertok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2471 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "integer number", 14)));
2474 if ((((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2476 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__INLINE__", 10)));
2479 if ((((1 << (mcReserved_builtintok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2481 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__BUILTIN__", 11)));
2484 if ((((1 << (mcReserved_attributetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2486 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__ATTRIBUTE__", 13)));
2489 if ((((1 << (mcReserved_filetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2491 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__FILE__", 8)));
2494 if ((((1 << (mcReserved_linetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2496 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__LINE__", 8)));
2499 if ((((1 << (mcReserved_datetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2501 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__DATE__", 8)));
2504 if ((((1 << (mcReserved_periodperiodperiodtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2506 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "...", 3)));
2509 if ((((1 << (mcReserved_volatiletok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2511 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "VOLATILE", 8)));
2514 if ((((1 << (mcReserved_asmtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2516 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ASM", 3)));
2519 if ((((1 << (mcReserved_withtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2521 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "WITH", 4)));
2524 if ((((1 << (mcReserved_whiletok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2526 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "WHILE", 5)));
2529 if ((((1 << (mcReserved_vartok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2531 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "VAR", 3)));
2534 if ((((1 << (mcReserved_untiltok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2536 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "UNTIL", 5)));
2539 if ((((1 << (mcReserved_typetok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2541 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "TYPE", 4)));
2544 if ((((1 << (mcReserved_totok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2546 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "TO", 2)));
2549 if ((((1 << (mcReserved_thentok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2551 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "THEN", 4)));
2554 if ((((1 << (mcReserved_settok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2556 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "SET", 3)));
2559 if ((((1 << (mcReserved_returntok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2561 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RETURN", 6)));
2564 if ((((1 << (mcReserved_retrytok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2566 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RETRY", 5)));
2569 if ((((1 << (mcReserved_repeattok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2571 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "REPEAT", 6)));
2574 if ((((1 << (mcReserved_remtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2576 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "REM", 3)));
2579 if ((((1 << (mcReserved_recordtok
-mcReserved_recordtok
)) & (stopset2
)) != 0))
2581 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RECORD", 6)));
2584 if ((((1 << (mcReserved_unqualifiedtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2586 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "UNQUALIFIED", 11)));
2589 if ((((1 << (mcReserved_qualifiedtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2591 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "QUALIFIED", 9)));
2594 if ((((1 << (mcReserved_proceduretok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2596 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "PROCEDURE", 9)));
2599 if ((((1 << (mcReserved_pointertok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2601 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "POINTER", 7)));
2604 if ((((1 << (mcReserved_packedsettok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2606 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "PACKEDSET", 9)));
2609 if ((((1 << (mcReserved_ortok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2611 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "OR", 2)));
2614 if ((((1 << (mcReserved_oftok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2616 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "OF", 2)));
2619 if ((((1 << (mcReserved_nottok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2621 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "NOT", 3)));
2624 if ((((1 << (mcReserved_moduletok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2626 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MODULE", 6)));
2629 if ((((1 << (mcReserved_modtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2631 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MOD", 3)));
2634 if ((((1 << (mcReserved_looptok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2636 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "LOOP", 4)));
2639 if ((((1 << (mcReserved_intok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2641 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IN", 2)));
2644 if ((((1 << (mcReserved_importtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2646 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IMPORT", 6)));
2649 if ((((1 << (mcReserved_implementationtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2651 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IMPLEMENTATION", 14)));
2654 if ((((1 << (mcReserved_iftok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2656 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IF", 2)));
2659 if ((((1 << (mcReserved_fromtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2661 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FROM", 4)));
2664 if ((((1 << (mcReserved_fortok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2666 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FOR", 3)));
2669 if ((((1 << (mcReserved_finallytok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2671 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FINALLY", 7)));
2674 if ((((1 << (mcReserved_exporttok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2676 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXPORT", 6)));
2679 if ((((1 << (mcReserved_exittok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2681 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXIT", 4)));
2684 if ((((1 << (mcReserved_excepttok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2686 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXCEPT", 6)));
2689 if ((((1 << (mcReserved_endtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2691 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "END", 3)));
2694 if ((((1 << (mcReserved_elsiftok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2696 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ELSIF", 5)));
2699 if ((((1 << (mcReserved_elsetok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2701 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ELSE", 4)));
2704 if ((((1 << (mcReserved_dotok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2706 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DO", 2)));
2709 if ((((1 << (mcReserved_divtok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2711 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DIV", 3)));
2714 if ((((1 << (mcReserved_definitiontok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2716 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DEFINITION", 10)));
2719 if ((((1 << (mcReserved_consttok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2721 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "CONST", 5)));
2724 if ((((1 << (mcReserved_casetok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2726 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "CASE", 4)));
2729 if ((((1 << (mcReserved_bytok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2731 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "BY", 2)));
2734 if ((((1 << (mcReserved_begintok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2736 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "BEGIN", 5)));
2739 if ((((1 << (mcReserved_arraytok
-mcReserved_arraytok
)) & (stopset1
)) != 0))
2741 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ARRAY", 5)));
2744 if ((((1 << (mcReserved_andtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2746 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "AND", 3)));
2749 if ((((1 << (mcReserved_colontok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2751 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ":", 1)));
2754 if ((((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2756 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "..", 2)));
2759 if ((((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2761 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "*>", 2)));
2764 if ((((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2766 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<*", 2)));
2769 if ((((1 << (mcReserved_greaterequaltok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2771 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ">=", 2)));
2774 if ((((1 << (mcReserved_lessequaltok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2776 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<=", 2)));
2779 if ((((1 << (mcReserved_lessgreatertok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2781 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<>", 2)));
2784 if ((((1 << (mcReserved_hashtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2786 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "#", 1)));
2789 if ((((1 << (mcReserved_equaltok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2791 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "=", 1)));
2794 if ((((1 << (mcReserved_uparrowtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2796 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "^", 1)));
2799 if ((((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2801 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ";", 1)));
2804 if ((((1 << (mcReserved_commatok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2806 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ",", 1)));
2809 if ((((1 << (mcReserved_periodtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2811 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1)));
2814 if ((((1 << (mcReserved_ambersandtok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2816 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "&", 1)));
2819 if ((((1 << (mcReserved_dividetok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2821 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "/", 1)));
2824 if ((((1 << (mcReserved_timestok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2826 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "*", 1)));
2829 if ((((1 << (mcReserved_minustok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2831 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "-", 1)));
2834 if ((((1 << (mcReserved_plustok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2836 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "+", 1)));
2839 if ((((1 << (mcReserved_doublequotestok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2841 message
= DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (message
, ' '), '`'), '"'), '\''), ',');
2844 if ((((1 << (mcReserved_singlequotetok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2846 message
= DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (message
, ' '), '"'), '\''), '"'), ',');
2849 if ((((1 << (mcReserved_greatertok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2851 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ">", 1)));
2854 if ((((1 << (mcReserved_lesstok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2856 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<", 1)));
2859 if ((((1 << (mcReserved_rparatok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2861 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ")", 1)));
2864 if ((((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2866 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "(", 1)));
2869 if ((((1 << (mcReserved_rcbratok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2871 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "}", 1)));
2874 if ((((1 << (mcReserved_lcbratok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2876 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "{", 1)));
2879 if ((((1 << (mcReserved_rsbratok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2881 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "]", 1)));
2884 if ((((1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2886 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "[", 1)));
2889 if ((((1 << (mcReserved_bartok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2891 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "|", 1)));
2894 if ((((1 << (mcReserved_becomestok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2896 message
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (message
, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ":=", 2)));
2899 if ((((1 << (mcReserved_eoftok
-mcReserved_eoftok
)) & (stopset0
)) != 0))
2901 /* eoftok has no token name (needed to generate error messages) */
2904 str
= DynamicStrings_InitString ((const char *) " syntax error", 13);
2905 message
= DynamicStrings_KillString (message
);
2909 /* avoid dangling else. */
2910 str
= DynamicStrings_ConCat (message
, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " missing ", 9)));
2914 /* avoid dangling else. */
2915 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) " expecting one of", 17), message
);
2916 message
= DynamicStrings_KillString (message
);
2919 /* static analysis guarentees a RETURN statement will be used before here. */
2920 __builtin_unreachable ();
2925 DescribeError - issues a message explaining what tokens were expected
2928 static void DescribeError (void)
2930 DynamicStrings_String str
;
2932 str
= DynamicStrings_InitString ((const char *) "", 0);
2933 switch (mcLexBuf_currenttoken
)
2935 case mcReserved_stringtok
:
2936 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found string", 26), DynamicStrings_Mark (str
));
2939 case mcReserved_realtok
:
2940 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found real number", 31), DynamicStrings_Mark (str
));
2943 case mcReserved_identtok
:
2944 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found identifier", 30), DynamicStrings_Mark (str
));
2947 case mcReserved_integertok
:
2948 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found integer number", 34), DynamicStrings_Mark (str
));
2951 case mcReserved_inlinetok
:
2952 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __INLINE__", 30), DynamicStrings_Mark (str
));
2955 case mcReserved_builtintok
:
2956 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __BUILTIN__", 31), DynamicStrings_Mark (str
));
2959 case mcReserved_attributetok
:
2960 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __ATTRIBUTE__", 33), DynamicStrings_Mark (str
));
2963 case mcReserved_filetok
:
2964 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __FILE__", 28), DynamicStrings_Mark (str
));
2967 case mcReserved_linetok
:
2968 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __LINE__", 28), DynamicStrings_Mark (str
));
2971 case mcReserved_datetok
:
2972 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __DATE__", 28), DynamicStrings_Mark (str
));
2975 case mcReserved_periodperiodperiodtok
:
2976 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ...", 23), DynamicStrings_Mark (str
));
2979 case mcReserved_volatiletok
:
2980 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found VOLATILE", 28), DynamicStrings_Mark (str
));
2983 case mcReserved_asmtok
:
2984 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ASM", 23), DynamicStrings_Mark (str
));
2987 case mcReserved_withtok
:
2988 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found WITH", 24), DynamicStrings_Mark (str
));
2991 case mcReserved_whiletok
:
2992 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found WHILE", 25), DynamicStrings_Mark (str
));
2995 case mcReserved_vartok
:
2996 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found VAR", 23), DynamicStrings_Mark (str
));
2999 case mcReserved_untiltok
:
3000 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found UNTIL", 25), DynamicStrings_Mark (str
));
3003 case mcReserved_typetok
:
3004 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found TYPE", 24), DynamicStrings_Mark (str
));
3007 case mcReserved_totok
:
3008 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found TO", 22), DynamicStrings_Mark (str
));
3011 case mcReserved_thentok
:
3012 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found THEN", 24), DynamicStrings_Mark (str
));
3015 case mcReserved_settok
:
3016 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found SET", 23), DynamicStrings_Mark (str
));
3019 case mcReserved_returntok
:
3020 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RETURN", 26), DynamicStrings_Mark (str
));
3023 case mcReserved_retrytok
:
3024 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RETRY", 25), DynamicStrings_Mark (str
));
3027 case mcReserved_repeattok
:
3028 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found REPEAT", 26), DynamicStrings_Mark (str
));
3031 case mcReserved_remtok
:
3032 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found REM", 23), DynamicStrings_Mark (str
));
3035 case mcReserved_recordtok
:
3036 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RECORD", 26), DynamicStrings_Mark (str
));
3039 case mcReserved_unqualifiedtok
:
3040 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found UNQUALIFIED", 31), DynamicStrings_Mark (str
));
3043 case mcReserved_qualifiedtok
:
3044 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found QUALIFIED", 29), DynamicStrings_Mark (str
));
3047 case mcReserved_proceduretok
:
3048 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found PROCEDURE", 29), DynamicStrings_Mark (str
));
3051 case mcReserved_pointertok
:
3052 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found POINTER", 27), DynamicStrings_Mark (str
));
3055 case mcReserved_packedsettok
:
3056 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found PACKEDSET", 29), DynamicStrings_Mark (str
));
3059 case mcReserved_ortok
:
3060 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found OR", 22), DynamicStrings_Mark (str
));
3063 case mcReserved_oftok
:
3064 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found OF", 22), DynamicStrings_Mark (str
));
3067 case mcReserved_nottok
:
3068 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found NOT", 23), DynamicStrings_Mark (str
));
3071 case mcReserved_moduletok
:
3072 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found MODULE", 26), DynamicStrings_Mark (str
));
3075 case mcReserved_modtok
:
3076 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found MOD", 23), DynamicStrings_Mark (str
));
3079 case mcReserved_looptok
:
3080 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found LOOP", 24), DynamicStrings_Mark (str
));
3083 case mcReserved_intok
:
3084 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IN", 22), DynamicStrings_Mark (str
));
3087 case mcReserved_importtok
:
3088 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IMPORT", 26), DynamicStrings_Mark (str
));
3091 case mcReserved_implementationtok
:
3092 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IMPLEMENTATION", 34), DynamicStrings_Mark (str
));
3095 case mcReserved_iftok
:
3096 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IF", 22), DynamicStrings_Mark (str
));
3099 case mcReserved_fromtok
:
3100 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FROM", 24), DynamicStrings_Mark (str
));
3103 case mcReserved_fortok
:
3104 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FOR", 23), DynamicStrings_Mark (str
));
3107 case mcReserved_finallytok
:
3108 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FINALLY", 27), DynamicStrings_Mark (str
));
3111 case mcReserved_exporttok
:
3112 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXPORT", 26), DynamicStrings_Mark (str
));
3115 case mcReserved_exittok
:
3116 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXIT", 24), DynamicStrings_Mark (str
));
3119 case mcReserved_excepttok
:
3120 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXCEPT", 26), DynamicStrings_Mark (str
));
3123 case mcReserved_endtok
:
3124 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found END", 23), DynamicStrings_Mark (str
));
3127 case mcReserved_elsiftok
:
3128 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ELSIF", 25), DynamicStrings_Mark (str
));
3131 case mcReserved_elsetok
:
3132 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ELSE", 24), DynamicStrings_Mark (str
));
3135 case mcReserved_dotok
:
3136 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DO", 22), DynamicStrings_Mark (str
));
3139 case mcReserved_divtok
:
3140 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DIV", 23), DynamicStrings_Mark (str
));
3143 case mcReserved_definitiontok
:
3144 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DEFINITION", 30), DynamicStrings_Mark (str
));
3147 case mcReserved_consttok
:
3148 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found CONST", 25), DynamicStrings_Mark (str
));
3151 case mcReserved_casetok
:
3152 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found CASE", 24), DynamicStrings_Mark (str
));
3155 case mcReserved_bytok
:
3156 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found BY", 22), DynamicStrings_Mark (str
));
3159 case mcReserved_begintok
:
3160 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found BEGIN", 25), DynamicStrings_Mark (str
));
3163 case mcReserved_arraytok
:
3164 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ARRAY", 25), DynamicStrings_Mark (str
));
3167 case mcReserved_andtok
:
3168 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found AND", 23), DynamicStrings_Mark (str
));
3171 case mcReserved_colontok
:
3172 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found :", 21), DynamicStrings_Mark (str
));
3175 case mcReserved_periodperiodtok
:
3176 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ..", 22), DynamicStrings_Mark (str
));
3179 case mcReserved_rdirectivetok
:
3180 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found *>", 22), DynamicStrings_Mark (str
));
3183 case mcReserved_ldirectivetok
:
3184 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <*", 22), DynamicStrings_Mark (str
));
3187 case mcReserved_greaterequaltok
:
3188 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found >=", 22), DynamicStrings_Mark (str
));
3191 case mcReserved_lessequaltok
:
3192 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <=", 22), DynamicStrings_Mark (str
));
3195 case mcReserved_lessgreatertok
:
3196 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <>", 22), DynamicStrings_Mark (str
));
3199 case mcReserved_hashtok
:
3200 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found #", 21), DynamicStrings_Mark (str
));
3203 case mcReserved_equaltok
:
3204 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found =", 21), DynamicStrings_Mark (str
));
3207 case mcReserved_uparrowtok
:
3208 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ^", 21), DynamicStrings_Mark (str
));
3211 case mcReserved_semicolontok
:
3212 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ;", 21), DynamicStrings_Mark (str
));
3215 case mcReserved_commatok
:
3216 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ,", 21), DynamicStrings_Mark (str
));
3219 case mcReserved_periodtok
:
3220 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found .", 21), DynamicStrings_Mark (str
));
3223 case mcReserved_ambersandtok
:
3224 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found &", 21), DynamicStrings_Mark (str
));
3227 case mcReserved_dividetok
:
3228 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found /", 21), DynamicStrings_Mark (str
));
3231 case mcReserved_timestok
:
3232 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found *", 21), DynamicStrings_Mark (str
));
3235 case mcReserved_minustok
:
3236 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found -", 21), DynamicStrings_Mark (str
));
3239 case mcReserved_plustok
:
3240 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found +", 21), DynamicStrings_Mark (str
));
3243 case mcReserved_doublequotestok
:
3244 str
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_InitString ((const char *) "syntax error, found '", 21), '"'), '\''), DynamicStrings_Mark (str
));
3247 case mcReserved_singlequotetok
:
3248 str
= DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_InitString ((const char *) "syntax error, found \"", 21), '\''), '"'), DynamicStrings_Mark (str
));
3251 case mcReserved_greatertok
:
3252 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found >", 21), DynamicStrings_Mark (str
));
3255 case mcReserved_lesstok
:
3256 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <", 21), DynamicStrings_Mark (str
));
3259 case mcReserved_rparatok
:
3260 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found )", 21), DynamicStrings_Mark (str
));
3263 case mcReserved_lparatok
:
3264 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found (", 21), DynamicStrings_Mark (str
));
3267 case mcReserved_rcbratok
:
3268 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found }", 21), DynamicStrings_Mark (str
));
3271 case mcReserved_lcbratok
:
3272 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found {", 21), DynamicStrings_Mark (str
));
3275 case mcReserved_rsbratok
:
3276 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ]", 21), DynamicStrings_Mark (str
));
3279 case mcReserved_lsbratok
:
3280 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found [", 21), DynamicStrings_Mark (str
));
3283 case mcReserved_bartok
:
3284 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found |", 21), DynamicStrings_Mark (str
));
3287 case mcReserved_becomestok
:
3288 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found :=", 22), DynamicStrings_Mark (str
));
3291 case mcReserved_eoftok
:
3292 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ", 20), DynamicStrings_Mark (str
));
3304 SyntaxError - after a syntax error we skip all tokens up until we reach
3308 static void SyntaxError (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3313 mcPrintf_printf0 ((const char *) "\\nskipping token *** ", 21);
3316 yes the ORD(currenttoken) looks ugly, but it is *much* safer than
3317 using currenttoken<sometok as a change to the ordering of the
3318 token declarations below would cause this to break. Using ORD() we are
3319 immune from such changes
3321 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)))))
3323 mcLexBuf_getToken ();
3327 mcPrintf_printf0 ((const char *) " ***\\n", 6);
3336 static void SyntaxCheck (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3338 /* and again (see above re: ORD)
3340 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)))))
3342 SyntaxError (stopset0
, stopset1
, stopset2
);
3348 WarnMissingToken - generates a warning message about a missing token, t.
3351 static void WarnMissingToken (mcReserved_toktype t
)
3356 DynamicStrings_String str
;
3358 s0
= (mcp3_SetOfStop0
) 0;
3359 s1
= (mcp3_SetOfStop1
) 0;
3360 s2
= (mcp3_SetOfStop2
) 0;
3361 if ( ((unsigned int) (t
)) < 32)
3363 s0
= (mcp3_SetOfStop0
) ((1 << (t
-mcReserved_eoftok
)));
3365 else if ( ((unsigned int) (t
)) < 64)
3367 /* avoid dangling else. */
3368 s1
= (mcp3_SetOfStop1
) ((1 << (t
-mcReserved_arraytok
)));
3372 /* avoid dangling else. */
3373 s2
= (mcp3_SetOfStop2
) ((1 << (t
-mcReserved_recordtok
)));
3375 str
= DescribeStop (s0
, s1
, s2
);
3376 str
= DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error,", 13), DynamicStrings_Mark (str
));
3377 mcError_errorStringAt (str
, mcLexBuf_getTokenNo ());
3382 MissingToken - generates a warning message about a missing token, t.
3385 static void MissingToken (mcReserved_toktype t
)
3387 WarnMissingToken (t
);
3388 if ((((t
!= mcReserved_identtok
) && (t
!= mcReserved_integertok
)) && (t
!= mcReserved_realtok
)) && (t
!= mcReserved_stringtok
))
3392 mcPrintf_printf0 ((const char *) "inserting token\\n", 17);
3394 mcLexBuf_insertToken (t
);
3403 static bool CheckAndInsert (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3405 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))))
3407 WarnMissingToken (t
);
3408 mcLexBuf_insertTokenAndRewind (t
);
3415 /* static analysis guarentees a RETURN statement will be used before here. */
3416 __builtin_unreachable ();
3424 static bool InStopSet (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3426 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))))
3434 /* static analysis guarentees a RETURN statement will be used before here. */
3435 __builtin_unreachable ();
3440 PeepToken - peep token checks to see whether the stopset is satisfied by currenttoken
3441 If it is not then it will insert a token providing the token
3442 is one of ; ] ) } . OF END ,
3444 if the stopset contains <identtok> then we do not insert a token
3447 static void PeepToken (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3449 /* and again (see above re: ORD)
3451 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
))))
3453 /* SyntaxCheck would fail since currentoken is not part of the stopset
3454 we check to see whether any of currenttoken might be a commonly omitted token */
3455 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
)))
3465 static void Expect (mcReserved_toktype t
, mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3467 if (mcLexBuf_currenttoken
== t
)
3469 /* avoid dangling else. */
3470 mcLexBuf_getToken ();
3473 PeepToken (stopset0
, stopset1
, stopset2
);
3480 SyntaxCheck (stopset0
, stopset1
, stopset2
);
3485 Ident - error checking varient of Ident
3488 static void Ident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3490 curident
= nameKey_makekey (mcLexBuf_currentstring
);
3491 Expect (mcReserved_identtok
, stopset0
, stopset1
, stopset2
);
3499 static void string (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3501 curstring
= nameKey_makekey (mcLexBuf_currentstring
);
3502 Expect (mcReserved_stringtok
, stopset0
, stopset1
, stopset2
);
3510 static void Integer (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3512 Expect (mcReserved_integertok
, stopset0
, stopset1
, stopset2
);
3520 static void Real (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3522 Expect (mcReserved_realtok
, stopset0
, stopset1
, stopset2
);
3527 FileUnit := DefinitionModule |
3528 ImplementationOrProgramModule
3530 first symbols:implementationtok, moduletok, definitiontok
3535 static void FileUnit (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3537 if (mcLexBuf_currenttoken
== mcReserved_definitiontok
)
3539 DefinitionModule (stopset0
, stopset1
, stopset2
);
3541 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)))
3543 /* avoid dangling else. */
3544 ImplementationOrProgramModule (stopset0
, stopset1
, stopset2
);
3548 /* avoid dangling else. */
3549 ErrorArray ((const char *) "expecting one of: IMPLEMENTATION MODULE DEFINITION", 50);
3555 ProgramModule := 'MODULE' Ident
3556 % curmodule := lookupModule (curident) %
3558 % enterScope (curmodule) %
3560 % resetEnumPos (curmodule) %
3561 [ Priority ] ';' { Import } Block
3563 % checkEndName (curmodule, curident, 'program module') %
3565 % setConstExpComplete (curmodule) %
3570 first symbols:moduletok
3575 static void ProgramModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3577 Expect (mcReserved_moduletok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3578 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3579 curmodule
= decl_lookupModule (curident
);
3580 decl_enterScope (curmodule
);
3581 decl_resetEnumPos (curmodule
);
3582 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
3584 Priority (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3586 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
))));
3587 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)))
3589 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
))));
3592 Block (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3593 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3594 checkEndName (curmodule
, curident
, (const char *) "program module", 14);
3595 decl_setConstExpComplete (curmodule
);
3597 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
);
3602 ImplementationModule := 'IMPLEMENTATION' 'MODULE'
3604 % curmodule := lookupImp (curident) %
3606 % enterScope (lookupDef (curident)) %
3608 % enterScope (curmodule) %
3610 % resetEnumPos (curmodule) %
3611 [ Priority ] ';' { Import }
3613 % checkEndName (curmodule, curident, 'implementation module') %
3615 % setConstExpComplete (curmodule) %
3617 % leaveScope ; leaveScope %
3620 first symbols:implementationtok
3625 static void ImplementationModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3627 Expect (mcReserved_implementationtok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
);
3628 Expect (mcReserved_moduletok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3629 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3630 curmodule
= decl_lookupImp (curident
);
3631 decl_enterScope (decl_lookupDef (curident
));
3632 decl_enterScope (curmodule
);
3633 decl_resetEnumPos (curmodule
);
3634 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
3636 Priority (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3638 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
))));
3639 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)))
3641 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
))));
3644 Block (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3645 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3646 checkEndName (curmodule
, curident
, (const char *) "implementation module", 21);
3647 decl_setConstExpComplete (curmodule
);
3650 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
);
3655 ImplementationOrProgramModule := ImplementationModule |
3658 first symbols:moduletok, implementationtok
3663 static void ImplementationOrProgramModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3665 if (mcLexBuf_currenttoken
== mcReserved_implementationtok
)
3667 ImplementationModule (stopset0
, stopset1
, stopset2
);
3669 else if (mcLexBuf_currenttoken
== mcReserved_moduletok
)
3671 /* avoid dangling else. */
3672 ProgramModule (stopset0
, stopset1
, stopset2
);
3676 /* avoid dangling else. */
3677 ErrorArray ((const char *) "expecting one of: MODULE IMPLEMENTATION", 39);
3683 Number := Integer | Real
3685 first symbols:realtok, integertok
3690 static void Number (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3692 if (mcLexBuf_currenttoken
== mcReserved_integertok
)
3694 Integer (stopset0
, stopset1
, stopset2
);
3696 else if (mcLexBuf_currenttoken
== mcReserved_realtok
)
3698 /* avoid dangling else. */
3699 Real (stopset0
, stopset1
, stopset2
);
3703 /* avoid dangling else. */
3704 ErrorArray ((const char *) "expecting one of: real number integer number", 44);
3710 Qualident := Ident { '.' Ident }
3712 first symbols:identtok
3717 static void Qualident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3719 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3720 while (mcLexBuf_currenttoken
== mcReserved_periodtok
)
3722 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
3723 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3730 ConstantDeclaration :=
3731 % VAR d, e: node ; %
3733 % d := lookupSym (curident) %
3737 % assert (isConst (d)) %
3742 first symbols:identtok
3747 static void ConstantDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3752 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_equaltok
-mcReserved_eoftok
))), stopset1
, stopset2
);
3753 d
= decl_lookupSym (curident
);
3754 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
))));
3755 ConstExpression (stopset0
, stopset1
, stopset2
);
3757 mcDebug_assert (decl_isConst (d
));
3758 decl_putConst (d
, e
);
3763 ConstExpressionNop := SimpleConstExpr
3765 [ Relation SimpleConstExpr ]
3767 % n := makeConstExp () %
3770 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
3775 static void ConstExpressionNop (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3779 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
);
3780 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
))
3782 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
))));
3783 SimpleConstExpr (stopset0
, stopset1
, stopset2
);
3785 n
= decl_makeConstExp ();
3793 % n := push (makeConstExp ()) %
3794 SimpleConstExpr [ Relation SimpleConstExpr ]
3796 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
3801 static void ConstExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3805 n
= push (decl_makeConstExp ());
3806 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
);
3807 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
))
3809 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
))));
3810 SimpleConstExpr (stopset0
, stopset1
, stopset2
);
3816 Relation := '=' | '#' | '<>' | '<' | '<=' |
3819 first symbols:intok, greaterequaltok, greatertok, lessequaltok, lesstok, lessgreatertok, hashtok, equaltok
3824 static void Relation (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3826 if (mcLexBuf_currenttoken
== mcReserved_equaltok
)
3828 Expect (mcReserved_equaltok
, stopset0
, stopset1
, stopset2
);
3830 else if (mcLexBuf_currenttoken
== mcReserved_hashtok
)
3832 /* avoid dangling else. */
3833 Expect (mcReserved_hashtok
, stopset0
, stopset1
, stopset2
);
3835 else if (mcLexBuf_currenttoken
== mcReserved_lessgreatertok
)
3837 /* avoid dangling else. */
3838 Expect (mcReserved_lessgreatertok
, stopset0
, stopset1
, stopset2
);
3840 else if (mcLexBuf_currenttoken
== mcReserved_lesstok
)
3842 /* avoid dangling else. */
3843 Expect (mcReserved_lesstok
, stopset0
, stopset1
, stopset2
);
3845 else if (mcLexBuf_currenttoken
== mcReserved_lessequaltok
)
3847 /* avoid dangling else. */
3848 Expect (mcReserved_lessequaltok
, stopset0
, stopset1
, stopset2
);
3850 else if (mcLexBuf_currenttoken
== mcReserved_greatertok
)
3852 /* avoid dangling else. */
3853 Expect (mcReserved_greatertok
, stopset0
, stopset1
, stopset2
);
3855 else if (mcLexBuf_currenttoken
== mcReserved_greaterequaltok
)
3857 /* avoid dangling else. */
3858 Expect (mcReserved_greaterequaltok
, stopset0
, stopset1
, stopset2
);
3860 else if (mcLexBuf_currenttoken
== mcReserved_intok
)
3862 /* avoid dangling else. */
3863 Expect (mcReserved_intok
, stopset0
, stopset1
, stopset2
);
3867 /* avoid dangling else. */
3868 ErrorArray ((const char *) "expecting one of: IN >= > <= < <> # =", 37);
3874 SimpleConstExpr := UnaryOrConstTerm { AddOperator
3877 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
3882 static void SimpleConstExpr (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3884 UnaryOrConstTerm (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_ortok
-mcReserved_arraytok
))), stopset2
);
3885 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
))
3887 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
))));
3888 ConstTerm (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_ortok
-mcReserved_arraytok
))), stopset2
);
3895 UnaryOrConstTerm := '+' ConstTerm |
3899 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
3904 static void UnaryOrConstTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3906 if (mcLexBuf_currenttoken
== mcReserved_plustok
)
3908 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
))));
3909 ConstTerm (stopset0
, stopset1
, stopset2
);
3911 else if (mcLexBuf_currenttoken
== mcReserved_minustok
)
3913 /* avoid dangling else. */
3914 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
))));
3915 ConstTerm (stopset0
, stopset1
, stopset2
);
3917 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))))
3919 /* avoid dangling else. */
3920 ConstTerm (stopset0
, stopset1
, stopset2
);
3924 /* avoid dangling else. */
3925 ErrorArray ((const char *) "expecting one of: NOT ( integer number real number __ATTRIBUTE__ identifier { string - +", 88);
3931 AddOperator := '+' | '-' | 'OR'
3933 first symbols:ortok, minustok, plustok
3938 static void AddOperator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3940 if (mcLexBuf_currenttoken
== mcReserved_plustok
)
3942 Expect (mcReserved_plustok
, stopset0
, stopset1
, stopset2
);
3944 else if (mcLexBuf_currenttoken
== mcReserved_minustok
)
3946 /* avoid dangling else. */
3947 Expect (mcReserved_minustok
, stopset0
, stopset1
, stopset2
);
3949 else if (mcLexBuf_currenttoken
== mcReserved_ortok
)
3951 /* avoid dangling else. */
3952 Expect (mcReserved_ortok
, stopset0
, stopset1
, stopset2
);
3956 /* avoid dangling else. */
3957 ErrorArray ((const char *) "expecting one of: OR - +", 24);
3963 ConstTerm := ConstFactor { MulOperator ConstFactor }
3965 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok
3970 static void ConstTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3972 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
))));
3973 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
))
3975 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
))));
3976 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
))));
3983 MulOperator := '*' | '/' | 'DIV' | 'MOD' |
3986 first symbols:ambersandtok, andtok, remtok, modtok, divtok, dividetok, timestok
3991 static void MulOperator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
3993 if (mcLexBuf_currenttoken
== mcReserved_timestok
)
3995 Expect (mcReserved_timestok
, stopset0
, stopset1
, stopset2
);
3997 else if (mcLexBuf_currenttoken
== mcReserved_dividetok
)
3999 /* avoid dangling else. */
4000 Expect (mcReserved_dividetok
, stopset0
, stopset1
, stopset2
);
4002 else if (mcLexBuf_currenttoken
== mcReserved_divtok
)
4004 /* avoid dangling else. */
4005 Expect (mcReserved_divtok
, stopset0
, stopset1
, stopset2
);
4007 else if (mcLexBuf_currenttoken
== mcReserved_modtok
)
4009 /* avoid dangling else. */
4010 Expect (mcReserved_modtok
, stopset0
, stopset1
, stopset2
);
4012 else if (mcLexBuf_currenttoken
== mcReserved_remtok
)
4014 /* avoid dangling else. */
4015 Expect (mcReserved_remtok
, stopset0
, stopset1
, stopset2
);
4017 else if (mcLexBuf_currenttoken
== mcReserved_andtok
)
4019 /* avoid dangling else. */
4020 Expect (mcReserved_andtok
, stopset0
, stopset1
, stopset2
);
4022 else if (mcLexBuf_currenttoken
== mcReserved_ambersandtok
)
4024 /* avoid dangling else. */
4025 Expect (mcReserved_ambersandtok
, stopset0
, stopset1
, stopset2
);
4029 /* avoid dangling else. */
4030 ErrorArray ((const char *) "expecting one of: & AND REM MOD DIV / *", 39);
4036 ConstFactor := Number | ConstString |
4037 ConstSetOrQualidentOrFunction |
4038 '(' ConstExpressionNop ')' |
4042 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok
4047 static void ConstFactor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4049 if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
))))) != 0)))
4051 Number (stopset0
, stopset1
, stopset2
);
4053 else if (mcLexBuf_currenttoken
== mcReserved_stringtok
)
4055 /* avoid dangling else. */
4056 ConstString (stopset0
, stopset1
, stopset2
);
4058 else if ((mcLexBuf_currenttoken
== mcReserved_lcbratok
) || (mcLexBuf_currenttoken
== mcReserved_identtok
))
4060 /* avoid dangling else. */
4061 ConstSetOrQualidentOrFunction (stopset0
, stopset1
, stopset2
);
4063 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
4065 /* avoid dangling else. */
4066 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
))));
4067 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4068 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4070 else if (mcLexBuf_currenttoken
== mcReserved_nottok
)
4072 /* avoid dangling else. */
4073 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
))));
4074 ConstFactor (stopset0
, stopset1
, stopset2
);
4076 else if (mcLexBuf_currenttoken
== mcReserved_attributetok
)
4078 /* avoid dangling else. */
4079 ConstAttribute (stopset0
, stopset1
, stopset2
);
4083 /* avoid dangling else. */
4084 ErrorArray ((const char *) "expecting one of: __ATTRIBUTE__ NOT ( identifier { string integer number real number", 84);
4090 ConstString := string
4092 first symbols:stringtok
4097 static void ConstString (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4099 string (stopset0
, stopset1
, stopset2
);
4104 ComponentElement := ConstExpressionNop [ '..' ConstExpressionNop ]
4106 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4111 static void ComponentElement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4113 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4114 if (mcLexBuf_currenttoken
== mcReserved_periodperiodtok
)
4116 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
))));
4117 ConstExpressionNop (stopset0
, stopset1
, stopset2
);
4123 ComponentValue := ComponentElement [ 'BY' ConstExpressionNop ]
4125 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
4130 static void ComponentValue (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4132 ComponentElement (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_bytok
-mcReserved_arraytok
))), stopset2
);
4133 if (mcLexBuf_currenttoken
== mcReserved_bytok
)
4135 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
))));
4136 ConstExpressionNop (stopset0
, stopset1
, stopset2
);
4142 ArraySetRecordValue := ComponentValue { ',' ComponentValue }
4144 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4149 static void ArraySetRecordValue (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4151 ComponentValue (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4152 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4154 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
))));
4155 ComponentValue (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4162 Constructor := '{' [ ArraySetRecordValue ] '}'
4164 first symbols:lcbratok
4169 static void Constructor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4171 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
))));
4172 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))))
4174 ArraySetRecordValue (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rcbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4176 Expect (mcReserved_rcbratok
, stopset0
, stopset1
, stopset2
);
4181 ConstSetOrQualidentOrFunction := Qualident [ Constructor |
4182 ConstActualParameters ] |
4185 first symbols:lcbratok, identtok
4190 static void ConstSetOrQualidentOrFunction (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4192 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
4194 /* avoid dangling else. */
4195 Qualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lcbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4196 if ((mcLexBuf_currenttoken
< mcReserved_arraytok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_eoftok
)) & ((mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_lcbratok
-mcReserved_eoftok
))))) != 0)))
4198 /* avoid gcc warning by using compound statement even if not strictly necessary. */
4199 /* seen optional [ | ] expression */
4200 if (mcLexBuf_currenttoken
== mcReserved_lcbratok
)
4202 Constructor (stopset0
, stopset1
, stopset2
);
4204 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
4206 /* avoid dangling else. */
4207 ConstActualParameters (stopset0
, stopset1
, stopset2
);
4211 /* avoid dangling else. */
4212 ErrorArray ((const char *) "expecting one of: ( {", 21);
4215 /* end of optional [ | ] expression */
4217 else if (mcLexBuf_currenttoken
== mcReserved_lcbratok
)
4219 /* avoid dangling else. */
4220 Constructor (stopset0
, stopset1
, stopset2
);
4224 /* avoid dangling else. */
4225 ErrorArray ((const char *) "expecting one of: { identifier", 30);
4231 ConstActualParameters := '(' [ ConstExpList ] ')'
4233 first symbols:lparatok
4238 static void ConstActualParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4240 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
))));
4241 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))))
4243 ConstExpList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4245 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4250 ConstExpList := ConstExpressionNop { ',' ConstExpressionNop }
4252 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4257 static void ConstExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4259 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4260 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4262 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
))));
4263 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4270 ConstAttribute := '__ATTRIBUTE__' '__BUILTIN__'
4271 '(' '(' ConstAttributeExpression
4274 first symbols:attributetok
4279 static void ConstAttribute (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4281 Expect (mcReserved_attributetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_builtintok
-mcReserved_recordtok
))));
4282 Expect (mcReserved_builtintok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4283 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4284 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lesstok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4285 ConstAttributeExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4286 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4287 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4292 ConstAttributeExpression := Ident | '<' Qualident
4295 first symbols:lesstok, identtok
4300 static void ConstAttributeExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4302 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
4304 Ident (stopset0
, stopset1
, stopset2
);
4306 else if (mcLexBuf_currenttoken
== mcReserved_lesstok
)
4308 /* avoid dangling else. */
4309 Expect (mcReserved_lesstok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4310 Qualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4311 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4312 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_greatertok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4313 Expect (mcReserved_greatertok
, stopset0
, stopset1
, stopset2
);
4317 /* avoid dangling else. */
4318 ErrorArray ((const char *) "expecting one of: < identifier", 30);
4326 first symbols:ldirectivetok
4331 static void ByteAlignment (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4333 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4334 AttributeExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4335 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
4340 OptAlignmentExpression := [ AlignmentExpression ]
4342 first symbols:lparatok
4347 static void OptAlignmentExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4349 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
4351 AlignmentExpression (stopset0
, stopset1
, stopset2
);
4357 AlignmentExpression := '(' ConstExpressionNop ')'
4359 first symbols:lparatok
4364 static void AlignmentExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4366 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
))));
4367 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4368 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4373 Alignment := [ ByteAlignment ]
4375 first symbols:ldirectivetok
4380 static void Alignment (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4382 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
4384 ByteAlignment (stopset0
, stopset1
, stopset2
);
4390 IdentList := Ident { ',' Ident }
4392 first symbols:identtok
4397 static void IdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4399 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4400 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4402 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4403 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4413 % n := makeIdentList () %
4415 % checkDuplicate (putIdent (n, curident)) %
4417 % checkDuplicate (putIdent (n, curident)) %
4422 first symbols:identtok
4427 static void PushIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4431 n
= decl_makeIdentList ();
4432 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4433 checkDuplicate (decl_putIdent (n
, curident
));
4434 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4436 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4437 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4438 checkDuplicate (decl_putIdent (n
, curident
));
4447 % VAR low, high: node ; d: CARDINAL ; %
4453 % assert (d = depth ()) %
4454 '..' ConstExpression
4457 % assert (d = depth ()) %
4459 % typeExp := push (makeSubrange (low, high)) %
4461 % assert (d = depth () - 1) %
4464 first symbols:lsbratok
4469 static void SubrangeType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4475 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
))));
4477 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4479 mcDebug_assert (d
== (depth ()));
4480 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
))));
4481 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4483 mcDebug_assert (d
== (depth ()));
4484 typeExp
= push (decl_makeSubrange (low
, high
));
4485 mcDebug_assert (d
== ((depth ())-1));
4486 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
4491 ArrayType := 'ARRAY'
4492 % VAR c: CARDINAL ; t, n: node ; %
4500 % n := push (makeIndexedArray (c, pop ())) %
4503 first symbols:arraytok
4508 static void ArrayType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4514 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
))));
4516 SimpleType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
4518 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4520 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
))));
4521 SimpleType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
4525 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
))));
4526 Type (stopset0
, stopset1
, stopset2
);
4527 n
= push (makeIndexedArray (c
, pop ()));
4532 RecordType := 'RECORD'
4535 % n := push (makeRecord ()) %
4537 % n := push (NIL) no varient %
4538 [ DefaultRecordAttributes ] FieldListSequence
4540 % assert (pop ()=NIL) %
4543 first symbols:recordtok
4548 static void RecordType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4552 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
))));
4553 n
= push (decl_makeRecord ());
4554 n
= push (static_cast<decl_node
> (NULL
)); /* no varient */
4555 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
4557 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
))));
4559 FieldListSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
4560 mcDebug_assert ((pop ()) == NULL
);
4561 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
4566 DefaultRecordAttributes := ''
4568 first symbols:ldirectivetok
4573 static void DefaultRecordAttributes (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4575 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4576 AttributeExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4577 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
4582 RecordFieldPragma := [ '' ]
4584 first symbols:ldirectivetok
4589 static void RecordFieldPragma (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4591 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
4593 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4594 FieldPragmaExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
)) | (1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4595 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
4597 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4598 FieldPragmaExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
)) | (1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4601 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
4607 FieldPragmaExpression := Ident PragmaConstExpression
4609 first symbols:identtok
4614 static void FieldPragmaExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4616 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4617 PragmaConstExpression (stopset0
, stopset1
, stopset2
);
4622 PragmaConstExpression := [ '(' ConstExpressionNop
4625 first symbols:lparatok
4630 static void PragmaConstExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4632 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
4634 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
))));
4635 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4636 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4642 AttributeExpression := Ident '(' ConstExpressionNop
4645 first symbols:identtok
4650 static void AttributeExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4652 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4653 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
))));
4654 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4655 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
4660 FieldListSequence := FieldListStatement { ';' FieldListStatement }
4662 first symbols:casetok, identtok, semicolontok
4667 static void FieldListSequence (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4669 FieldListStatement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4670 while (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
4672 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
))));
4673 FieldListStatement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4680 FieldListStatement := [ FieldList ]
4682 first symbols:identtok, casetok
4687 static void FieldListStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4689 if ((mcLexBuf_currenttoken
== mcReserved_casetok
) || (mcLexBuf_currenttoken
== mcReserved_identtok
))
4691 FieldList (stopset0
, stopset1
, stopset2
);
4698 % VAR r, i, f, t, n, v, w: node ; d: CARDINAL ; %
4702 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
4704 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
4708 % assert (d=depth ()) %
4710 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isVarientField (r))) %
4712 % assert (d=depth () - 1) %
4716 % assert (d=depth () - 1) %
4720 % assert (d=depth ()) %
4722 % r := addFieldsToRecord (r, v, i, t) %
4724 % assert (d=depth ()) %
4731 % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
4733 % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
4737 % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isRecordField (r))) %
4739 % w := push (makeVarient (r)) %
4741 % assert (d = depth () - 1) %
4743 % addVarientToList %
4745 % assert (d = depth () - 1) %
4747 % assert (d = depth () - 1) %
4749 % assert (d = depth () - 1) %
4751 % w := peep () ; assert (isVarient (w)) %
4753 % assert (d = depth () - 1) %
4754 [ 'ELSE' FieldListSequence ] 'END'
4756 % w := pop () ; assert (isVarient (w)) %
4758 % assert (d=depth ()) %
4761 first symbols:casetok, identtok
4766 static void FieldList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4777 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
4781 mcDebug_assert ((v
== NULL
) || (decl_isVarient (v
)));
4783 mcDebug_assert ((decl_isRecord (r
)) || (decl_isVarientField (r
)));
4785 mcDebug_assert (d
== (depth ()));
4786 mcDebug_assert (((v
== NULL
) && (decl_isRecord (r
))) || ((v
!= NULL
) && (decl_isVarientField (r
))));
4787 PushIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4788 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
))));
4789 mcDebug_assert (d
== ((depth ())-1));
4791 Type (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4792 mcDebug_assert (d
== ((depth ())-1));
4794 RecordFieldPragma (stopset0
, stopset1
, stopset2
);
4795 mcDebug_assert (d
== (depth ()));
4796 r
= decl_addFieldsToRecord (r
, v
, i
, t
);
4797 mcDebug_assert (d
== (depth ()));
4799 else if (mcLexBuf_currenttoken
== mcReserved_casetok
)
4801 /* avoid dangling else. */
4802 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
))));
4803 /* addRecordToList */
4806 mcDebug_assert ((v
== NULL
) || (decl_isVarient (v
)));
4808 mcDebug_assert ((decl_isRecord (r
)) || (decl_isVarientField (r
)));
4810 mcDebug_assert (((v
== NULL
) && (decl_isRecord (r
))) || ((v
!= NULL
) && (decl_isRecordField (r
))));
4811 w
= push (decl_makeVarient (r
));
4812 mcDebug_assert (d
== ((depth ())-1));
4813 /* addVarientToList */
4814 CaseTag (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
4815 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
))));
4816 mcDebug_assert (d
== ((depth ())-1));
4817 Varient (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
4818 mcDebug_assert (d
== ((depth ())-1));
4819 while (mcLexBuf_currenttoken
== mcReserved_bartok
)
4821 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
))));
4822 Varient (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
))), stopset2
);
4823 mcDebug_assert (d
== ((depth ())-1));
4827 mcDebug_assert (decl_isVarient (w
));
4828 mcDebug_assert (d
== ((depth ())-1));
4829 if (mcLexBuf_currenttoken
== mcReserved_elsetok
)
4831 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
))));
4832 FieldListSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
4834 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
4836 mcDebug_assert (decl_isVarient (w
));
4837 mcDebug_assert (d
== (depth ()));
4841 /* avoid dangling else. */
4842 ErrorArray ((const char *) "expecting one of: CASE identifier", 33);
4849 % curident := NulName %
4852 first symbols:identtok
4857 static void TagIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4859 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
4861 Ident (stopset0
, stopset1
, stopset2
);
4865 curident
= nameKey_NulName
;
4872 % VAR tagident: Name ; q, v, w, r: node ; %
4874 % w := pop () ; v := pop () ; r := peep () ; v := push (v) ; w := push (w) %
4876 % assert (isVarient (w)) %
4878 % assert ((v=NIL) OR isVarient (v)) %
4880 % assert (isRecord (r) OR isVarientField (r)) %
4882 % assert (isVarient (push (pop ()))) %
4884 % tagident := curident %
4888 % assert (isVarient (push (pop ()))) %
4892 % buildVarientSelector (r, w, tagident, q) %
4895 first symbols:colontok, identtok
4900 static void CaseTag (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4902 nameKey_Name tagident
;
4913 mcDebug_assert (decl_isVarient (w
));
4914 mcDebug_assert ((v
== NULL
) || (decl_isVarient (v
)));
4915 mcDebug_assert ((decl_isRecord (r
)) || (decl_isVarientField (r
)));
4916 mcDebug_assert (decl_isVarient (push (pop ())));
4917 TagIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4918 tagident
= curident
;
4919 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
4921 Expect (mcReserved_colontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
4922 PushQualident (stopset0
, stopset1
, stopset2
);
4924 mcDebug_assert (decl_isVarient (push (pop ())));
4928 q
= static_cast<decl_node
> (NULL
);
4930 decl_buildVarientSelector (r
, w
, tagident
, q
);
4936 % VAR p, r, v, f: node ; d: CARDINAL ; %
4940 % assert (isVarient (peep ())) %
4942 % v := pop () ; assert (isVarient (v)) %
4950 % f := push (buildVarientFieldRecord (v, p)) %
4953 VarientCaseLabelList ':' FieldListSequence
4959 % assert (isVarientField (f)) %
4961 % assert (isVarient (v)) %
4965 % assert (isVarient (peep ())) %
4967 % assert (d=depth ()) %
4970 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
4975 static void Varient (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
4984 mcDebug_assert (decl_isVarient (peep ()));
4985 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))))
4988 mcDebug_assert (decl_isVarient (v
));
4992 f
= push (decl_buildVarientFieldRecord (v
, p
));
4994 VarientCaseLabelList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
4995 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
))));
4996 FieldListSequence (stopset0
, stopset1
, stopset2
);
4999 mcDebug_assert (decl_isVarientField (f
));
5000 mcDebug_assert (decl_isVarient (v
));
5003 mcDebug_assert (decl_isVarient (peep ()));
5004 mcDebug_assert (d
== (depth ()));
5009 VarientCaseLabelList := VarientCaseLabels { ','
5012 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
5017 static void VarientCaseLabelList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5019 VarientCaseLabels (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5020 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5022 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
))));
5023 VarientCaseLabels (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5030 VarientCaseLabels :=
5031 % VAR l, h: node ; %
5036 [ '..' ConstExpression
5039 % l, h could be saved if necessary. %
5042 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
5047 static void VarientCaseLabels (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5052 h
= static_cast<decl_node
> (NULL
);
5053 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5055 if (mcLexBuf_currenttoken
== mcReserved_periodperiodtok
)
5057 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
))));
5058 ConstExpression (stopset0
, stopset1
, stopset2
);
5065 SetType := ( 'SET' | 'PACKEDSET' ) 'OF' SimpleType
5069 % n := push (makeSet (pop ())) %
5072 first symbols:oftok, packedsettok, settok
5077 static void SetType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5081 if (mcLexBuf_currenttoken
== mcReserved_settok
)
5083 Expect (mcReserved_settok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
5085 else if (mcLexBuf_currenttoken
== mcReserved_packedsettok
)
5087 /* avoid dangling else. */
5088 Expect (mcReserved_packedsettok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
5092 /* avoid dangling else. */
5093 ErrorArray ((const char *) "expecting one of: PACKEDSET SET", 31);
5095 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
))));
5096 SimpleType (stopset0
, stopset1
, stopset2
);
5097 n
= push (decl_makeSet (pop ()));
5102 PointerType := 'POINTER' 'TO' Type
5105 % n := push (makePointer (pop ())) %
5108 first symbols:pointertok
5113 static void PointerType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5117 Expect (mcReserved_pointertok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_totok
-mcReserved_recordtok
))));
5118 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
))));
5119 Type (stopset0
, stopset1
, stopset2
);
5120 n
= push (decl_makePointer (pop ()));
5125 ProcedureType := 'PROCEDURE'
5126 % curproc := push (makeProcType ()) %
5129 first symbols:proceduretok
5134 static void ProcedureType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5136 Expect (mcReserved_proceduretok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5137 curproc
= push (decl_makeProcType ());
5138 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
5140 FormalTypeList (stopset0
, stopset1
, stopset2
);
5146 FormalTypeList := '(' ( ')' FormalReturn |
5147 ProcedureParameters ')'
5150 first symbols:lparatok
5155 static void FormalTypeList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5157 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
))));
5158 if (mcLexBuf_currenttoken
== mcReserved_rparatok
)
5160 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5161 FormalReturn (stopset0
, stopset1
, stopset2
);
5163 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))))
5165 /* avoid dangling else. */
5166 ProcedureParameters (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5167 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5168 FormalReturn (stopset0
, stopset1
, stopset2
);
5172 /* avoid dangling else. */
5173 ErrorArray ((const char *) "expecting one of: VAR ... ARRAY identifier )", 44);
5179 FormalReturn := [ ':' OptReturnType ]
5181 first symbols:colontok
5186 static void FormalReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5188 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
5190 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5191 OptReturnType (stopset0
, stopset1
, stopset2
);
5197 OptReturnType := '[' PushQualident
5198 % putReturnType (curproc, pop ()) %
5200 % putOptReturn (curproc) %
5202 % putReturnType (curproc, pop ()) %
5205 first symbols:identtok, lsbratok
5210 static void OptReturnType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5212 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
5214 Expect (mcReserved_lsbratok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5215 PushQualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5216 decl_putReturnType (curproc
, pop ());
5217 decl_putOptReturn (curproc
);
5218 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
5220 else if (mcLexBuf_currenttoken
== mcReserved_identtok
)
5222 /* avoid dangling else. */
5223 PushQualident (stopset0
, stopset1
, stopset2
);
5224 decl_putReturnType (curproc
, pop ());
5228 /* avoid dangling else. */
5229 ErrorArray ((const char *) "expecting one of: identifier [", 30);
5235 ProcedureParameters := ProcedureParameter
5236 % addParameter (curproc, pop ()) %
5237 { ',' ProcedureParameter
5239 % addParameter (curproc, pop ()) %
5242 first symbols:identtok, arraytok, periodperiodperiodtok, vartok
5247 static void ProcedureParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5249 ProcedureParameter (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5250 decl_addParameter (curproc
, pop ());
5251 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5253 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
))));
5254 ProcedureParameter (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5255 decl_addParameter (curproc
, pop ());
5262 ProcedureParameter := '...'
5265 % n := push (makeVarargs ()) %
5267 % n := push (makeVarParameter (NIL, pop (), curproc, TRUE)) %
5269 % n := push (makeNonVarParameter (NIL, pop (), curproc, TRUE)) %
5272 first symbols:identtok, arraytok, vartok, periodperiodperiodtok
5277 static void ProcedureParameter (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5281 if (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
)
5283 Expect (mcReserved_periodperiodperiodtok
, stopset0
, stopset1
, stopset2
);
5284 n
= push (decl_makeVarargs ());
5286 else if (mcLexBuf_currenttoken
== mcReserved_vartok
)
5288 /* avoid dangling else. */
5289 Expect (mcReserved_vartok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5290 FormalType (stopset0
, stopset1
, stopset2
);
5291 n
= push (decl_makeVarParameter (static_cast<decl_node
> (NULL
), pop (), curproc
, true));
5293 else if ((mcLexBuf_currenttoken
== mcReserved_arraytok
) || (mcLexBuf_currenttoken
== mcReserved_identtok
))
5295 /* avoid dangling else. */
5296 FormalType (stopset0
, stopset1
, stopset2
);
5297 n
= push (decl_makeNonVarParameter (static_cast<decl_node
> (NULL
), pop (), curproc
, true));
5301 /* avoid dangling else. */
5302 ErrorArray ((const char *) "expecting one of: ARRAY identifier VAR ...", 42);
5309 % VAR n, a: node ; %
5313 % checkDuplicate (putIdent (n, curident)) %
5316 [ '[' ConstExpression
5317 % a := pop () could store, a, into, n. %
5320 first symbols:identtok
5325 static void VarIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5331 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5332 checkDuplicate (decl_putIdent (n
, curident
));
5334 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
5336 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
))));
5337 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5338 a
= pop (); /* could store, a, into, n. */
5339 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
5348 % n := makeIdentList () %
5351 VarIdent { ',' VarIdent }
5353 first symbols:identtok
5358 static void VarIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5362 n
= decl_makeIdentList ();
5364 VarIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5365 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5367 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5368 VarIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5375 VariableDeclaration :=
5376 % VAR v, d: node ; %
5380 % d := makeVarDecl (v, pop ()) %
5383 first symbols:identtok
5388 static void VariableDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5393 VarIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5395 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
))));
5396 Type (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5397 d
= decl_makeVarDecl (v
, pop ());
5398 Alignment (stopset0
, stopset1
, stopset2
);
5403 Designator := Qualident { SubDesignator }
5405 first symbols:identtok
5410 static void Designator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5412 Qualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_uparrowtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5413 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)))
5415 SubDesignator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_uparrowtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5422 SubDesignator := '.' Ident | '[' ArrayExpList ']' |
5425 first symbols:uparrowtok, lsbratok, periodtok
5430 static void SubDesignator (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5432 if (mcLexBuf_currenttoken
== mcReserved_periodtok
)
5434 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
5435 Ident (stopset0
, stopset1
, stopset2
);
5437 else if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
5439 /* avoid dangling else. */
5440 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
))));
5441 ArrayExpList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5442 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
5444 else if (mcLexBuf_currenttoken
== mcReserved_uparrowtok
)
5446 /* avoid dangling else. */
5447 Expect (mcReserved_uparrowtok
, stopset0
, stopset1
, stopset2
);
5451 /* avoid dangling else. */
5452 ErrorArray ((const char *) "expecting one of: ^ [ .", 23);
5458 ArrayExpList := Expression { ',' Expression }
5460 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
5465 static void ArrayExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5467 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5468 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5470 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
))));
5471 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5478 ExpList := Expression { ',' Expression }
5480 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
5485 static void ExpList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5487 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5488 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
5490 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
))));
5491 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5498 Expression := SimpleExpression [ Relation SimpleExpression ]
5500 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
5505 static void Expression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5507 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
);
5508 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
))
5510 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
))));
5511 SimpleExpression (stopset0
, stopset1
, stopset2
);
5517 SimpleExpression := UnaryOrTerm { AddOperator Term }
5519 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
5524 static void SimpleExpression (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5526 UnaryOrTerm (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_minustok
-mcReserved_eoftok
)) | (1 << (mcReserved_plustok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_ortok
-mcReserved_arraytok
))), stopset2
);
5527 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
))
5529 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
))));
5530 Term (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_plustok
-mcReserved_eoftok
)) | (1 << (mcReserved_minustok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_ortok
-mcReserved_arraytok
))), stopset2
);
5537 UnaryOrTerm := '+' Term | '-' Term |
5540 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
5545 static void UnaryOrTerm (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5547 if (mcLexBuf_currenttoken
== mcReserved_plustok
)
5549 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
))));
5550 Term (stopset0
, stopset1
, stopset2
);
5552 else if (mcLexBuf_currenttoken
== mcReserved_minustok
)
5554 /* avoid dangling else. */
5555 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
))));
5556 Term (stopset0
, stopset1
, stopset2
);
5558 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))))
5560 /* avoid dangling else. */
5561 Term (stopset0
, stopset1
, stopset2
);
5565 /* avoid dangling else. */
5566 ErrorArray ((const char *) "expecting one of: NOT ( string integer number real number identifier { - +", 74);
5572 Term := Factor { MulOperator Factor }
5574 first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok
5579 static void Term (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5581 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
))));
5582 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
))
5584 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
))));
5585 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
))));
5592 Factor := Number | string | SetOrDesignatorOrFunction |
5593 '(' Expression ')' |
5594 'NOT' ( Factor | ConstAttribute )
5596 first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok
5601 static void Factor (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5603 if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_integertok
-mcReserved_recordtok
)) | (1 << (mcReserved_realtok
-mcReserved_recordtok
))))) != 0)))
5605 Number (stopset0
, stopset1
, stopset2
);
5607 else if (mcLexBuf_currenttoken
== mcReserved_stringtok
)
5609 /* avoid dangling else. */
5610 string (stopset0
, stopset1
, stopset2
);
5612 else if ((mcLexBuf_currenttoken
== mcReserved_lcbratok
) || (mcLexBuf_currenttoken
== mcReserved_identtok
))
5614 /* avoid dangling else. */
5615 SetOrDesignatorOrFunction (stopset0
, stopset1
, stopset2
);
5617 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
5619 /* avoid dangling else. */
5620 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
))));
5621 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5622 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
5624 else if (mcLexBuf_currenttoken
== mcReserved_nottok
)
5626 /* avoid dangling else. */
5627 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
))));
5628 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))))
5630 Factor (stopset0
, stopset1
, stopset2
);
5632 else if (mcLexBuf_currenttoken
== mcReserved_attributetok
)
5634 /* avoid dangling else. */
5635 ConstAttribute (stopset0
, stopset1
, stopset2
);
5639 /* avoid dangling else. */
5640 ErrorArray ((const char *) "expecting one of: __ATTRIBUTE__ real number integer number string ( NOT { identifier", 84);
5645 /* avoid dangling else. */
5646 ErrorArray ((const char *) "expecting one of: NOT ( identifier { string integer number real number", 70);
5652 SetOrDesignatorOrFunction := Qualident [ Constructor |
5654 [ ActualParameters ] ] |
5657 first symbols:lcbratok, identtok
5662 static void SetOrDesignatorOrFunction (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5664 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
5666 /* avoid dangling else. */
5667 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
);
5668 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)))
5670 /* avoid gcc warning by using compound statement even if not strictly necessary. */
5671 /* seen optional [ | ] expression */
5672 if (mcLexBuf_currenttoken
== mcReserved_lcbratok
)
5674 Constructor (stopset0
, stopset1
, stopset2
);
5676 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)))
5678 /* avoid dangling else. */
5679 SimpleDes (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5680 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
5682 ActualParameters (stopset0
, stopset1
, stopset2
);
5687 /* avoid dangling else. */
5688 ErrorArray ((const char *) "expecting one of: ( ^ [ . {", 27);
5691 /* end of optional [ | ] expression */
5693 else if (mcLexBuf_currenttoken
== mcReserved_lcbratok
)
5695 /* avoid dangling else. */
5696 Constructor (stopset0
, stopset1
, stopset2
);
5700 /* avoid dangling else. */
5701 ErrorArray ((const char *) "expecting one of: { identifier", 30);
5707 SimpleDes := { SubDesignator }
5709 first symbols:periodtok, lsbratok, uparrowtok
5714 static void SimpleDes (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5716 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)))
5718 SubDesignator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
)) | (1 << (mcReserved_uparrowtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5725 ActualParameters := '(' [ ExpList ] ')'
5727 first symbols:lparatok
5732 static void ActualParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5734 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
))));
5735 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))))
5737 ExpList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5739 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
5744 ExitStatement := 'EXIT'
5746 first symbols:exittok
5751 static void ExitStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5753 Expect (mcReserved_exittok
, stopset0
, stopset1
, stopset2
);
5758 ReturnStatement := 'RETURN' [ Expression ]
5760 first symbols:returntok
5765 static void ReturnStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5767 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
))));
5768 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))))
5770 Expression (stopset0
, stopset1
, stopset2
);
5776 Statement := [ AssignmentOrProcedureCall |
5777 IfStatement | CaseStatement |
5780 LoopStatement | ForStatement |
5781 WithStatement | AsmStatement |
5782 ExitStatement | ReturnStatement |
5785 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok
5790 static void Statement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5792 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))))
5794 /* avoid gcc warning by using compound statement even if not strictly necessary. */
5795 /* seen optional [ | ] expression */
5796 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
5798 AssignmentOrProcedureCall (stopset0
, stopset1
, stopset2
);
5800 else if (mcLexBuf_currenttoken
== mcReserved_iftok
)
5802 /* avoid dangling else. */
5803 IfStatement (stopset0
, stopset1
, stopset2
);
5805 else if (mcLexBuf_currenttoken
== mcReserved_casetok
)
5807 /* avoid dangling else. */
5808 CaseStatement (stopset0
, stopset1
, stopset2
);
5810 else if (mcLexBuf_currenttoken
== mcReserved_whiletok
)
5812 /* avoid dangling else. */
5813 WhileStatement (stopset0
, stopset1
, stopset2
);
5815 else if (mcLexBuf_currenttoken
== mcReserved_repeattok
)
5817 /* avoid dangling else. */
5818 RepeatStatement (stopset0
, stopset1
, stopset2
);
5820 else if (mcLexBuf_currenttoken
== mcReserved_looptok
)
5822 /* avoid dangling else. */
5823 LoopStatement (stopset0
, stopset1
, stopset2
);
5825 else if (mcLexBuf_currenttoken
== mcReserved_fortok
)
5827 /* avoid dangling else. */
5828 ForStatement (stopset0
, stopset1
, stopset2
);
5830 else if (mcLexBuf_currenttoken
== mcReserved_withtok
)
5832 /* avoid dangling else. */
5833 WithStatement (stopset0
, stopset1
, stopset2
);
5835 else if (mcLexBuf_currenttoken
== mcReserved_asmtok
)
5837 /* avoid dangling else. */
5838 AsmStatement (stopset0
, stopset1
, stopset2
);
5840 else if (mcLexBuf_currenttoken
== mcReserved_exittok
)
5842 /* avoid dangling else. */
5843 ExitStatement (stopset0
, stopset1
, stopset2
);
5845 else if (mcLexBuf_currenttoken
== mcReserved_returntok
)
5847 /* avoid dangling else. */
5848 ReturnStatement (stopset0
, stopset1
, stopset2
);
5850 else if (mcLexBuf_currenttoken
== mcReserved_retrytok
)
5852 /* avoid dangling else. */
5853 RetryStatement (stopset0
, stopset1
, stopset2
);
5857 /* avoid dangling else. */
5858 ErrorArray ((const char *) "expecting one of: RETRY RETURN EXIT ASM WITH FOR LOOP REPEAT WHILE CASE IF identifier", 85);
5861 /* end of optional [ | ] expression */
5866 RetryStatement := 'RETRY'
5868 first symbols:retrytok
5873 static void RetryStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5875 Expect (mcReserved_retrytok
, stopset0
, stopset1
, stopset2
);
5880 AssignmentOrProcedureCall := Designator ( ':=' Expression |
5886 first symbols:identtok
5891 static void AssignmentOrProcedureCall (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5893 Designator (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_becomestok
-mcReserved_eoftok
)) | (1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5894 if (mcLexBuf_currenttoken
== mcReserved_becomestok
)
5896 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
))));
5897 Expression (stopset0
, stopset1
, stopset2
);
5899 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
5901 /* avoid dangling else. */
5902 ActualParameters (stopset0
, stopset1
, stopset2
);
5909 StatementSequence := Statement { ';' Statement }
5911 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok
5916 static void StatementSequence (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5918 Statement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5919 while (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
5921 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
))));
5922 Statement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
5929 IfStatement := 'IF' Expression 'THEN' StatementSequence
5930 { 'ELSIF' Expression 'THEN' StatementSequence }
5931 [ 'ELSE' StatementSequence ] 'END'
5938 static void IfStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5940 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
))));
5941 Expression (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_thentok
-mcReserved_recordtok
))));
5942 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
))));
5943 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_elsiftok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
5944 while (mcLexBuf_currenttoken
== mcReserved_elsiftok
)
5946 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
))));
5947 Expression (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_thentok
-mcReserved_recordtok
))));
5948 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
))));
5949 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsiftok
-mcReserved_arraytok
))), stopset2
);
5952 if (mcLexBuf_currenttoken
== mcReserved_elsetok
)
5954 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
))));
5955 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
5957 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
5962 CaseStatement := 'CASE' Expression 'OF' Case { '|'
5966 first symbols:casetok
5971 static void CaseStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5973 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
))));
5974 Expression (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
5975 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
))));
5976 Case (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_elsetok
-mcReserved_arraytok
)) | (1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
5977 while (mcLexBuf_currenttoken
== mcReserved_bartok
)
5979 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
))));
5980 Case (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_bartok
-mcReserved_eoftok
))), stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_elsetok
-mcReserved_arraytok
))), stopset2
);
5983 CaseEndStatement (stopset0
, stopset1
, stopset2
);
5988 CaseEndStatement := 'END' | 'ELSE' StatementSequence
5991 first symbols:elsetok, endtok
5996 static void CaseEndStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
5998 if (mcLexBuf_currenttoken
== mcReserved_endtok
)
6000 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6002 else if (mcLexBuf_currenttoken
== mcReserved_elsetok
)
6004 /* avoid dangling else. */
6005 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
))));
6006 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6007 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6011 /* avoid dangling else. */
6012 ErrorArray ((const char *) "expecting one of: ELSE END", 26);
6018 Case := [ CaseLabelList ':' StatementSequence ]
6020 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
6025 static void Case (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6027 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))))
6029 CaseLabelList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6030 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
))));
6031 StatementSequence (stopset0
, stopset1
, stopset2
);
6037 CaseLabelList := CaseLabels { ',' CaseLabels }
6039 first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
6044 static void CaseLabelList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6046 CaseLabels (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6047 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
6049 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
))));
6050 CaseLabels (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6057 CaseLabels := ConstExpressionNop [ '..' ConstExpressionNop ]
6059 first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
6064 static void CaseLabels (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6066 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodperiodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6067 if (mcLexBuf_currenttoken
== mcReserved_periodperiodtok
)
6069 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
))));
6070 ConstExpressionNop (stopset0
, stopset1
, stopset2
);
6076 WhileStatement := 'WHILE' Expression 'DO' StatementSequence
6079 first symbols:whiletok
6084 static void WhileStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6086 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
))));
6087 Expression (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_dotok
-mcReserved_arraytok
))), stopset2
);
6088 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
))));
6089 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6090 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6095 RepeatStatement := 'REPEAT' StatementSequence 'UNTIL'
6098 first symbols:repeattok
6103 static void RepeatStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6105 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
))));
6106 StatementSequence (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_untiltok
-mcReserved_recordtok
))));
6107 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
))));
6108 Expression (stopset0
, stopset1
, stopset2
);
6113 ForStatement := 'FOR' Ident ':=' Expression 'TO'
6114 Expression [ 'BY' ConstExpressionNop ]
6115 'DO' StatementSequence 'END'
6117 first symbols:fortok
6122 static void ForStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6124 Expect (mcReserved_fortok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6125 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_becomestok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6126 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
))));
6127 Expression (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_totok
-mcReserved_recordtok
))));
6128 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
))));
6129 Expression (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_bytok
-mcReserved_arraytok
)) | (1 << (mcReserved_dotok
-mcReserved_arraytok
))), stopset2
);
6130 if (mcLexBuf_currenttoken
== mcReserved_bytok
)
6132 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
))));
6133 ConstExpressionNop (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_dotok
-mcReserved_arraytok
))), stopset2
);
6135 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
))));
6136 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6137 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6142 LoopStatement := 'LOOP' StatementSequence 'END'
6144 first symbols:looptok
6149 static void LoopStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6151 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
))));
6152 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6153 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6158 WithStatement := 'WITH' Designator 'DO' StatementSequence
6161 first symbols:withtok
6166 static void WithStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6168 Expect (mcReserved_withtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6169 Designator (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_dotok
-mcReserved_arraytok
))), stopset2
);
6170 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
))));
6171 StatementSequence (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6172 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6177 ProcedureDeclaration := ProcedureHeading ';' ProcedureBlock
6182 first symbols:proceduretok
6187 static void ProcedureDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6189 ProcedureHeading (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6190 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
))));
6191 ProcedureBlock (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6192 Ident (stopset0
, stopset1
, stopset2
);
6198 ProcedureIdent := Ident
6199 % curproc := lookupSym (curident) %
6201 % enterScope (curproc) %
6204 first symbols:identtok
6209 static void ProcedureIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6211 Ident (stopset0
, stopset1
, stopset2
);
6212 curproc
= decl_lookupSym (curident
);
6213 decl_enterScope (curproc
);
6218 DefProcedureIdent := Ident
6219 % curproc := lookupSym (curident) %
6222 first symbols:identtok
6227 static void DefProcedureIdent (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6229 Ident (stopset0
, stopset1
, stopset2
);
6230 curproc
= decl_lookupSym (curident
);
6235 DefineBuiltinProcedure := [ '__ATTRIBUTE__' '__BUILTIN__'
6236 '(' '(' Ident ')' ')' |
6239 first symbols:inlinetok, attributetok
6244 static void DefineBuiltinProcedure (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6246 if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
))))) != 0)))
6248 /* avoid gcc warning by using compound statement even if not strictly necessary. */
6249 /* seen optional [ | ] expression */
6250 if (mcLexBuf_currenttoken
== mcReserved_attributetok
)
6252 Expect (mcReserved_attributetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_builtintok
-mcReserved_recordtok
))));
6253 Expect (mcReserved_builtintok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6254 Expect (mcReserved_lparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6255 Expect (mcReserved_lparatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6256 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6257 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6258 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
6260 else if (mcLexBuf_currenttoken
== mcReserved_inlinetok
)
6262 /* avoid dangling else. */
6263 Expect (mcReserved_inlinetok
, stopset0
, stopset1
, stopset2
);
6267 /* avoid dangling else. */
6268 ErrorArray ((const char *) "expecting one of: __INLINE__ __ATTRIBUTE__", 42);
6271 /* end of optional [ | ] expression */
6276 ProcedureHeading := 'PROCEDURE' DefineBuiltinProcedure
6277 ( ProcedureIdent [ FormalParameters ]
6280 first symbols:proceduretok
6285 static void ProcedureHeading (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6287 Expect (mcReserved_proceduretok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) | (1 << (mcReserved_attributetok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6288 DefineBuiltinProcedure (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6289 ProcedureIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6290 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
6292 FormalParameters (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6294 AttributeNoReturn (stopset0
, stopset1
, stopset2
);
6299 Builtin := [ '__BUILTIN__' | '__INLINE__' ]
6301 first symbols:inlinetok, builtintok
6306 static void Builtin (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6308 if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) | (1 << (mcReserved_builtintok
-mcReserved_recordtok
))))) != 0)))
6310 /* avoid gcc warning by using compound statement even if not strictly necessary. */
6311 /* seen optional [ | ] expression */
6312 if (mcLexBuf_currenttoken
== mcReserved_builtintok
)
6314 Expect (mcReserved_builtintok
, stopset0
, stopset1
, stopset2
);
6316 else if (mcLexBuf_currenttoken
== mcReserved_inlinetok
)
6318 /* avoid dangling else. */
6319 Expect (mcReserved_inlinetok
, stopset0
, stopset1
, stopset2
);
6323 /* avoid dangling else. */
6324 ErrorArray ((const char *) "expecting one of: __INLINE__ __BUILTIN__", 40);
6327 /* end of optional [ | ] expression */
6332 DefProcedureHeading := 'PROCEDURE' Builtin ( DefProcedureIdent
6333 [ DefFormalParameters ]
6336 first symbols:proceduretok
6341 static void DefProcedureHeading (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6343 Expect (mcReserved_proceduretok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_inlinetok
-mcReserved_recordtok
)) | (1 << (mcReserved_builtintok
-mcReserved_recordtok
)) | (1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6344 Builtin (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6345 DefProcedureIdent (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
)) | (1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6346 if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
6348 DefFormalParameters (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6350 AttributeNoReturn (stopset0
, stopset1
, stopset2
);
6355 ProcedureBlock := { Declaration } [ 'BEGIN' ProcedureBlockBody ]
6358 first symbols:proceduretok, moduletok, consttok, typetok, vartok, endtok, begintok
6363 static void ProcedureBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6365 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))))
6367 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
))));
6370 if (mcLexBuf_currenttoken
== mcReserved_begintok
)
6372 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
))));
6373 ProcedureBlockBody (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6375 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6380 Block := { Declaration } InitialBlock FinalBlock
6383 first symbols:proceduretok, moduletok, finallytok, begintok, consttok, typetok, vartok, endtok
6388 static void Block (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6390 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))))
6392 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
))));
6395 InitialBlock (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
)) | (1 << (mcReserved_finallytok
-mcReserved_arraytok
))), stopset2
);
6396 FinalBlock (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_endtok
-mcReserved_arraytok
))), stopset2
);
6397 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
);
6402 InitialBlock := [ 'BEGIN' InitialBlockBody ]
6404 first symbols:begintok
6409 static void InitialBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6411 if (mcLexBuf_currenttoken
== mcReserved_begintok
)
6413 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
))));
6414 InitialBlockBody (stopset0
, stopset1
, stopset2
);
6420 FinalBlock := [ 'FINALLY' FinalBlockBody ]
6422 first symbols:finallytok
6427 static void FinalBlock (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6429 if (mcLexBuf_currenttoken
== mcReserved_finallytok
)
6431 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
))));
6432 FinalBlockBody (stopset0
, stopset1
, stopset2
);
6438 InitialBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
6440 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
6445 static void InitialBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6447 NormalPart (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_excepttok
-mcReserved_arraytok
))), stopset2
);
6448 if (mcLexBuf_currenttoken
== mcReserved_excepttok
)
6450 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
))));
6451 ExceptionalPart (stopset0
, stopset1
, stopset2
);
6457 FinalBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
6459 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
6464 static void FinalBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6466 NormalPart (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_excepttok
-mcReserved_arraytok
))), stopset2
);
6467 if (mcLexBuf_currenttoken
== mcReserved_excepttok
)
6469 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
))));
6470 ExceptionalPart (stopset0
, stopset1
, stopset2
);
6476 ProcedureBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
6478 first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
6483 static void ProcedureBlockBody (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6485 NormalPart (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_excepttok
-mcReserved_arraytok
))), stopset2
);
6486 if (mcLexBuf_currenttoken
== mcReserved_excepttok
)
6488 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
))));
6489 ExceptionalPart (stopset0
, stopset1
, stopset2
);
6495 NormalPart := StatementSequence
6497 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
6502 static void NormalPart (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6504 StatementSequence (stopset0
, stopset1
, stopset2
);
6509 ExceptionalPart := StatementSequence
6511 first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
6516 static void ExceptionalPart (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6518 StatementSequence (stopset0
, stopset1
, stopset2
);
6523 Declaration := 'CONST' { ConstantDeclaration ';' } |
6524 'TYPE' { TypeDeclaration } |
6525 'VAR' { VariableDeclaration ';' } |
6526 ProcedureDeclaration ';' |
6527 ModuleDeclaration ';'
6529 first symbols:moduletok, proceduretok, vartok, typetok, consttok
6534 static void Declaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6536 if (mcLexBuf_currenttoken
== mcReserved_consttok
)
6538 Expect (mcReserved_consttok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6539 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
6541 ConstantDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6542 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6546 else if (mcLexBuf_currenttoken
== mcReserved_typetok
)
6548 /* avoid dangling else. */
6549 Expect (mcReserved_typetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6550 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
6552 TypeDeclaration (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6556 else if (mcLexBuf_currenttoken
== mcReserved_vartok
)
6558 /* avoid dangling else. */
6559 Expect (mcReserved_vartok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6560 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
6562 VariableDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6563 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6567 else if (mcLexBuf_currenttoken
== mcReserved_proceduretok
)
6569 /* avoid dangling else. */
6570 ProcedureDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6571 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
6573 else if (mcLexBuf_currenttoken
== mcReserved_moduletok
)
6575 /* avoid dangling else. */
6576 ModuleDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6577 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
6581 /* avoid dangling else. */
6582 ErrorArray ((const char *) "expecting one of: MODULE PROCEDURE VAR TYPE CONST", 49);
6588 DefFormalParameters := '('
6589 % paramEnter (curproc) %
6590 [ DefMultiFPSection ] ')'
6592 % paramLeave (curproc) %
6595 first symbols:lparatok
6600 static void DefFormalParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6602 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
))));
6603 decl_paramEnter (curproc
);
6604 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))))
6606 DefMultiFPSection (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6608 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6609 decl_paramLeave (curproc
);
6610 FormalReturn (stopset0
, stopset1
, stopset2
);
6615 DefMultiFPSection := DefExtendedFP |
6616 FPSection [ ';' DefMultiFPSection ]
6618 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
6623 static void DefMultiFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6625 if ((mcLexBuf_currenttoken
== mcReserved_lsbratok
) || (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
))
6627 DefExtendedFP (stopset0
, stopset1
, stopset2
);
6629 else if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))))) != 0)))
6631 /* avoid dangling else. */
6632 FPSection (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6633 if (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
6635 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
))));
6636 DefMultiFPSection (stopset0
, stopset1
, stopset2
);
6641 /* avoid dangling else. */
6642 ErrorArray ((const char *) "expecting one of: identifier VAR ... [", 38);
6648 FormalParameters := '('
6649 % paramEnter (curproc) %
6650 [ MultiFPSection ] ')'
6651 % paramLeave (curproc) %
6654 first symbols:lparatok
6659 static void FormalParameters (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6661 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
))));
6662 decl_paramEnter (curproc
);
6663 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))))
6665 MultiFPSection (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6667 Expect (mcReserved_rparatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6668 decl_paramLeave (curproc
);
6669 FormalReturn (stopset0
, stopset1
, stopset2
);
6674 AttributeNoReturn := [ NoReturn |
6675 % setNoReturn (curproc, FALSE) %
6678 first symbols:ldirectivetok
6683 static void AttributeNoReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6685 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6687 /* avoid gcc warning by using compound statement even if not strictly necessary. */
6688 /* seen optional [ | ] expression */
6689 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6691 NoReturn (stopset0
, stopset1
, stopset2
);
6695 decl_setNoReturn (curproc
, false);
6698 /* end of optional [ | ] expression */
6705 first symbols:ldirectivetok
6710 static void NoReturn (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6712 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6713 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6714 decl_setNoReturn (curproc
, true);
6715 checkReturnAttribute ();
6716 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
6721 AttributeUnused := [ Unused ]
6723 first symbols:ldirectivetok
6728 static void AttributeUnused (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6730 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6732 Unused (stopset0
, stopset1
, stopset2
);
6740 first symbols:ldirectivetok
6745 static void Unused (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6747 Expect (mcReserved_ldirectivetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6748 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rdirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6750 checkParameterAttribute ();
6751 Expect (mcReserved_rdirectivetok
, stopset0
, stopset1
, stopset2
);
6756 MultiFPSection := ExtendedFP | FPSection [ ';'
6759 first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
6764 static void MultiFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6766 if ((mcLexBuf_currenttoken
== mcReserved_lsbratok
) || (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
))
6768 ExtendedFP (stopset0
, stopset1
, stopset2
);
6770 else if ((mcLexBuf_currenttoken
>= mcReserved_recordtok
) && ((((1 << (mcLexBuf_currenttoken
-mcReserved_recordtok
)) & ((mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
)) | (1 << (mcReserved_vartok
-mcReserved_recordtok
))))) != 0)))
6772 /* avoid dangling else. */
6773 FPSection (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6774 if (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
6776 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
))));
6777 MultiFPSection (stopset0
, stopset1
, stopset2
);
6782 /* avoid dangling else. */
6783 ErrorArray ((const char *) "expecting one of: identifier VAR ... [", 38);
6789 FPSection := NonVarFPSection |
6792 first symbols:vartok, identtok
6797 static void FPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6799 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
6801 NonVarFPSection (stopset0
, stopset1
, stopset2
);
6803 else if (mcLexBuf_currenttoken
== mcReserved_vartok
)
6805 /* avoid dangling else. */
6806 VarFPSection (stopset0
, stopset1
, stopset2
);
6810 /* avoid dangling else. */
6811 ErrorArray ((const char *) "expecting one of: VAR identifier", 32);
6817 DefExtendedFP := DefOptArg | '...'
6818 % addParameter (curproc, makeVarargs ()) %
6821 first symbols:lsbratok, periodperiodperiodtok
6826 static void DefExtendedFP (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6828 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
6830 DefOptArg (stopset0
, stopset1
, stopset2
);
6832 else if (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
)
6834 /* avoid dangling else. */
6835 Expect (mcReserved_periodperiodperiodtok
, stopset0
, stopset1
, stopset2
);
6836 decl_addParameter (curproc
, decl_makeVarargs ());
6840 /* avoid dangling else. */
6841 ErrorArray ((const char *) "expecting one of: ... [", 23);
6847 ExtendedFP := OptArg | '...'
6849 first symbols:lsbratok, periodperiodperiodtok
6854 static void ExtendedFP (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6856 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
6858 OptArg (stopset0
, stopset1
, stopset2
);
6860 else if (mcLexBuf_currenttoken
== mcReserved_periodperiodperiodtok
)
6862 /* avoid dangling else. */
6863 Expect (mcReserved_periodperiodperiodtok
, stopset0
, stopset1
, stopset2
);
6867 /* avoid dangling else. */
6868 ErrorArray ((const char *) "expecting one of: ... [", 23);
6874 VarFPSection := 'VAR' PushIdentList
6875 % VAR l, t: node ; %
6881 % curisused := TRUE %
6883 % addVarParameters (curproc, l, t, curisused) %
6886 first symbols:vartok
6891 static void VarFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6896 Expect (mcReserved_vartok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6897 PushIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6898 Expect (mcReserved_colontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6899 FormalType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6903 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6905 AttributeUnused (stopset0
, stopset1
, stopset2
);
6907 decl_addVarParameters (curproc
, l
, t
, curisused
);
6912 NonVarFPSection := PushIdentList
6913 % VAR l, t: node ; %
6919 % curisused := TRUE %
6921 % addNonVarParameters (curproc, l, t, curisused) %
6924 first symbols:identtok
6929 static void NonVarFPSection (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6934 PushIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6935 Expect (mcReserved_colontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6936 FormalType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6940 if (mcLexBuf_currenttoken
== mcReserved_ldirectivetok
)
6942 AttributeUnused (stopset0
, stopset1
, stopset2
);
6944 decl_addNonVarParameters (curproc
, l
, t
, curisused
);
6950 % VAR p, init, type: node ; id: Name ; %
6957 [ '=' ConstExpression
6960 % p := addOptParameter (curproc, id, type, init) %
6963 first symbols:lsbratok
6968 static void OptArg (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
6975 Expect (mcReserved_lsbratok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6976 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6978 Expect (mcReserved_colontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
6979 FormalType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_equaltok
-mcReserved_eoftok
)) | (1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6981 init
= static_cast<decl_node
> (NULL
);
6982 if (mcLexBuf_currenttoken
== mcReserved_equaltok
)
6984 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
))));
6985 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
6988 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
6989 p
= decl_addOptParameter (curproc
, id
, type
, init
);
6995 % VAR p, init, type: node ; id: Name ; %
7003 % p := addOptParameter (curproc, id, type, init) %
7006 first symbols:lsbratok
7011 static void DefOptArg (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7018 Expect (mcReserved_lsbratok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7019 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7021 Expect (mcReserved_colontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7022 FormalType (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_equaltok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7024 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
))));
7025 ConstExpression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7027 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
7028 p
= decl_addOptParameter (curproc
, id
, type
, init
);
7034 % VAR c: CARDINAL ; %
7036 % VAR n, a, s: node ; %
7042 % pushNunbounded (c) %
7045 first symbols:identtok, arraytok
7050 static void FormalType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7058 while (mcLexBuf_currenttoken
== mcReserved_arraytok
)
7060 Expect (mcReserved_arraytok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_oftok
-mcReserved_arraytok
))), stopset2
);
7061 Expect (mcReserved_oftok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_arraytok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7065 PushQualident (stopset0
, stopset1
, stopset2
);
7071 ModuleDeclaration := 'MODULE' Ident [ Priority ]
7072 ';' { Import } [ Export ]
7075 first symbols:moduletok
7080 static void ModuleDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7082 Expect (mcReserved_moduletok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7083 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) | (1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7084 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
7086 Priority (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7088 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
))));
7089 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)))
7091 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
))));
7094 if (mcLexBuf_currenttoken
== mcReserved_exporttok
)
7096 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
))));
7098 Block (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7099 Ident (stopset0
, stopset1
, stopset2
);
7104 Priority := '[' ConstExpressionNop ']'
7106 first symbols:lsbratok
7111 static void Priority (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7113 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
))));
7114 ConstExpressionNop (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7115 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
7120 Export := 'EXPORT' ( 'QUALIFIED' IdentList |
7121 'UNQUALIFIED' IdentList |
7124 first symbols:exporttok
7129 static void Export (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7131 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
))));
7132 if (mcLexBuf_currenttoken
== mcReserved_qualifiedtok
)
7134 Expect (mcReserved_qualifiedtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7135 IdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7137 else if (mcLexBuf_currenttoken
== mcReserved_unqualifiedtok
)
7139 /* avoid dangling else. */
7140 Expect (mcReserved_unqualifiedtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7141 IdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7143 else if (mcLexBuf_currenttoken
== mcReserved_identtok
)
7145 /* avoid dangling else. */
7146 IdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7150 /* avoid dangling else. */
7151 ErrorArray ((const char *) "expecting one of: identifier UNQUALIFIED QUALIFIED", 50);
7153 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
7158 FromIdentList := Ident
7159 % importInto (frommodule, curident, curmodule) %
7161 % importInto (frommodule, curident, curmodule) %
7164 first symbols:identtok
7169 static void FromIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7171 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7172 importInto (frommodule
, curident
, curmodule
);
7173 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7175 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7176 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7177 importInto (frommodule
, curident
, curmodule
);
7184 FromImport := 'FROM' Ident
7185 % frommodule := lookupDef (curident) %
7186 'IMPORT' FromIdentList ';'
7188 first symbols:fromtok
7193 static void FromImport (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7195 Expect (mcReserved_fromtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7196 Ident (stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_importtok
-mcReserved_arraytok
))), stopset2
);
7197 frommodule
= decl_lookupDef (curident
);
7198 Expect (mcReserved_importtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7199 FromIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7200 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
7205 ImportModuleList := Ident { ',' Ident }
7207 first symbols:identtok
7212 static void ImportModuleList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7214 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7215 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7217 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7218 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7225 WithoutFromImport := 'IMPORT' ImportModuleList ';'
7227 first symbols:importtok
7232 static void WithoutFromImport (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7234 Expect (mcReserved_importtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7235 ImportModuleList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7236 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
7241 Import := FromImport | WithoutFromImport
7243 first symbols:importtok, fromtok
7248 static void Import (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7250 if (mcLexBuf_currenttoken
== mcReserved_fromtok
)
7252 FromImport (stopset0
, stopset1
, stopset2
);
7254 else if (mcLexBuf_currenttoken
== mcReserved_importtok
)
7256 /* avoid dangling else. */
7257 WithoutFromImport (stopset0
, stopset1
, stopset2
);
7261 /* avoid dangling else. */
7262 ErrorArray ((const char *) "expecting one of: IMPORT FROM", 29);
7268 DefinitionModule := 'DEFINITION' 'MODULE' [ 'FOR'
7271 % curmodule := lookupDef (curident) %
7273 % enterScope (curmodule) %
7275 % resetEnumPos (curmodule) %
7276 { Import } [ Export ] { Definition }
7278 % checkEndName (curmodule, curident, 'definition module') %
7280 % setConstExpComplete (curmodule) %
7285 first symbols:definitiontok
7290 static void DefinitionModule (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7292 Expect (mcReserved_definitiontok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_moduletok
-mcReserved_arraytok
))), stopset2
);
7293 Expect (mcReserved_moduletok
, stopset0
, stopset1
|(mcp3_SetOfStop1
) ((1 << (mcReserved_fortok
-mcReserved_arraytok
))), stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7294 if (mcLexBuf_currenttoken
== mcReserved_fortok
)
7296 Expect (mcReserved_fortok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7297 string (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7299 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7300 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
))));
7301 curmodule
= decl_lookupDef (curident
);
7302 decl_enterScope (curmodule
);
7303 decl_resetEnumPos (curmodule
);
7304 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)))
7306 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
))));
7309 if (mcLexBuf_currenttoken
== mcReserved_exporttok
)
7311 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
))));
7313 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))))
7315 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
))));
7318 Expect (mcReserved_endtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7319 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7320 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
);
7321 checkEndName (curmodule
, curident
, (const char *) "definition module", 17);
7322 decl_setConstExpComplete (curmodule
);
7328 PushQualident := Ident
7329 % typeExp := push (lookupSym (curident)) %
7333 metaError1 ('the symbol {%1k} is not visible in this scope (or any other nested scope)', curident)
7336 % IF NOT isDef (typeExp)
7338 ErrorArray ('the first component of this qualident must be a definition module')
7341 % typeExp := replace (lookupInScope (typeExp, curident)) ;
7344 ErrorArray ('identifier not found in definition module')
7348 first symbols:identtok
7353 static void PushQualident (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7355 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_periodtok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7356 typeExp
= push (decl_lookupSym (curident
));
7357 if (typeExp
== NULL
)
7359 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));
7361 if (mcLexBuf_currenttoken
== mcReserved_periodtok
)
7363 Expect (mcReserved_periodtok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7364 if (! (decl_isDef (typeExp
)))
7366 ErrorArray ((const char *) "the first component of this qualident must be a definition module", 65);
7368 Ident (stopset0
, stopset1
, stopset2
);
7369 typeExp
= replace (decl_lookupInScope (typeExp
, curident
));
7370 if (typeExp
== NULL
)
7372 ErrorArray ((const char *) "identifier not found in definition module", 41);
7379 OptSubrange := [ SubrangeType
7380 % VAR q, s: node ; %
7386 % putSubrangeType (s, q) %
7388 % typeExp := push (s) %
7391 first symbols:lsbratok
7396 static void OptSubrange (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7401 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
7403 SubrangeType (stopset0
, stopset1
, stopset2
);
7406 decl_putSubrangeType (s
, q
);
7413 TypeEquiv := PushQualident OptSubrange
7415 first symbols:identtok
7420 static void TypeEquiv (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7422 PushQualident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7423 OptSubrange (stopset0
, stopset1
, stopset2
);
7431 % typeExp := push (makeEnum ()) %
7433 % f := makeEnumField (typeExp, curident) %
7435 % f := makeEnumField (typeExp, curident) %
7438 first symbols:identtok
7443 static void EnumIdentList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7447 typeExp
= push (decl_makeEnum ());
7448 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7449 f
= decl_makeEnumField (typeExp
, curident
);
7450 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7452 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7453 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7454 f
= decl_makeEnumField (typeExp
, curident
);
7461 Enumeration := '(' EnumIdentList ')'
7463 first symbols:lparatok
7468 static void Enumeration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7470 Expect (mcReserved_lparatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7471 EnumIdentList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7472 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
7478 % VAR d: CARDINAL ; %
7481 ( TypeEquiv | Enumeration |
7483 % assert (d = depth () - 1) %
7486 first symbols:lsbratok, lparatok, identtok
7491 static void SimpleType (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7496 if (mcLexBuf_currenttoken
== mcReserved_identtok
)
7498 TypeEquiv (stopset0
, stopset1
, stopset2
);
7500 else if (mcLexBuf_currenttoken
== mcReserved_lparatok
)
7502 /* avoid dangling else. */
7503 Enumeration (stopset0
, stopset1
, stopset2
);
7505 else if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
7507 /* avoid dangling else. */
7508 SubrangeType (stopset0
, stopset1
, stopset2
);
7512 /* avoid dangling else. */
7513 ErrorArray ((const char *) "expecting one of: [ ( identifier", 32);
7515 mcDebug_assert (d
== ((depth ())-1));
7520 Type := SimpleType | ArrayType | RecordType |
7521 SetType | PointerType | ProcedureType
7523 first symbols:proceduretok, pointertok, settok, packedsettok, oftok, recordtok, arraytok, identtok, lparatok, lsbratok
7528 static void Type (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7530 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
))
7532 SimpleType (stopset0
, stopset1
, stopset2
);
7534 else if (mcLexBuf_currenttoken
== mcReserved_arraytok
)
7536 /* avoid dangling else. */
7537 ArrayType (stopset0
, stopset1
, stopset2
);
7539 else if (mcLexBuf_currenttoken
== mcReserved_recordtok
)
7541 /* avoid dangling else. */
7542 RecordType (stopset0
, stopset1
, stopset2
);
7544 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
))
7546 /* avoid dangling else. */
7547 SetType (stopset0
, stopset1
, stopset2
);
7549 else if (mcLexBuf_currenttoken
== mcReserved_pointertok
)
7551 /* avoid dangling else. */
7552 PointerType (stopset0
, stopset1
, stopset2
);
7554 else if (mcLexBuf_currenttoken
== mcReserved_proceduretok
)
7556 /* avoid dangling else. */
7557 ProcedureType (stopset0
, stopset1
, stopset2
);
7561 /* avoid dangling else. */
7562 ErrorArray ((const char *) "expecting one of: PROCEDURE POINTER SET PACKEDSET OF RECORD ARRAY identifier ( [", 80);
7568 TypeDeclaration := { Ident
7569 % typeDes := lookupSym (curident) %
7571 % putType (typeDes, pop ()) %
7574 first symbols:identtok
7579 static void TypeDeclaration (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7581 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
7583 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
)) | (1 << (mcReserved_equaltok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7584 typeDes
= decl_lookupSym (curident
);
7585 if (mcLexBuf_currenttoken
== mcReserved_semicolontok
)
7587 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7589 else if (mcLexBuf_currenttoken
== mcReserved_equaltok
)
7591 /* avoid dangling else. */
7592 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
))));
7593 Type (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_ldirectivetok
-mcReserved_eoftok
)) | (1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7594 decl_putType (typeDes
, pop ());
7595 Alignment (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7596 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7600 /* avoid dangling else. */
7601 ErrorArray ((const char *) "expecting one of: = ;", 21);
7609 Definition := 'CONST' { ConstantDeclaration ';' } |
7610 'TYPE' { TypeDeclaration } |
7611 'VAR' { VariableDeclaration ';' } |
7612 DefProcedureHeading ';'
7614 first symbols:proceduretok, vartok, typetok, consttok
7619 static void Definition (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7621 if (mcLexBuf_currenttoken
== mcReserved_consttok
)
7623 Expect (mcReserved_consttok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7624 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
7626 ConstantDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7627 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7631 else if (mcLexBuf_currenttoken
== mcReserved_typetok
)
7633 /* avoid dangling else. */
7634 Expect (mcReserved_typetok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7635 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
7637 TypeDeclaration (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7641 else if (mcLexBuf_currenttoken
== mcReserved_vartok
)
7643 /* avoid dangling else. */
7644 Expect (mcReserved_vartok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7645 while (mcLexBuf_currenttoken
== mcReserved_identtok
)
7647 VariableDeclaration (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7648 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7652 else if (mcLexBuf_currenttoken
== mcReserved_proceduretok
)
7654 /* avoid dangling else. */
7655 DefProcedureHeading (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_semicolontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7656 Expect (mcReserved_semicolontok
, stopset0
, stopset1
, stopset2
);
7660 /* avoid dangling else. */
7661 ErrorArray ((const char *) "expecting one of: PROCEDURE VAR TYPE CONST", 42);
7667 AsmStatement := 'ASM' [ 'VOLATILE' ] '(' AsmOperands
7670 first symbols:asmtok
7675 static void AsmStatement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7677 Expect (mcReserved_asmtok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_volatiletok
-mcReserved_recordtok
))));
7678 if (mcLexBuf_currenttoken
== mcReserved_volatiletok
)
7680 Expect (mcReserved_volatiletok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7682 Expect (mcReserved_lparatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7683 AsmOperands (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7684 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
7689 AsmOperands := string [ AsmOperandSpec ]
7691 first symbols:stringtok
7696 static void AsmOperands (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7698 string (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7699 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
7701 AsmOperandSpec (stopset0
, stopset1
, stopset2
);
7707 AsmOperandSpec := [ ':' AsmList [ ':' AsmList [
7710 first symbols:colontok
7715 static void AsmOperandSpec (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7717 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
7719 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
))));
7720 AsmList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7721 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
7723 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
))));
7724 AsmList (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_colontok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7725 if (mcLexBuf_currenttoken
== mcReserved_colontok
)
7727 Expect (mcReserved_colontok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7728 TrashList (stopset0
, stopset1
, stopset2
);
7736 AsmList := [ AsmElement ] { ',' AsmElement }
7738 first symbols:lsbratok, stringtok, commatok
7743 static void AsmList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7745 if ((mcLexBuf_currenttoken
== mcReserved_lsbratok
) || (mcLexBuf_currenttoken
== mcReserved_stringtok
))
7747 AsmElement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7749 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7751 Expect (mcReserved_commatok
, stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7752 AsmElement (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7759 NamedOperand := '[' Ident ']'
7761 first symbols:lsbratok
7766 static void NamedOperand (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7768 Expect (mcReserved_lsbratok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_identtok
-mcReserved_recordtok
))));
7769 Ident (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rsbratok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7770 Expect (mcReserved_rsbratok
, stopset0
, stopset1
, stopset2
);
7775 AsmOperandName := [ NamedOperand ]
7777 first symbols:lsbratok
7782 static void AsmOperandName (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7784 if (mcLexBuf_currenttoken
== mcReserved_lsbratok
)
7786 NamedOperand (stopset0
, stopset1
, stopset2
);
7792 AsmElement := AsmOperandName string '(' Expression
7795 first symbols:stringtok, lsbratok
7800 static void AsmElement (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7802 AsmOperandName (stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7803 string (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_lparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7804 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
))));
7805 Expression (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_rparatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7806 Expect (mcReserved_rparatok
, stopset0
, stopset1
, stopset2
);
7811 TrashList := [ string ] { ',' string }
7813 first symbols:commatok, stringtok
7818 static void TrashList (mcp3_SetOfStop0 stopset0
, mcp3_SetOfStop1 stopset1
, mcp3_SetOfStop2 stopset2
)
7820 if (mcLexBuf_currenttoken
== mcReserved_stringtok
)
7822 string (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7824 while (mcLexBuf_currenttoken
== mcReserved_commatok
)
7826 Expect (mcReserved_commatok
, stopset0
, stopset1
, stopset2
|(mcp3_SetOfStop2
) ((1 << (mcReserved_stringtok
-mcReserved_recordtok
))));
7827 string (stopset0
|(mcp3_SetOfStop0
) ((1 << (mcReserved_commatok
-mcReserved_eoftok
))), stopset1
, stopset2
);
7834 CompilationUnit - returns TRUE if the input was correct enough to parse
7838 extern "C" bool mcp3_CompilationUnit (void)
7840 stk
= mcStack_init ();
7842 FileUnit ((mcp3_SetOfStop0
) ((1 << (mcReserved_eoftok
-mcReserved_eoftok
))), (mcp3_SetOfStop1
) 0, (mcp3_SetOfStop2
) 0);
7843 mcStack_kill (&stk
);
7845 /* static analysis guarentees a RETURN statement will be used before here. */
7846 __builtin_unreachable ();
7849 extern "C" void _M2_mcp3_init (__attribute__((unused
)) int argc
, __attribute__((unused
)) char *argv
[], __attribute__((unused
)) char *envp
[])
7853 extern "C" void _M2_mcp3_fini (__attribute__((unused
)) int argc
, __attribute__((unused
)) char *argv
[], __attribute__((unused
)) char *envp
[])