aboutsummaryrefslogtreecommitdiff
path: root/gcc/m2/mc-boot/Gmcp3.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/m2/mc-boot/Gmcp3.c')
-rw-r--r--gcc/m2/mc-boot/Gmcp3.c7854
1 files changed, 7854 insertions, 0 deletions
diff --git a/gcc/m2/mc-boot/Gmcp3.c b/gcc/m2/mc-boot/Gmcp3.c
new file mode 100644
index 0000000..5491326
--- /dev/null
+++ b/gcc/m2/mc-boot/Gmcp3.c
@@ -0,0 +1,7854 @@
+/* do not edit automatically generated by mc from mcp3. */
+/* output from mc-3.bnf, automatically generated do not edit.
+
+Copyright (C) 2015-2022 Free Software Foundation, Inc.
+Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
+
+This file is part of GNU Modula-2.
+
+GNU Modula-2 is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GNU Modula-2 is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Modula-2; see the file COPYING. If not,
+see <https://www.gnu.org/licenses/>. */
+
+#include "config.h"
+#include "system.h"
+# if !defined (PROC_D)
+# define PROC_D
+ typedef void (*PROC_t) (void);
+ typedef struct { PROC_t proc; } PROC;
+# endif
+
+# if !defined (TRUE)
+# define TRUE (1==1)
+# endif
+
+# if !defined (FALSE)
+# define FALSE (1==0)
+# endif
+
+#if defined(__cplusplus)
+# undef NULL
+# define NULL 0
+#endif
+#define _mcp3_H
+#define _mcp3_C
+
+# include "GDynamicStrings.h"
+# include "GmcError.h"
+# include "GnameKey.h"
+# include "GmcPrintf.h"
+# include "GmcDebug.h"
+# include "GmcReserved.h"
+# include "GmcMetaError.h"
+# include "GmcStack.h"
+# include "GmcLexBuf.h"
+# include "Gdecl.h"
+
+# define Pass1 FALSE
+# define Debugging FALSE
+typedef unsigned int mcp3_stop0;
+
+typedef unsigned int mcp3_SetOfStop0;
+
+typedef unsigned int mcp3_stop1;
+
+typedef unsigned int mcp3_SetOfStop1;
+
+typedef unsigned int mcp3_stop2;
+
+typedef unsigned int mcp3_SetOfStop2;
+
+static unsigned int WasNoError;
+static unsigned int curisused;
+static nameKey_Name curstring;
+static nameKey_Name curident;
+static decl_node curproc;
+static decl_node frommodule;
+static decl_node typeDes;
+static decl_node typeExp;
+static decl_node curmodule;
+static mcStack_stack stk;
+
+/*
+ CompilationUnit - returns TRUE if the input was correct enough to parse
+ in future passes.
+*/
+
+extern "C" unsigned int mcp3_CompilationUnit (void);
+
+/*
+ push -
+*/
+
+static decl_node push (decl_node n);
+
+/*
+ pop -
+*/
+
+static decl_node pop (void);
+
+/*
+ replace -
+*/
+
+static decl_node replace (decl_node n);
+
+/*
+ peep - returns the top node on the stack without removing it.
+*/
+
+static decl_node peep (void);
+
+/*
+ depth - returns the depth of the stack.
+*/
+
+static unsigned int depth (void);
+
+/*
+ checkDuplicate -
+*/
+
+static void checkDuplicate (unsigned int b);
+
+/*
+ checkDuplicate -
+*/
+
+static void ErrorString (DynamicStrings_String s);
+
+/*
+ checkDuplicate -
+*/
+
+static void ErrorArray (const char *a_, unsigned int _a_high);
+
+/*
+ checkParameterAttribute -
+*/
+
+static void checkParameterAttribute (void);
+
+/*
+ checkReturnAttribute -
+*/
+
+static void checkReturnAttribute (void);
+
+/*
+ pushNunbounded -
+*/
+
+static void pushNunbounded (unsigned int c);
+
+/*
+ makeIndexedArray - builds and returns an array of type, t, with, c, indices.
+*/
+
+static decl_node makeIndexedArray (unsigned int c, decl_node t);
+
+/*
+ importInto - from, m, import, name, into module, current.
+ It checks to see if curident is an enumeration type
+ and if so automatically includes all enumeration fields
+ as well.
+*/
+
+static void importInto (decl_node m, nameKey_Name name, decl_node current);
+
+/*
+ checkEndName - if module does not have, name, then issue an error containing, desc.
+*/
+
+static void checkEndName (decl_node module, nameKey_Name name, const char *desc_, unsigned int _desc_high);
+
+/*
+ DescribeStop - issues a message explaining what tokens were expected
+*/
+
+static DynamicStrings_String DescribeStop (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DescribeError - issues a message explaining what tokens were expected
+*/
+
+static void DescribeError (void);
+
+/*
+ SyntaxError - after a syntax error we skip all tokens up until we reach
+ a stop symbol.
+*/
+
+static void SyntaxError (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ SyntaxCheck -
+*/
+
+static void SyntaxCheck (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ WarnMissingToken - generates a warning message about a missing token, t.
+*/
+
+static void WarnMissingToken (mcReserved_toktype t);
+
+/*
+ MissingToken - generates a warning message about a missing token, t.
+*/
+
+static void MissingToken (mcReserved_toktype t);
+
+/*
+ CheckAndInsert -
+*/
+
+static unsigned int CheckAndInsert (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ InStopSet
+*/
+
+static unsigned int InStopSet (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ PeepToken - peep token checks to see whether the stopset is satisfied by currenttoken
+ If it is not then it will insert a token providing the token
+ is one of ; ] ) } . OF END ,
+
+ if the stopset contains <identtok> then we do not insert a token
+*/
+
+static void PeepToken (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Expect -
+*/
+
+static void Expect (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Ident - error checking varient of Ident
+*/
+
+static void Ident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ string -
+*/
+
+static void string (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Integer -
+*/
+
+static void Integer (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Real -
+*/
+
+static void Real (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FileUnit := DefinitionModule |
+ ImplementationOrProgramModule
+
+ first symbols:implementationtok, moduletok, definitiontok
+
+ cannot reachend
+*/
+
+static void FileUnit (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ProgramModule := 'MODULE' Ident
+ % curmodule := lookupModule (curident) %
+
+ % enterScope (curmodule) %
+
+ % resetEnumPos (curmodule) %
+ [ Priority ] ';' { Import } Block
+ Ident
+ % checkEndName (curmodule, curident, 'program module') %
+
+ % setConstExpComplete (curmodule) %
+
+ % leaveScope %
+ '.'
+
+ first symbols:moduletok
+
+ cannot reachend
+*/
+
+static void ProgramModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ImplementationModule := 'IMPLEMENTATION' 'MODULE'
+ Ident
+ % curmodule := lookupImp (curident) %
+
+ % enterScope (lookupDef (curident)) %
+
+ % enterScope (curmodule) %
+
+ % resetEnumPos (curmodule) %
+ [ Priority ] ';' { Import }
+ Block Ident
+ % checkEndName (curmodule, curident, 'implementation module') %
+
+ % setConstExpComplete (curmodule) %
+
+ % leaveScope ; leaveScope %
+ '.'
+
+ first symbols:implementationtok
+
+ cannot reachend
+*/
+
+static void ImplementationModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ImplementationOrProgramModule := ImplementationModule |
+ ProgramModule
+
+ first symbols:moduletok, implementationtok
+
+ cannot reachend
+*/
+
+static void ImplementationOrProgramModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Number := Integer | Real
+
+ first symbols:realtok, integertok
+
+ cannot reachend
+*/
+
+static void Number (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Qualident := Ident { '.' Ident }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void Qualident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstantDeclaration :=
+ % VAR d, e: node ; %
+ Ident
+ % d := lookupSym (curident) %
+ '=' ConstExpression
+ % e := pop () %
+
+ % assert (isConst (d)) %
+
+ % putConst (d, e) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void ConstantDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstExpressionNop := SimpleConstExpr
+ % VAR n: node ; %
+ [ Relation SimpleConstExpr ]
+
+ % n := makeConstExp () %
+
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void ConstExpressionNop (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstExpression :=
+ % VAR n: node ; %
+
+ % n := push (makeConstExp ()) %
+ SimpleConstExpr [ Relation SimpleConstExpr ]
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void ConstExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Relation := '=' | '#' | '<>' | '<' | '<=' |
+ '>' | '>=' | 'IN'
+
+ first symbols:intok, greaterequaltok, greatertok, lessequaltok, lesstok, lessgreatertok, hashtok, equaltok
+
+ cannot reachend
+*/
+
+static void Relation (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ SimpleConstExpr := UnaryOrConstTerm { AddOperator
+ ConstTerm }
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void SimpleConstExpr (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ UnaryOrConstTerm := '+' ConstTerm |
+ '-' ConstTerm |
+ ConstTerm
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void UnaryOrConstTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AddOperator := '+' | '-' | 'OR'
+
+ first symbols:ortok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void AddOperator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstTerm := ConstFactor { MulOperator ConstFactor }
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok
+
+ cannot reachend
+*/
+
+static void ConstTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ MulOperator := '*' | '/' | 'DIV' | 'MOD' |
+ 'REM' | 'AND' | '&'
+
+ first symbols:ambersandtok, andtok, remtok, modtok, divtok, dividetok, timestok
+
+ cannot reachend
+*/
+
+static void MulOperator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstFactor := Number | ConstString |
+ ConstSetOrQualidentOrFunction |
+ '(' ConstExpressionNop ')' |
+ 'NOT' ConstFactor |
+ ConstAttribute
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok
+
+ cannot reachend
+*/
+
+static void ConstFactor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstString := string
+
+ first symbols:stringtok
+
+ cannot reachend
+*/
+
+static void ConstString (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ComponentElement := ConstExpressionNop [ '..' ConstExpressionNop ]
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ComponentElement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ComponentValue := ComponentElement [ 'BY' ConstExpressionNop ]
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void ComponentValue (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ArraySetRecordValue := ComponentValue { ',' ComponentValue }
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ArraySetRecordValue (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Constructor := '{' [ ArraySetRecordValue ] '}'
+
+ first symbols:lcbratok
+
+ cannot reachend
+*/
+
+static void Constructor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstSetOrQualidentOrFunction := Qualident [ Constructor |
+ ConstActualParameters ] |
+ Constructor
+
+ first symbols:lcbratok, identtok
+
+ cannot reachend
+*/
+
+static void ConstSetOrQualidentOrFunction (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstActualParameters := '(' [ ConstExpList ] ')'
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void ConstActualParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstExpList := ConstExpressionNop { ',' ConstExpressionNop }
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ConstExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstAttribute := '__ATTRIBUTE__' '__BUILTIN__'
+ '(' '(' ConstAttributeExpression
+ ')' ')'
+
+ first symbols:attributetok
+
+ cannot reachend
+*/
+
+static void ConstAttribute (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ConstAttributeExpression := Ident | '<' Qualident
+ ',' Ident '>'
+
+ first symbols:lesstok, identtok
+
+ cannot reachend
+*/
+
+static void ConstAttributeExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ByteAlignment := ''
+
+ first symbols:ldirectivetok
+
+ cannot reachend
+*/
+
+static void ByteAlignment (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ OptAlignmentExpression := [ AlignmentExpression ]
+
+ first symbols:lparatok
+
+ reachend
+*/
+
+static void OptAlignmentExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AlignmentExpression := '(' ConstExpressionNop ')'
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void AlignmentExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Alignment := [ ByteAlignment ]
+
+ first symbols:ldirectivetok
+
+ reachend
+*/
+
+static void Alignment (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ IdentList := Ident { ',' Ident }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void IdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ PushIdentList :=
+ % VAR n: node ; %
+
+ % n := makeIdentList () %
+ Ident
+ % checkDuplicate (putIdent (n, curident)) %
+ { ',' Ident
+ % checkDuplicate (putIdent (n, curident)) %
+ }
+ % n := push (n) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void PushIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ SubrangeType :=
+ % VAR low, high: node ; d: CARDINAL ; %
+ '['
+ % d := depth () %
+ ConstExpression
+ % low := pop () %
+
+ % assert (d = depth ()) %
+ '..' ConstExpression
+ % high := pop () %
+
+ % assert (d = depth ()) %
+
+ % typeExp := push (makeSubrange (low, high)) %
+
+ % assert (d = depth () - 1) %
+ ']'
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void SubrangeType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ArrayType := 'ARRAY'
+ % VAR c: CARDINAL ; t, n: node ; %
+
+ % c := 0 %
+ SimpleType
+ % INC (c) %
+ { ',' SimpleType
+ % INC (c) %
+ } 'OF' Type
+ % n := push (makeIndexedArray (c, pop ())) %
+
+
+ first symbols:arraytok
+
+ cannot reachend
+*/
+
+static void ArrayType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ RecordType := 'RECORD'
+ % VAR n: node ; %
+
+ % n := push (makeRecord ()) %
+
+ % n := push (NIL) no varient %
+ [ DefaultRecordAttributes ] FieldListSequence
+
+ % assert (pop ()=NIL) %
+ 'END'
+
+ first symbols:recordtok
+
+ cannot reachend
+*/
+
+static void RecordType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DefaultRecordAttributes := ''
+
+ first symbols:ldirectivetok
+
+ cannot reachend
+*/
+
+static void DefaultRecordAttributes (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ RecordFieldPragma := [ '' ]
+
+ first symbols:ldirectivetok
+
+ reachend
+*/
+
+static void RecordFieldPragma (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FieldPragmaExpression := Ident PragmaConstExpression
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void FieldPragmaExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ PragmaConstExpression := [ '(' ConstExpressionNop
+ ')' ]
+
+ first symbols:lparatok
+
+ reachend
+*/
+
+static void PragmaConstExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AttributeExpression := Ident '(' ConstExpressionNop
+ ')'
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void AttributeExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FieldListSequence := FieldListStatement { ';' FieldListStatement }
+
+ first symbols:casetok, identtok, semicolontok
+
+ reachend
+*/
+
+static void FieldListSequence (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FieldListStatement := [ FieldList ]
+
+ first symbols:identtok, casetok
+
+ reachend
+*/
+
+static void FieldListStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FieldList :=
+ % VAR r, i, f, t, n, v, w: node ; d: CARDINAL ; %
+
+ % d := depth () %
+
+ % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
+
+ % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
+
+ % v := push (v) %
+
+ % assert (d=depth ()) %
+
+ % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isVarientField (r))) %
+ PushIdentList ':'
+ % assert (d=depth () - 1) %
+
+ % i := pop () %
+ Type
+ % assert (d=depth () - 1) %
+
+ % t := pop () %
+ RecordFieldPragma
+ % assert (d=depth ()) %
+
+ % r := addFieldsToRecord (r, v, i, t) %
+
+ % assert (d=depth ()) %
+ |
+ 'CASE'
+ % addRecordToList %
+
+ % d := depth () %
+
+ % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
+
+ % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
+
+ % v := push (v) %
+
+ % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isRecordField (r))) %
+
+ % w := push (makeVarient (r)) %
+
+ % assert (d = depth () - 1) %
+
+ % addVarientToList %
+ CaseTag 'OF'
+ % assert (d = depth () - 1) %
+ Varient
+ % assert (d = depth () - 1) %
+ { '|' Varient
+ % assert (d = depth () - 1) %
+ }
+ % w := peep () ; assert (isVarient (w)) %
+
+ % assert (d = depth () - 1) %
+ [ 'ELSE' FieldListSequence ] 'END'
+
+ % w := pop () ; assert (isVarient (w)) %
+
+ % assert (d=depth ()) %
+
+
+ first symbols:casetok, identtok
+
+ cannot reachend
+*/
+
+static void FieldList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ TagIdent := Ident |
+ % curident := NulName %
+
+
+ first symbols:identtok
+
+ reachend
+*/
+
+static void TagIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ CaseTag :=
+ % VAR tagident: Name ; q, v, w, r: node ; %
+
+ % w := pop () ; v := pop () ; r := peep () ; v := push (v) ; w := push (w) %
+
+ % assert (isVarient (w)) %
+
+ % assert ((v=NIL) OR isVarient (v)) %
+
+ % assert (isRecord (r) OR isVarientField (r)) %
+
+ % assert (isVarient (push (pop ()))) %
+ TagIdent
+ % tagident := curident %
+ ( ':' PushQualident
+ % q := pop () %
+
+ % assert (isVarient (push (pop ()))) %
+ |
+ % q := NIL %
+ )
+ % buildVarientSelector (r, w, tagident, q) %
+
+
+ first symbols:colontok, identtok
+
+ reachend
+*/
+
+static void CaseTag (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Varient :=
+ % VAR p, r, v, f: node ; d: CARDINAL ; %
+
+ % d := depth () %
+
+ % assert (isVarient (peep ())) %
+ [
+ % v := pop () ; assert (isVarient (v)) %
+
+ % r := pop () %
+
+ % p := peep () %
+
+ % r := push (r) %
+
+ % f := push (buildVarientFieldRecord (v, p)) %
+
+ % v := push (v) %
+ VarientCaseLabelList ':' FieldListSequence
+
+ % v := pop () %
+
+ % f := pop () %
+
+ % assert (isVarientField (f)) %
+
+ % assert (isVarient (v)) %
+
+ % v := push (v) %
+ ]
+ % assert (isVarient (peep ())) %
+
+ % assert (d=depth ()) %
+
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ reachend
+*/
+
+static void Varient (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ VarientCaseLabelList := VarientCaseLabels { ','
+ VarientCaseLabels }
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void VarientCaseLabelList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ VarientCaseLabels :=
+ % VAR l, h: node ; %
+
+ % h := NIL %
+ ConstExpression
+ % l := pop () %
+ [ '..' ConstExpression
+ % h := pop () %
+ ]
+ % l, h could be saved if necessary. %
+
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void VarientCaseLabels (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ SetType := ( 'SET' | 'PACKEDSET' ) 'OF' SimpleType
+
+ % VAR n: node ; %
+
+ % n := push (makeSet (pop ())) %
+
+
+ first symbols:oftok, packedsettok, settok
+
+ cannot reachend
+*/
+
+static void SetType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ PointerType := 'POINTER' 'TO' Type
+ % VAR n: node ; %
+
+ % n := push (makePointer (pop ())) %
+
+
+ first symbols:pointertok
+
+ cannot reachend
+*/
+
+static void PointerType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ProcedureType := 'PROCEDURE'
+ % curproc := push (makeProcType ()) %
+ [ FormalTypeList ]
+
+ first symbols:proceduretok
+
+ cannot reachend
+*/
+
+static void ProcedureType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FormalTypeList := '(' ( ')' FormalReturn |
+ ProcedureParameters ')'
+ FormalReturn )
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void FormalTypeList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FormalReturn := [ ':' OptReturnType ]
+
+ first symbols:colontok
+
+ reachend
+*/
+
+static void FormalReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ OptReturnType := '[' PushQualident
+ % putReturnType (curproc, pop ()) %
+
+ % putOptReturn (curproc) %
+ ']' | PushQualident
+ % putReturnType (curproc, pop ()) %
+
+
+ first symbols:identtok, lsbratok
+
+ cannot reachend
+*/
+
+static void OptReturnType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ProcedureParameters := ProcedureParameter
+ % addParameter (curproc, pop ()) %
+ { ',' ProcedureParameter
+
+ % addParameter (curproc, pop ()) %
+ }
+
+ first symbols:identtok, arraytok, periodperiodperiodtok, vartok
+
+ cannot reachend
+*/
+
+static void ProcedureParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ProcedureParameter := '...'
+ % VAR n: node ; %
+
+ % n := push (makeVarargs ()) %
+ | 'VAR' FormalType
+ % n := push (makeVarParameter (NIL, pop (), curproc, TRUE)) %
+ | FormalType
+ % n := push (makeNonVarParameter (NIL, pop (), curproc, TRUE)) %
+
+
+ first symbols:identtok, arraytok, vartok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void ProcedureParameter (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ VarIdent :=
+ % VAR n, a: node ; %
+
+ % n := pop () %
+ Ident
+ % checkDuplicate (putIdent (n, curident)) %
+
+ % n := push (n) %
+ [ '[' ConstExpression
+ % a := pop () could store, a, into, n. %
+ ']' ]
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void VarIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ VarIdentList :=
+ % VAR n: node ; %
+
+ % n := makeIdentList () %
+
+ % n := push (n) %
+ VarIdent { ',' VarIdent }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void VarIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ VariableDeclaration :=
+ % VAR v, d: node ; %
+ VarIdentList
+ % v := pop () %
+ ':' Type
+ % d := makeVarDecl (v, pop ()) %
+ Alignment
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void VariableDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Designator := Qualident { SubDesignator }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void Designator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ SubDesignator := '.' Ident | '[' ArrayExpList ']' |
+ '^'
+
+ first symbols:uparrowtok, lsbratok, periodtok
+
+ cannot reachend
+*/
+
+static void SubDesignator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ArrayExpList := Expression { ',' Expression }
+
+ first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ArrayExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ExpList := Expression { ',' Expression }
+
+ first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Expression := SimpleExpression [ Relation SimpleExpression ]
+
+ first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void Expression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ SimpleExpression := UnaryOrTerm { AddOperator Term }
+
+ first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void SimpleExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ UnaryOrTerm := '+' Term | '-' Term |
+ Term
+
+ first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void UnaryOrTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Term := Factor { MulOperator Factor }
+
+ first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok
+
+ cannot reachend
+*/
+
+static void Term (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Factor := Number | string | SetOrDesignatorOrFunction |
+ '(' Expression ')' |
+ 'NOT' ( Factor | ConstAttribute )
+
+ first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok
+
+ cannot reachend
+*/
+
+static void Factor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ SetOrDesignatorOrFunction := Qualident [ Constructor |
+ SimpleDes
+ [ ActualParameters ] ] |
+ Constructor
+
+ first symbols:lcbratok, identtok
+
+ cannot reachend
+*/
+
+static void SetOrDesignatorOrFunction (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ SimpleDes := { SubDesignator }
+
+ first symbols:periodtok, lsbratok, uparrowtok
+
+ reachend
+*/
+
+static void SimpleDes (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ActualParameters := '(' [ ExpList ] ')'
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void ActualParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ExitStatement := 'EXIT'
+
+ first symbols:exittok
+
+ cannot reachend
+*/
+
+static void ExitStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ReturnStatement := 'RETURN' [ Expression ]
+
+ first symbols:returntok
+
+ cannot reachend
+*/
+
+static void ReturnStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Statement := [ AssignmentOrProcedureCall |
+ IfStatement | CaseStatement |
+ WhileStatement |
+ RepeatStatement |
+ LoopStatement | ForStatement |
+ WithStatement | AsmStatement |
+ ExitStatement | ReturnStatement |
+ RetryStatement ]
+
+ first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok
+
+ reachend
+*/
+
+static void Statement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ RetryStatement := 'RETRY'
+
+ first symbols:retrytok
+
+ cannot reachend
+*/
+
+static void RetryStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AssignmentOrProcedureCall := Designator ( ':=' Expression |
+ ActualParameters |
+
+ % epsilon %
+ )
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void AssignmentOrProcedureCall (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ StatementSequence := Statement { ';' Statement }
+
+ first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok
+
+ reachend
+*/
+
+static void StatementSequence (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ IfStatement := 'IF' Expression 'THEN' StatementSequence
+ { 'ELSIF' Expression 'THEN' StatementSequence }
+ [ 'ELSE' StatementSequence ] 'END'
+
+ first symbols:iftok
+
+ cannot reachend
+*/
+
+static void IfStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ CaseStatement := 'CASE' Expression 'OF' Case { '|'
+ Case }
+ CaseEndStatement
+
+ first symbols:casetok
+
+ cannot reachend
+*/
+
+static void CaseStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ CaseEndStatement := 'END' | 'ELSE' StatementSequence
+ 'END'
+
+ first symbols:elsetok, endtok
+
+ cannot reachend
+*/
+
+static void CaseEndStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Case := [ CaseLabelList ':' StatementSequence ]
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ reachend
+*/
+
+static void Case (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ CaseLabelList := CaseLabels { ',' CaseLabels }
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void CaseLabelList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ CaseLabels := ConstExpressionNop [ '..' ConstExpressionNop ]
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void CaseLabels (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ WhileStatement := 'WHILE' Expression 'DO' StatementSequence
+ 'END'
+
+ first symbols:whiletok
+
+ cannot reachend
+*/
+
+static void WhileStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ RepeatStatement := 'REPEAT' StatementSequence 'UNTIL'
+ Expression
+
+ first symbols:repeattok
+
+ cannot reachend
+*/
+
+static void RepeatStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ForStatement := 'FOR' Ident ':=' Expression 'TO'
+ Expression [ 'BY' ConstExpressionNop ]
+ 'DO' StatementSequence 'END'
+
+ first symbols:fortok
+
+ cannot reachend
+*/
+
+static void ForStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ LoopStatement := 'LOOP' StatementSequence 'END'
+
+ first symbols:looptok
+
+ cannot reachend
+*/
+
+static void LoopStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ WithStatement := 'WITH' Designator 'DO' StatementSequence
+ 'END'
+
+ first symbols:withtok
+
+ cannot reachend
+*/
+
+static void WithStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ProcedureDeclaration := ProcedureHeading ';' ProcedureBlock
+ Ident
+ % leaveScope %
+
+
+ first symbols:proceduretok
+
+ cannot reachend
+*/
+
+static void ProcedureDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ProcedureIdent := Ident
+ % curproc := lookupSym (curident) %
+
+ % enterScope (curproc) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void ProcedureIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DefProcedureIdent := Ident
+ % curproc := lookupSym (curident) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void DefProcedureIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DefineBuiltinProcedure := [ '__ATTRIBUTE__' '__BUILTIN__'
+ '(' '(' Ident ')' ')' |
+ '__INLINE__' ]
+
+ first symbols:inlinetok, attributetok
+
+ reachend
+*/
+
+static void DefineBuiltinProcedure (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ProcedureHeading := 'PROCEDURE' DefineBuiltinProcedure
+ ( ProcedureIdent [ FormalParameters ]
+ AttributeNoReturn )
+
+ first symbols:proceduretok
+
+ cannot reachend
+*/
+
+static void ProcedureHeading (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Builtin := [ '__BUILTIN__' | '__INLINE__' ]
+
+ first symbols:inlinetok, builtintok
+
+ reachend
+*/
+
+static void Builtin (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DefProcedureHeading := 'PROCEDURE' Builtin ( DefProcedureIdent
+ [ DefFormalParameters ]
+ AttributeNoReturn )
+
+ first symbols:proceduretok
+
+ cannot reachend
+*/
+
+static void DefProcedureHeading (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ProcedureBlock := { Declaration } [ 'BEGIN' ProcedureBlockBody ]
+ 'END'
+
+ first symbols:proceduretok, moduletok, consttok, typetok, vartok, endtok, begintok
+
+ cannot reachend
+*/
+
+static void ProcedureBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Block := { Declaration } InitialBlock FinalBlock
+ 'END'
+
+ first symbols:proceduretok, moduletok, finallytok, begintok, consttok, typetok, vartok, endtok
+
+ cannot reachend
+*/
+
+static void Block (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ InitialBlock := [ 'BEGIN' InitialBlockBody ]
+
+ first symbols:begintok
+
+ reachend
+*/
+
+static void InitialBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FinalBlock := [ 'FINALLY' FinalBlockBody ]
+
+ first symbols:finallytok
+
+ reachend
+*/
+
+static void FinalBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ InitialBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
+
+ first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
+
+ reachend
+*/
+
+static void InitialBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FinalBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
+
+ first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
+
+ reachend
+*/
+
+static void FinalBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ProcedureBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
+
+ first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
+
+ reachend
+*/
+
+static void ProcedureBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ NormalPart := StatementSequence
+
+ first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
+
+ reachend
+*/
+
+static void NormalPart (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ExceptionalPart := StatementSequence
+
+ first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
+
+ reachend
+*/
+
+static void ExceptionalPart (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Declaration := 'CONST' { ConstantDeclaration ';' } |
+ 'TYPE' { TypeDeclaration } |
+ 'VAR' { VariableDeclaration ';' } |
+ ProcedureDeclaration ';' |
+ ModuleDeclaration ';'
+
+ first symbols:moduletok, proceduretok, vartok, typetok, consttok
+
+ cannot reachend
+*/
+
+static void Declaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DefFormalParameters := '('
+ % paramEnter (curproc) %
+ [ DefMultiFPSection ] ')'
+
+ % paramLeave (curproc) %
+ FormalReturn
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void DefFormalParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DefMultiFPSection := DefExtendedFP |
+ FPSection [ ';' DefMultiFPSection ]
+
+ first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void DefMultiFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FormalParameters := '('
+ % paramEnter (curproc) %
+ [ MultiFPSection ] ')'
+ % paramLeave (curproc) %
+ FormalReturn
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void FormalParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AttributeNoReturn := [ NoReturn |
+ % setNoReturn (curproc, FALSE) %
+ ]
+
+ first symbols:ldirectivetok
+
+ reachend
+*/
+
+static void AttributeNoReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ NoReturn := ''
+
+ first symbols:ldirectivetok
+
+ cannot reachend
+*/
+
+static void NoReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AttributeUnused := [ Unused ]
+
+ first symbols:ldirectivetok
+
+ reachend
+*/
+
+static void AttributeUnused (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Unused := ''
+
+ first symbols:ldirectivetok
+
+ cannot reachend
+*/
+
+static void Unused (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ MultiFPSection := ExtendedFP | FPSection [ ';'
+ MultiFPSection ]
+
+ first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void MultiFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FPSection := NonVarFPSection |
+ VarFPSection
+
+ first symbols:vartok, identtok
+
+ cannot reachend
+*/
+
+static void FPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DefExtendedFP := DefOptArg | '...'
+ % addParameter (curproc, makeVarargs ()) %
+
+
+ first symbols:lsbratok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void DefExtendedFP (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ExtendedFP := OptArg | '...'
+
+ first symbols:lsbratok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void ExtendedFP (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ VarFPSection := 'VAR' PushIdentList
+ % VAR l, t: node ; %
+ ':' FormalType
+ % t := pop () %
+
+ % l := pop () %
+
+ % curisused := TRUE %
+ [ AttributeUnused ]
+ % addVarParameters (curproc, l, t, curisused) %
+
+
+ first symbols:vartok
+
+ cannot reachend
+*/
+
+static void VarFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ NonVarFPSection := PushIdentList
+ % VAR l, t: node ; %
+ ':' FormalType
+ % t := pop () %
+
+ % l := pop () %
+
+ % curisused := TRUE %
+ [ AttributeUnused ]
+ % addNonVarParameters (curproc, l, t, curisused) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void NonVarFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ OptArg :=
+ % VAR p, init, type: node ; id: Name ; %
+ '[' Ident
+ % id := curident %
+ ':' FormalType
+ % type := pop () %
+
+ % init := NIL %
+ [ '=' ConstExpression
+ % init := pop () %
+ ] ']'
+ % p := addOptParameter (curproc, id, type, init) %
+
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void OptArg (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DefOptArg :=
+ % VAR p, init, type: node ; id: Name ; %
+ '[' Ident
+ % id := curident %
+ ':' FormalType
+ % type := pop () %
+ '=' ConstExpression
+ % init := pop () %
+ ']'
+ % p := addOptParameter (curproc, id, type, init) %
+
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void DefOptArg (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FormalType :=
+ % VAR c: CARDINAL ; %
+
+ % VAR n, a, s: node ; %
+
+ % c := 0 %
+ { 'ARRAY' 'OF'
+ % INC (c) %
+ } PushQualident
+ % pushNunbounded (c) %
+
+
+ first symbols:identtok, arraytok
+
+ cannot reachend
+*/
+
+static void FormalType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ModuleDeclaration := 'MODULE' Ident [ Priority ]
+ ';' { Import } [ Export ]
+ Block Ident
+
+ first symbols:moduletok
+
+ cannot reachend
+*/
+
+static void ModuleDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Priority := '[' ConstExpressionNop ']'
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void Priority (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Export := 'EXPORT' ( 'QUALIFIED' IdentList |
+ 'UNQUALIFIED' IdentList |
+ IdentList ) ';'
+
+ first symbols:exporttok
+
+ cannot reachend
+*/
+
+static void Export (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FromIdentList := Ident
+ % importInto (frommodule, curident, curmodule) %
+ { ',' Ident
+ % importInto (frommodule, curident, curmodule) %
+ }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void FromIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ FromImport := 'FROM' Ident
+ % frommodule := lookupDef (curident) %
+ 'IMPORT' FromIdentList ';'
+
+ first symbols:fromtok
+
+ cannot reachend
+*/
+
+static void FromImport (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ ImportModuleList := Ident { ',' Ident }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void ImportModuleList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ WithoutFromImport := 'IMPORT' ImportModuleList ';'
+
+ first symbols:importtok
+
+ cannot reachend
+*/
+
+static void WithoutFromImport (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Import := FromImport | WithoutFromImport
+
+ first symbols:importtok, fromtok
+
+ cannot reachend
+*/
+
+static void Import (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ DefinitionModule := 'DEFINITION' 'MODULE' [ 'FOR'
+ string ]
+ Ident ';'
+ % curmodule := lookupDef (curident) %
+
+ % enterScope (curmodule) %
+
+ % resetEnumPos (curmodule) %
+ { Import } [ Export ] { Definition }
+ 'END' Ident '.'
+ % checkEndName (curmodule, curident, 'definition module') %
+
+ % setConstExpComplete (curmodule) %
+
+ % leaveScope %
+
+
+ first symbols:definitiontok
+
+ cannot reachend
+*/
+
+static void DefinitionModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ PushQualident := Ident
+ % typeExp := push (lookupSym (curident)) %
+
+ % IF typeExp = NIL
+ THEN
+ metaError1 ('the symbol {%1k} is not visible in this scope (or any other nested scope)', curident)
+ END %
+ [ '.'
+ % IF NOT isDef (typeExp)
+ THEN
+ ErrorArray ('the first component of this qualident must be a definition module')
+ END %
+ Ident
+ % typeExp := replace (lookupInScope (typeExp, curident)) ;
+ IF typeExp=NIL
+ THEN
+ ErrorArray ('identifier not found in definition module')
+ END %
+ ]
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void PushQualident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ OptSubrange := [ SubrangeType
+ % VAR q, s: node ; %
+
+ % s := pop () %
+
+ % q := pop () %
+
+ % putSubrangeType (s, q) %
+
+ % typeExp := push (s) %
+ ]
+
+ first symbols:lsbratok
+
+ reachend
+*/
+
+static void OptSubrange (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ TypeEquiv := PushQualident OptSubrange
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void TypeEquiv (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ EnumIdentList :=
+ % VAR f: node ; %
+
+ % typeExp := push (makeEnum ()) %
+ Ident
+ % f := makeEnumField (typeExp, curident) %
+ { ',' Ident
+ % f := makeEnumField (typeExp, curident) %
+ }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void EnumIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Enumeration := '(' EnumIdentList ')'
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void Enumeration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ SimpleType :=
+ % VAR d: CARDINAL ; %
+
+ % d := depth () %
+ ( TypeEquiv | Enumeration |
+ SubrangeType )
+ % assert (d = depth () - 1) %
+
+
+ first symbols:lsbratok, lparatok, identtok
+
+ cannot reachend
+*/
+
+static void SimpleType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Type := SimpleType | ArrayType | RecordType |
+ SetType | PointerType | ProcedureType
+
+ first symbols:proceduretok, pointertok, settok, packedsettok, oftok, recordtok, arraytok, identtok, lparatok, lsbratok
+
+ cannot reachend
+*/
+
+static void Type (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ TypeDeclaration := { Ident
+ % typeDes := lookupSym (curident) %
+ ( ';' | '=' Type
+ % putType (typeDes, pop ()) %
+ Alignment ';' ) }
+
+ first symbols:identtok
+
+ reachend
+*/
+
+static void TypeDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ Definition := 'CONST' { ConstantDeclaration ';' } |
+ 'TYPE' { TypeDeclaration } |
+ 'VAR' { VariableDeclaration ';' } |
+ DefProcedureHeading ';'
+
+ first symbols:proceduretok, vartok, typetok, consttok
+
+ cannot reachend
+*/
+
+static void Definition (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AsmStatement := 'ASM' [ 'VOLATILE' ] '(' AsmOperands
+ ')'
+
+ first symbols:asmtok
+
+ cannot reachend
+*/
+
+static void AsmStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AsmOperands := string [ AsmOperandSpec ]
+
+ first symbols:stringtok
+
+ cannot reachend
+*/
+
+static void AsmOperands (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AsmOperandSpec := [ ':' AsmList [ ':' AsmList [
+ ':' TrashList ] ] ]
+
+ first symbols:colontok
+
+ reachend
+*/
+
+static void AsmOperandSpec (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AsmList := [ AsmElement ] { ',' AsmElement }
+
+ first symbols:lsbratok, stringtok, commatok
+
+ reachend
+*/
+
+static void AsmList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ NamedOperand := '[' Ident ']'
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void NamedOperand (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AsmOperandName := [ NamedOperand ]
+
+ first symbols:lsbratok
+
+ reachend
+*/
+
+static void AsmOperandName (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ AsmElement := AsmOperandName string '(' Expression
+ ')'
+
+ first symbols:stringtok, lsbratok
+
+ cannot reachend
+*/
+
+static void AsmElement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+/*
+ TrashList := [ string ] { ',' string }
+
+ first symbols:commatok, stringtok
+
+ reachend
+*/
+
+static void TrashList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2);
+
+
+/*
+ push -
+*/
+
+static decl_node push (decl_node n)
+{
+ return static_cast<decl_node> (mcStack_push (stk, reinterpret_cast<void *> (n)));
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ pop -
+*/
+
+static decl_node pop (void)
+{
+ return static_cast<decl_node> (mcStack_pop (stk));
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ replace -
+*/
+
+static decl_node replace (decl_node n)
+{
+ return static_cast<decl_node> (mcStack_replace (stk, reinterpret_cast<void *> (n)));
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ peep - returns the top node on the stack without removing it.
+*/
+
+static decl_node peep (void)
+{
+ return push (pop ());
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ depth - returns the depth of the stack.
+*/
+
+static unsigned int depth (void)
+{
+ return mcStack_depth (stk);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ checkDuplicate -
+*/
+
+static void checkDuplicate (unsigned int b)
+{
+}
+
+
+/*
+ checkDuplicate -
+*/
+
+static void ErrorString (DynamicStrings_String s)
+{
+ mcError_errorStringAt (s, mcLexBuf_getTokenNo ());
+ WasNoError = FALSE;
+}
+
+
+/*
+ checkDuplicate -
+*/
+
+static void ErrorArray (const char *a_, unsigned int _a_high)
+{
+ char a[_a_high+1];
+
+ /* make a local copy of each unbounded array. */
+ memcpy (a, a_, _a_high+1);
+
+ ErrorString (DynamicStrings_InitString ((const char *) a, _a_high));
+}
+
+
+/*
+ checkParameterAttribute -
+*/
+
+static void checkParameterAttribute (void)
+{
+ if ((nameKey_makeKey ((const char *) "unused", 6)) != curident)
+ {
+ 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));
+ }
+}
+
+
+/*
+ checkReturnAttribute -
+*/
+
+static void checkReturnAttribute (void)
+{
+ if ((nameKey_makeKey ((const char *) "noreturn", 8)) != curident)
+ {
+ 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));
+ }
+}
+
+
+/*
+ pushNunbounded -
+*/
+
+static void pushNunbounded (unsigned int c)
+{
+ decl_node type;
+ decl_node array;
+ decl_node subrange;
+
+ while (c != 0)
+ {
+ type = pop ();
+ subrange = decl_makeSubrange (static_cast<decl_node> (NULL), static_cast<decl_node> (NULL));
+ decl_putSubrangeType (subrange, decl_getCardinal ());
+ array = decl_makeArray (subrange, type);
+ decl_putUnbounded (array);
+ type = push (array);
+ c -= 1;
+ }
+}
+
+
+/*
+ makeIndexedArray - builds and returns an array of type, t, with, c, indices.
+*/
+
+static decl_node makeIndexedArray (unsigned int c, decl_node t)
+{
+ decl_node i;
+
+ while (c > 0)
+ {
+ t = decl_makeArray (pop (), t);
+ c -= 1;
+ }
+ return t;
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ importInto - from, m, import, name, into module, current.
+ It checks to see if curident is an enumeration type
+ and if so automatically includes all enumeration fields
+ as well.
+*/
+
+static void importInto (decl_node m, nameKey_Name name, decl_node current)
+{
+ decl_node s;
+ decl_node o;
+
+ mcDebug_assert (decl_isDef (m));
+ mcDebug_assert (((decl_isDef (current)) || (decl_isModule (current))) || (decl_isImp (current)));
+ s = decl_lookupExported (m, name);
+ if (s == NULL)
+ {
+ 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));
+ }
+ else
+ {
+ o = decl_import (current, s);
+ if (s != o)
+ {
+ 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));
+ }
+ }
+}
+
+
+/*
+ checkEndName - if module does not have, name, then issue an error containing, desc.
+*/
+
+static void checkEndName (decl_node module, nameKey_Name name, const char *desc_, unsigned int _desc_high)
+{
+ DynamicStrings_String s;
+ char desc[_desc_high+1];
+
+ /* make a local copy of each unbounded array. */
+ memcpy (desc, desc_, _desc_high+1);
+
+ if ((decl_getSymName (module)) != name)
+ {
+ s = DynamicStrings_InitString ((const char *) "inconsistent module name found with this ", 41);
+ s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) desc, _desc_high)));
+ ErrorString (s);
+ }
+}
+
+
+/*
+ DescribeStop - issues a message explaining what tokens were expected
+*/
+
+static DynamicStrings_String DescribeStop (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ unsigned int n;
+ DynamicStrings_String str;
+ DynamicStrings_String message;
+
+ n = 0;
+ message = DynamicStrings_InitString ((const char *) "", 0);
+ if ((((1 << (mcReserved_stringtok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "string", 6)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_realtok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "real number", 11)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_identtok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "identifier", 10)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_integertok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "integer number", 14)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_inlinetok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__INLINE__", 10)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_builtintok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__BUILTIN__", 11)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_attributetok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__ATTRIBUTE__", 13)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_filetok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__FILE__", 8)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_linetok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__LINE__", 8)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_datetok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "__DATE__", 8)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_periodperiodperiodtok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "...", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_volatiletok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "VOLATILE", 8)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_asmtok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ASM", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_withtok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "WITH", 4)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_whiletok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "WHILE", 5)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_vartok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "VAR", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_untiltok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "UNTIL", 5)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_typetok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "TYPE", 4)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_totok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "TO", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_thentok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "THEN", 4)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_settok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "SET", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_returntok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RETURN", 6)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_retrytok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RETRY", 5)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_repeattok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "REPEAT", 6)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_remtok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "REM", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_recordtok-mcReserved_recordtok)) & (stopset2)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "RECORD", 6)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_unqualifiedtok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "UNQUALIFIED", 11)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_qualifiedtok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "QUALIFIED", 9)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_proceduretok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "PROCEDURE", 9)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_pointertok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "POINTER", 7)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_packedsettok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "PACKEDSET", 9)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_ortok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "OR", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_oftok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "OF", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_nottok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "NOT", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_moduletok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MODULE", 6)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_modtok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MOD", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_looptok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "LOOP", 4)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_intok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IN", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_importtok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IMPORT", 6)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_implementationtok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IMPLEMENTATION", 14)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_iftok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "IF", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_fromtok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FROM", 4)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_fortok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FOR", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_finallytok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "FINALLY", 7)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_exporttok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXPORT", 6)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_exittok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXIT", 4)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_excepttok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "EXCEPT", 6)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_endtok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "END", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_elsiftok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ELSIF", 5)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_elsetok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ELSE", 4)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_dotok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DO", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_divtok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DIV", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_definitiontok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "DEFINITION", 10)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_consttok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "CONST", 5)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_casetok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "CASE", 4)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_bytok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "BY", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_begintok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "BEGIN", 5)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_arraytok-mcReserved_arraytok)) & (stopset1)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "ARRAY", 5)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_andtok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "AND", 3)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_colontok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ":", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_periodperiodtok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "..", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_rdirectivetok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "*>", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_ldirectivetok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<*", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_greaterequaltok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ">=", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_lessequaltok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<=", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_lessgreatertok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<>", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_hashtok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "#", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_equaltok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "=", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_uparrowtok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "^", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_semicolontok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ";", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_commatok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ",", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_periodtok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_ambersandtok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "&", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_dividetok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "/", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_timestok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "*", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_minustok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "-", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_plustok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "+", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_doublequotestok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (message, ' '), '`'), '"'), '\''), ',');
+ n += 1;
+ }
+ if ((((1 << (mcReserved_singlequotetok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (message, ' '), '"'), '\''), '"'), ',');
+ n += 1;
+ }
+ if ((((1 << (mcReserved_greatertok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ">", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_lesstok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "<", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_rparatok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ")", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_lparatok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "(", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_rcbratok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "}", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_lcbratok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "{", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_rsbratok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "]", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_lsbratok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "[", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_bartok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "|", 1)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_becomestok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {
+ message = DynamicStrings_ConCat (DynamicStrings_ConCatChar (message, ' '), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ":=", 2)));
+ n += 1;
+ }
+ if ((((1 << (mcReserved_eoftok-mcReserved_eoftok)) & (stopset0)) != 0))
+ {} /* empty. */
+ /* eoftok has no token name (needed to generate error messages) */
+ if (n == 0)
+ {
+ str = DynamicStrings_InitString ((const char *) " syntax error", 13);
+ message = DynamicStrings_KillString (message);
+ }
+ else if (n == 1)
+ {
+ /* avoid dangling else. */
+ str = DynamicStrings_ConCat (message, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " missing ", 9)));
+ }
+ else
+ {
+ /* avoid dangling else. */
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) " expecting one of", 17), message);
+ message = DynamicStrings_KillString (message);
+ }
+ return str;
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ DescribeError - issues a message explaining what tokens were expected
+*/
+
+static void DescribeError (void)
+{
+ DynamicStrings_String str;
+
+ str = DynamicStrings_InitString ((const char *) "", 0);
+ switch (mcLexBuf_currenttoken)
+ {
+ case mcReserved_stringtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found string", 26), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_realtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found real number", 31), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_identtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found identifier", 30), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_integertok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found integer number", 34), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_inlinetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __INLINE__", 30), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_builtintok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __BUILTIN__", 31), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_attributetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __ATTRIBUTE__", 33), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_filetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __FILE__", 28), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_linetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __LINE__", 28), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_datetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found __DATE__", 28), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_periodperiodperiodtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ...", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_volatiletok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found VOLATILE", 28), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_asmtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ASM", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_withtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found WITH", 24), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_whiletok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found WHILE", 25), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_vartok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found VAR", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_untiltok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found UNTIL", 25), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_typetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found TYPE", 24), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_totok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found TO", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_thentok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found THEN", 24), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_settok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found SET", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_returntok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RETURN", 26), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_retrytok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RETRY", 25), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_repeattok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found REPEAT", 26), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_remtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found REM", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_recordtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found RECORD", 26), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_unqualifiedtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found UNQUALIFIED", 31), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_qualifiedtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found QUALIFIED", 29), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_proceduretok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found PROCEDURE", 29), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_pointertok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found POINTER", 27), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_packedsettok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found PACKEDSET", 29), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_ortok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found OR", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_oftok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found OF", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_nottok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found NOT", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_moduletok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found MODULE", 26), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_modtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found MOD", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_looptok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found LOOP", 24), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_intok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IN", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_importtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IMPORT", 26), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_implementationtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IMPLEMENTATION", 34), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_iftok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found IF", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_fromtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FROM", 24), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_fortok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FOR", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_finallytok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found FINALLY", 27), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_exporttok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXPORT", 26), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_exittok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXIT", 24), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_excepttok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found EXCEPT", 26), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_endtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found END", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_elsiftok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ELSIF", 25), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_elsetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ELSE", 24), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_dotok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DO", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_divtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DIV", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_definitiontok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found DEFINITION", 30), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_consttok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found CONST", 25), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_casetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found CASE", 24), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_bytok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found BY", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_begintok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found BEGIN", 25), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_arraytok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ARRAY", 25), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_andtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found AND", 23), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_colontok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found :", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_periodperiodtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ..", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_rdirectivetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found *>", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_ldirectivetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <*", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_greaterequaltok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found >=", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_lessequaltok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <=", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_lessgreatertok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <>", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_hashtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found #", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_equaltok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found =", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_uparrowtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ^", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_semicolontok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ;", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_commatok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ,", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_periodtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found .", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_ambersandtok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found &", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_dividetok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found /", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_timestok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found *", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_minustok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found -", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_plustok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found +", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_doublequotestok:
+ str = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_InitString ((const char *) "syntax error, found '", 21), '"'), '\''), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_singlequotetok:
+ str = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_ConCatChar (DynamicStrings_InitString ((const char *) "syntax error, found \"", 21), '\''), '"'), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_greatertok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found >", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_lesstok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found <", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_rparatok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found )", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_lparatok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found (", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_rcbratok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found }", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_lcbratok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found {", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_rsbratok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ]", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_lsbratok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found [", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_bartok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found |", 21), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_becomestok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found :=", 22), DynamicStrings_Mark (str));
+ break;
+
+ case mcReserved_eoftok:
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error, found ", 20), DynamicStrings_Mark (str));
+ break;
+
+
+ default:
+ break;
+ }
+ ErrorString (str);
+}
+
+
+/*
+ SyntaxError - after a syntax error we skip all tokens up until we reach
+ a stop symbol.
+*/
+
+static void SyntaxError (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ DescribeError ();
+ if (Debugging)
+ {
+ mcPrintf_printf0 ((const char *) "\\nskipping token *** ", 21);
+ }
+ /*
+ yes the ORD(currenttoken) looks ugly, but it is *much* safer than
+ using currenttoken<sometok as a change to the ordering of the
+ token declarations below would cause this to break. Using ORD() we are
+ immune from such changes
+ */
+ 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)))))
+ {
+ mcLexBuf_getToken ();
+ }
+ if (Debugging)
+ {
+ mcPrintf_printf0 ((const char *) " ***\\n", 6);
+ }
+}
+
+
+/*
+ SyntaxCheck -
+*/
+
+static void SyntaxCheck (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ /* and again (see above re: ORD)
+ */
+ 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)))))
+ {
+ SyntaxError (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ WarnMissingToken - generates a warning message about a missing token, t.
+*/
+
+static void WarnMissingToken (mcReserved_toktype t)
+{
+ mcp3_SetOfStop0 s0;
+ mcp3_SetOfStop1 s1;
+ mcp3_SetOfStop2 s2;
+ DynamicStrings_String str;
+
+ s0 = (mcp3_SetOfStop0) 0;
+ s1 = (mcp3_SetOfStop1) 0;
+ s2 = (mcp3_SetOfStop2) 0;
+ if ( ((unsigned int) (t)) < 32)
+ {
+ s0 = (mcp3_SetOfStop0) ((1 << (t-mcReserved_eoftok)));
+ }
+ else if ( ((unsigned int) (t)) < 64)
+ {
+ /* avoid dangling else. */
+ s1 = (mcp3_SetOfStop1) ((1 << (t-mcReserved_arraytok)));
+ }
+ else
+ {
+ /* avoid dangling else. */
+ s2 = (mcp3_SetOfStop2) ((1 << (t-mcReserved_recordtok)));
+ }
+ str = DescribeStop (s0, s1, s2);
+ str = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "syntax error,", 13), DynamicStrings_Mark (str));
+ mcError_errorStringAt (str, mcLexBuf_getTokenNo ());
+}
+
+
+/*
+ MissingToken - generates a warning message about a missing token, t.
+*/
+
+static void MissingToken (mcReserved_toktype t)
+{
+ WarnMissingToken (t);
+ if ((((t != mcReserved_identtok) && (t != mcReserved_integertok)) && (t != mcReserved_realtok)) && (t != mcReserved_stringtok))
+ {
+ if (Debugging)
+ {
+ mcPrintf_printf0 ((const char *) "inserting token\\n", 17);
+ }
+ mcLexBuf_insertToken (t);
+ }
+}
+
+
+/*
+ CheckAndInsert -
+*/
+
+static unsigned int CheckAndInsert (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))))
+ {
+ WarnMissingToken (t);
+ mcLexBuf_insertTokenAndRewind (t);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ InStopSet
+*/
+
+static unsigned int InStopSet (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))))
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ PeepToken - peep token checks to see whether the stopset is satisfied by currenttoken
+ If it is not then it will insert a token providing the token
+ is one of ; ] ) } . OF END ,
+
+ if the stopset contains <identtok> then we do not insert a token
+*/
+
+static void PeepToken (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ /* and again (see above re: ORD)
+ */
+ 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))))
+ {
+ /* SyntaxCheck would fail since currentoken is not part of the stopset
+ we check to see whether any of currenttoken might be a commonly omitted token */
+ 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)))
+ {} /* empty. */
+ }
+}
+
+
+/*
+ Expect -
+*/
+
+static void Expect (mcReserved_toktype t, mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == t)
+ {
+ /* avoid dangling else. */
+ mcLexBuf_getToken ();
+ if (Pass1)
+ {
+ PeepToken (stopset0, stopset1, stopset2);
+ }
+ }
+ else
+ {
+ MissingToken (t);
+ }
+ SyntaxCheck (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Ident - error checking varient of Ident
+*/
+
+static void Ident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ curident = nameKey_makekey (mcLexBuf_currentstring);
+ Expect (mcReserved_identtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ string -
+*/
+
+static void string (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ curstring = nameKey_makekey (mcLexBuf_currentstring);
+ Expect (mcReserved_stringtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Integer -
+*/
+
+static void Integer (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_integertok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Real -
+*/
+
+static void Real (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_realtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ FileUnit := DefinitionModule |
+ ImplementationOrProgramModule
+
+ first symbols:implementationtok, moduletok, definitiontok
+
+ cannot reachend
+*/
+
+static void FileUnit (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_definitiontok)
+ {
+ DefinitionModule (stopset0, stopset1, stopset2);
+ }
+ 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)))
+ {
+ /* avoid dangling else. */
+ ImplementationOrProgramModule (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: IMPLEMENTATION MODULE DEFINITION", 50);
+ }
+}
+
+
+/*
+ ProgramModule := 'MODULE' Ident
+ % curmodule := lookupModule (curident) %
+
+ % enterScope (curmodule) %
+
+ % resetEnumPos (curmodule) %
+ [ Priority ] ';' { Import } Block
+ Ident
+ % checkEndName (curmodule, curident, 'program module') %
+
+ % setConstExpComplete (curmodule) %
+
+ % leaveScope %
+ '.'
+
+ first symbols:moduletok
+
+ cannot reachend
+*/
+
+static void ProgramModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_moduletok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ curmodule = decl_lookupModule (curident);
+ decl_enterScope (curmodule);
+ decl_resetEnumPos (curmodule);
+ if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ Priority (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ 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))));
+ 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)))
+ {
+ 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))));
+ }
+ /* while */
+ Block (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
+ checkEndName (curmodule, curident, (const char *) "program module", 14);
+ decl_setConstExpComplete (curmodule);
+ decl_leaveScope ();
+ Expect (mcReserved_periodtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ImplementationModule := 'IMPLEMENTATION' 'MODULE'
+ Ident
+ % curmodule := lookupImp (curident) %
+
+ % enterScope (lookupDef (curident)) %
+
+ % enterScope (curmodule) %
+
+ % resetEnumPos (curmodule) %
+ [ Priority ] ';' { Import }
+ Block Ident
+ % checkEndName (curmodule, curident, 'implementation module') %
+
+ % setConstExpComplete (curmodule) %
+
+ % leaveScope ; leaveScope %
+ '.'
+
+ first symbols:implementationtok
+
+ cannot reachend
+*/
+
+static void ImplementationModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_implementationtok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2);
+ Expect (mcReserved_moduletok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ curmodule = decl_lookupImp (curident);
+ decl_enterScope (decl_lookupDef (curident));
+ decl_enterScope (curmodule);
+ decl_resetEnumPos (curmodule);
+ if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ Priority (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ 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))));
+ 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)))
+ {
+ 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))));
+ }
+ /* while */
+ Block (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
+ checkEndName (curmodule, curident, (const char *) "implementation module", 21);
+ decl_setConstExpComplete (curmodule);
+ decl_leaveScope ();
+ decl_leaveScope ();
+ Expect (mcReserved_periodtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ImplementationOrProgramModule := ImplementationModule |
+ ProgramModule
+
+ first symbols:moduletok, implementationtok
+
+ cannot reachend
+*/
+
+static void ImplementationOrProgramModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_implementationtok)
+ {
+ ImplementationModule (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_moduletok)
+ {
+ /* avoid dangling else. */
+ ProgramModule (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: MODULE IMPLEMENTATION", 39);
+ }
+}
+
+
+/*
+ Number := Integer | Real
+
+ first symbols:realtok, integertok
+
+ cannot reachend
+*/
+
+static void Number (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_integertok)
+ {
+ Integer (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_realtok)
+ {
+ /* avoid dangling else. */
+ Real (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: real number integer number", 44);
+ }
+}
+
+
+/*
+ Qualident := Ident { '.' Ident }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void Qualident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_periodtok)
+ {
+ Expect (mcReserved_periodtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ ConstantDeclaration :=
+ % VAR d, e: node ; %
+ Ident
+ % d := lookupSym (curident) %
+ '=' ConstExpression
+ % e := pop () %
+
+ % assert (isConst (d)) %
+
+ % putConst (d, e) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void ConstantDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node d;
+ decl_node e;
+
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_equaltok-mcReserved_eoftok))), stopset1, stopset2);
+ d = decl_lookupSym (curident);
+ 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))));
+ ConstExpression (stopset0, stopset1, stopset2);
+ e = pop ();
+ mcDebug_assert (decl_isConst (d));
+ decl_putConst (d, e);
+}
+
+
+/*
+ ConstExpressionNop := SimpleConstExpr
+ % VAR n: node ; %
+ [ Relation SimpleConstExpr ]
+
+ % n := makeConstExp () %
+
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void ConstExpressionNop (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node n;
+
+ 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);
+ 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))
+ {
+ 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))));
+ SimpleConstExpr (stopset0, stopset1, stopset2);
+ }
+ n = decl_makeConstExp ();
+}
+
+
+/*
+ ConstExpression :=
+ % VAR n: node ; %
+
+ % n := push (makeConstExp ()) %
+ SimpleConstExpr [ Relation SimpleConstExpr ]
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void ConstExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node n;
+
+ n = push (decl_makeConstExp ());
+ 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);
+ 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))
+ {
+ 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))));
+ SimpleConstExpr (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ Relation := '=' | '#' | '<>' | '<' | '<=' |
+ '>' | '>=' | 'IN'
+
+ first symbols:intok, greaterequaltok, greatertok, lessequaltok, lesstok, lessgreatertok, hashtok, equaltok
+
+ cannot reachend
+*/
+
+static void Relation (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_equaltok)
+ {
+ Expect (mcReserved_equaltok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_hashtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_hashtok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lessgreatertok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_lessgreatertok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lesstok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_lesstok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lessequaltok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_lessequaltok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_greatertok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_greatertok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_greaterequaltok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_greaterequaltok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_intok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_intok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: IN >= > <= < <> # =", 37);
+ }
+}
+
+
+/*
+ SimpleConstExpr := UnaryOrConstTerm { AddOperator
+ ConstTerm }
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void SimpleConstExpr (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ UnaryOrConstTerm (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_ortok-mcReserved_arraytok))), stopset2);
+ 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))
+ {
+ 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))));
+ ConstTerm (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_ortok-mcReserved_arraytok))), stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ UnaryOrConstTerm := '+' ConstTerm |
+ '-' ConstTerm |
+ ConstTerm
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void UnaryOrConstTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_plustok)
+ {
+ 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))));
+ ConstTerm (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_minustok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ ConstTerm (stopset0, stopset1, stopset2);
+ }
+ 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))))
+ {
+ /* avoid dangling else. */
+ ConstTerm (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: NOT ( integer number real number __ATTRIBUTE__ identifier { string - +", 88);
+ }
+}
+
+
+/*
+ AddOperator := '+' | '-' | 'OR'
+
+ first symbols:ortok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void AddOperator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_plustok)
+ {
+ Expect (mcReserved_plustok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_minustok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_minustok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_ortok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_ortok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: OR - +", 24);
+ }
+}
+
+
+/*
+ ConstTerm := ConstFactor { MulOperator ConstFactor }
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok
+
+ cannot reachend
+*/
+
+static void ConstTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ 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))
+ {
+ 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))));
+ 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))));
+ }
+ /* while */
+}
+
+
+/*
+ MulOperator := '*' | '/' | 'DIV' | 'MOD' |
+ 'REM' | 'AND' | '&'
+
+ first symbols:ambersandtok, andtok, remtok, modtok, divtok, dividetok, timestok
+
+ cannot reachend
+*/
+
+static void MulOperator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_timestok)
+ {
+ Expect (mcReserved_timestok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_dividetok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_dividetok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_divtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_divtok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_modtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_modtok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_remtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_remtok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_andtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_andtok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_ambersandtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_ambersandtok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: & AND REM MOD DIV / *", 39);
+ }
+}
+
+
+/*
+ ConstFactor := Number | ConstString |
+ ConstSetOrQualidentOrFunction |
+ '(' ConstExpressionNop ')' |
+ 'NOT' ConstFactor |
+ ConstAttribute
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok
+
+ cannot reachend
+*/
+
+static void ConstFactor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok))))) != 0)))
+ {
+ Number (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_stringtok)
+ {
+ /* avoid dangling else. */
+ ConstString (stopset0, stopset1, stopset2);
+ }
+ else if ((mcLexBuf_currenttoken == mcReserved_lcbratok) || (mcLexBuf_currenttoken == mcReserved_identtok))
+ {
+ /* avoid dangling else. */
+ ConstSetOrQualidentOrFunction (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_nottok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ ConstFactor (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_attributetok)
+ {
+ /* avoid dangling else. */
+ ConstAttribute (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: __ATTRIBUTE__ NOT ( identifier { string integer number real number", 84);
+ }
+}
+
+
+/*
+ ConstString := string
+
+ first symbols:stringtok
+
+ cannot reachend
+*/
+
+static void ConstString (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ string (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ComponentElement := ConstExpressionNop [ '..' ConstExpressionNop ]
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ComponentElement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodperiodtok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_periodperiodtok)
+ {
+ 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))));
+ ConstExpressionNop (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ ComponentValue := ComponentElement [ 'BY' ConstExpressionNop ]
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void ComponentValue (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ ComponentElement (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_bytok-mcReserved_arraytok))), stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_bytok)
+ {
+ 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))));
+ ConstExpressionNop (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ ArraySetRecordValue := ComponentValue { ',' ComponentValue }
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ArraySetRecordValue (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ ComponentValue (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ 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))));
+ ComponentValue (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ Constructor := '{' [ ArraySetRecordValue ] '}'
+
+ first symbols:lcbratok
+
+ cannot reachend
+*/
+
+static void Constructor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ 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))))
+ {
+ ArraySetRecordValue (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rcbratok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ Expect (mcReserved_rcbratok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ConstSetOrQualidentOrFunction := Qualident [ Constructor |
+ ConstActualParameters ] |
+ Constructor
+
+ first symbols:lcbratok, identtok
+
+ cannot reachend
+*/
+
+static void ConstSetOrQualidentOrFunction (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ /* avoid dangling else. */
+ Qualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lcbratok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ if ((mcLexBuf_currenttoken < mcReserved_arraytok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_eoftok)) & ((mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_lcbratok-mcReserved_eoftok))))) != 0)))
+ {
+ /* avoid gcc warning by using compound statement even if not strictly necessary. */
+ /* seen optional [ | ] expression */
+ if (mcLexBuf_currenttoken == mcReserved_lcbratok)
+ {
+ Constructor (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ /* avoid dangling else. */
+ ConstActualParameters (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: ( {", 21);
+ }
+ }
+ /* end of optional [ | ] expression */
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lcbratok)
+ {
+ /* avoid dangling else. */
+ Constructor (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: { identifier", 30);
+ }
+}
+
+
+/*
+ ConstActualParameters := '(' [ ConstExpList ] ')'
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void ConstActualParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ 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))))
+ {
+ ConstExpList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ConstExpList := ConstExpressionNop { ',' ConstExpressionNop }
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ConstExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ 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))));
+ ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ ConstAttribute := '__ATTRIBUTE__' '__BUILTIN__'
+ '(' '(' ConstAttributeExpression
+ ')' ')'
+
+ first symbols:attributetok
+
+ cannot reachend
+*/
+
+static void ConstAttribute (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_attributetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_builtintok-mcReserved_recordtok))));
+ Expect (mcReserved_builtintok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lesstok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ ConstAttributeExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ConstAttributeExpression := Ident | '<' Qualident
+ ',' Ident '>'
+
+ first symbols:lesstok, identtok
+
+ cannot reachend
+*/
+
+static void ConstAttributeExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ Ident (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lesstok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_lesstok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Qualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_greatertok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_greatertok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: < identifier", 30);
+ }
+}
+
+
+/*
+ ByteAlignment := ''
+
+ first symbols:ldirectivetok
+
+ cannot reachend
+*/
+
+static void ByteAlignment (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ AttributeExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ OptAlignmentExpression := [ AlignmentExpression ]
+
+ first symbols:lparatok
+
+ reachend
+*/
+
+static void OptAlignmentExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ AlignmentExpression (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ AlignmentExpression := '(' ConstExpressionNop ')'
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void AlignmentExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Alignment := [ ByteAlignment ]
+
+ first symbols:ldirectivetok
+
+ reachend
+*/
+
+static void Alignment (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
+ {
+ ByteAlignment (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ IdentList := Ident { ',' Ident }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void IdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ PushIdentList :=
+ % VAR n: node ; %
+
+ % n := makeIdentList () %
+ Ident
+ % checkDuplicate (putIdent (n, curident)) %
+ { ',' Ident
+ % checkDuplicate (putIdent (n, curident)) %
+ }
+ % n := push (n) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void PushIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node n;
+
+ n = decl_makeIdentList ();
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ checkDuplicate (decl_putIdent (n, curident));
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ checkDuplicate (decl_putIdent (n, curident));
+ }
+ /* while */
+ n = push (n);
+}
+
+
+/*
+ SubrangeType :=
+ % VAR low, high: node ; d: CARDINAL ; %
+ '['
+ % d := depth () %
+ ConstExpression
+ % low := pop () %
+
+ % assert (d = depth ()) %
+ '..' ConstExpression
+ % high := pop () %
+
+ % assert (d = depth ()) %
+
+ % typeExp := push (makeSubrange (low, high)) %
+
+ % assert (d = depth () - 1) %
+ ']'
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void SubrangeType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node low;
+ decl_node high;
+ unsigned int d;
+
+ 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))));
+ d = depth ();
+ ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodperiodtok-mcReserved_eoftok))), stopset1, stopset2);
+ low = pop ();
+ mcDebug_assert (d == (depth ()));
+ 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))));
+ ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ high = pop ();
+ mcDebug_assert (d == (depth ()));
+ typeExp = push (decl_makeSubrange (low, high));
+ mcDebug_assert (d == ((depth ())-1));
+ Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ArrayType := 'ARRAY'
+ % VAR c: CARDINAL ; t, n: node ; %
+
+ % c := 0 %
+ SimpleType
+ % INC (c) %
+ { ',' SimpleType
+ % INC (c) %
+ } 'OF' Type
+ % n := push (makeIndexedArray (c, pop ())) %
+
+
+ first symbols:arraytok
+
+ cannot reachend
+*/
+
+static void ArrayType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ unsigned int c;
+ decl_node t;
+ decl_node n;
+
+ 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))));
+ c = 0;
+ SimpleType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
+ c += 1;
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ 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))));
+ SimpleType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
+ c += 1;
+ }
+ /* while */
+ 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))));
+ Type (stopset0, stopset1, stopset2);
+ n = push (makeIndexedArray (c, pop ()));
+}
+
+
+/*
+ RecordType := 'RECORD'
+ % VAR n: node ; %
+
+ % n := push (makeRecord ()) %
+
+ % n := push (NIL) no varient %
+ [ DefaultRecordAttributes ] FieldListSequence
+
+ % assert (pop ()=NIL) %
+ 'END'
+
+ first symbols:recordtok
+
+ cannot reachend
+*/
+
+static void RecordType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node n;
+
+ 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))));
+ n = push (decl_makeRecord ());
+ n = push (static_cast<decl_node> (NULL)); /* no varient */
+ if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
+ {
+ 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))));
+ }
+ FieldListSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ mcDebug_assert ((pop ()) == NULL);
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ DefaultRecordAttributes := ''
+
+ first symbols:ldirectivetok
+
+ cannot reachend
+*/
+
+static void DefaultRecordAttributes (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ AttributeExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ RecordFieldPragma := [ '' ]
+
+ first symbols:ldirectivetok
+
+ reachend
+*/
+
+static void RecordFieldPragma (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
+ {
+ Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ FieldPragmaExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok)) | (1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ FieldPragmaExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok)) | (1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+ Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ FieldPragmaExpression := Ident PragmaConstExpression
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void FieldPragmaExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ PragmaConstExpression (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ PragmaConstExpression := [ '(' ConstExpressionNop
+ ')' ]
+
+ first symbols:lparatok
+
+ reachend
+*/
+
+static void PragmaConstExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ 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))));
+ ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ AttributeExpression := Ident '(' ConstExpressionNop
+ ')'
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void AttributeExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ 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))));
+ ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ FieldListSequence := FieldListStatement { ';' FieldListStatement }
+
+ first symbols:casetok, identtok, semicolontok
+
+ reachend
+*/
+
+static void FieldListSequence (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ FieldListStatement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_semicolontok)
+ {
+ 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))));
+ FieldListStatement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ FieldListStatement := [ FieldList ]
+
+ first symbols:identtok, casetok
+
+ reachend
+*/
+
+static void FieldListStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if ((mcLexBuf_currenttoken == mcReserved_casetok) || (mcLexBuf_currenttoken == mcReserved_identtok))
+ {
+ FieldList (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ FieldList :=
+ % VAR r, i, f, t, n, v, w: node ; d: CARDINAL ; %
+
+ % d := depth () %
+
+ % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
+
+ % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
+
+ % v := push (v) %
+
+ % assert (d=depth ()) %
+
+ % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isVarientField (r))) %
+ PushIdentList ':'
+ % assert (d=depth () - 1) %
+
+ % i := pop () %
+ Type
+ % assert (d=depth () - 1) %
+
+ % t := pop () %
+ RecordFieldPragma
+ % assert (d=depth ()) %
+
+ % r := addFieldsToRecord (r, v, i, t) %
+
+ % assert (d=depth ()) %
+ |
+ 'CASE'
+ % addRecordToList %
+
+ % d := depth () %
+
+ % v := pop () ; assert ((v=NIL) OR isVarient (v)) %
+
+ % r := peep () ; assert (isRecord (r) OR isVarientField (r)) %
+
+ % v := push (v) %
+
+ % assert (((v=NIL) AND isRecord (r)) OR ((v#NIL) AND isRecordField (r))) %
+
+ % w := push (makeVarient (r)) %
+
+ % assert (d = depth () - 1) %
+
+ % addVarientToList %
+ CaseTag 'OF'
+ % assert (d = depth () - 1) %
+ Varient
+ % assert (d = depth () - 1) %
+ { '|' Varient
+ % assert (d = depth () - 1) %
+ }
+ % w := peep () ; assert (isVarient (w)) %
+
+ % assert (d = depth () - 1) %
+ [ 'ELSE' FieldListSequence ] 'END'
+
+ % w := pop () ; assert (isVarient (w)) %
+
+ % assert (d=depth ()) %
+
+
+ first symbols:casetok, identtok
+
+ cannot reachend
+*/
+
+static void FieldList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node r;
+ decl_node i;
+ decl_node f;
+ decl_node t;
+ decl_node n;
+ decl_node v;
+ decl_node w;
+ unsigned int d;
+
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ d = depth ();
+ v = pop ();
+ mcDebug_assert ((v == NULL) || (decl_isVarient (v)));
+ r = peep ();
+ mcDebug_assert ((decl_isRecord (r)) || (decl_isVarientField (r)));
+ v = push (v);
+ mcDebug_assert (d == (depth ()));
+ mcDebug_assert (((v == NULL) && (decl_isRecord (r))) || ((v != NULL) && (decl_isVarientField (r))));
+ PushIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ 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))));
+ mcDebug_assert (d == ((depth ())-1));
+ i = pop ();
+ Type (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ mcDebug_assert (d == ((depth ())-1));
+ t = pop ();
+ RecordFieldPragma (stopset0, stopset1, stopset2);
+ mcDebug_assert (d == (depth ()));
+ r = decl_addFieldsToRecord (r, v, i, t);
+ mcDebug_assert (d == (depth ()));
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_casetok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ /* addRecordToList */
+ d = depth ();
+ v = pop ();
+ mcDebug_assert ((v == NULL) || (decl_isVarient (v)));
+ r = peep ();
+ mcDebug_assert ((decl_isRecord (r)) || (decl_isVarientField (r)));
+ v = push (v);
+ mcDebug_assert (((v == NULL) && (decl_isRecord (r))) || ((v != NULL) && (decl_isRecordField (r))));
+ w = push (decl_makeVarient (r));
+ mcDebug_assert (d == ((depth ())-1));
+ /* addVarientToList */
+ CaseTag (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
+ 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))));
+ mcDebug_assert (d == ((depth ())-1));
+ Varient (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ mcDebug_assert (d == ((depth ())-1));
+ while (mcLexBuf_currenttoken == mcReserved_bartok)
+ {
+ 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))));
+ Varient (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok))), stopset2);
+ mcDebug_assert (d == ((depth ())-1));
+ }
+ /* while */
+ w = peep ();
+ mcDebug_assert (decl_isVarient (w));
+ mcDebug_assert (d == ((depth ())-1));
+ if (mcLexBuf_currenttoken == mcReserved_elsetok)
+ {
+ 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))));
+ FieldListSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ }
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+ w = pop ();
+ mcDebug_assert (decl_isVarient (w));
+ mcDebug_assert (d == (depth ()));
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: CASE identifier", 33);
+ }
+}
+
+
+/*
+ TagIdent := Ident |
+ % curident := NulName %
+
+
+ first symbols:identtok
+
+ reachend
+*/
+
+static void TagIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ Ident (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ curident = nameKey_NulName;
+ }
+}
+
+
+/*
+ CaseTag :=
+ % VAR tagident: Name ; q, v, w, r: node ; %
+
+ % w := pop () ; v := pop () ; r := peep () ; v := push (v) ; w := push (w) %
+
+ % assert (isVarient (w)) %
+
+ % assert ((v=NIL) OR isVarient (v)) %
+
+ % assert (isRecord (r) OR isVarientField (r)) %
+
+ % assert (isVarient (push (pop ()))) %
+ TagIdent
+ % tagident := curident %
+ ( ':' PushQualident
+ % q := pop () %
+
+ % assert (isVarient (push (pop ()))) %
+ |
+ % q := NIL %
+ )
+ % buildVarientSelector (r, w, tagident, q) %
+
+
+ first symbols:colontok, identtok
+
+ reachend
+*/
+
+static void CaseTag (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ nameKey_Name tagident;
+ decl_node q;
+ decl_node v;
+ decl_node w;
+ decl_node r;
+
+ w = pop ();
+ v = pop ();
+ r = peep ();
+ v = push (v);
+ w = push (w);
+ mcDebug_assert (decl_isVarient (w));
+ mcDebug_assert ((v == NULL) || (decl_isVarient (v)));
+ mcDebug_assert ((decl_isRecord (r)) || (decl_isVarientField (r)));
+ mcDebug_assert (decl_isVarient (push (pop ())));
+ TagIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ tagident = curident;
+ if (mcLexBuf_currenttoken == mcReserved_colontok)
+ {
+ Expect (mcReserved_colontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ PushQualident (stopset0, stopset1, stopset2);
+ q = pop ();
+ mcDebug_assert (decl_isVarient (push (pop ())));
+ }
+ else
+ {
+ q = static_cast<decl_node> (NULL);
+ }
+ decl_buildVarientSelector (r, w, tagident, q);
+}
+
+
+/*
+ Varient :=
+ % VAR p, r, v, f: node ; d: CARDINAL ; %
+
+ % d := depth () %
+
+ % assert (isVarient (peep ())) %
+ [
+ % v := pop () ; assert (isVarient (v)) %
+
+ % r := pop () %
+
+ % p := peep () %
+
+ % r := push (r) %
+
+ % f := push (buildVarientFieldRecord (v, p)) %
+
+ % v := push (v) %
+ VarientCaseLabelList ':' FieldListSequence
+
+ % v := pop () %
+
+ % f := pop () %
+
+ % assert (isVarientField (f)) %
+
+ % assert (isVarient (v)) %
+
+ % v := push (v) %
+ ]
+ % assert (isVarient (peep ())) %
+
+ % assert (d=depth ()) %
+
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ reachend
+*/
+
+static void Varient (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node p;
+ decl_node r;
+ decl_node v;
+ decl_node f;
+ unsigned int d;
+
+ d = depth ();
+ mcDebug_assert (decl_isVarient (peep ()));
+ 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))))
+ {
+ v = pop ();
+ mcDebug_assert (decl_isVarient (v));
+ r = pop ();
+ p = peep ();
+ r = push (r);
+ f = push (decl_buildVarientFieldRecord (v, p));
+ v = push (v);
+ VarientCaseLabelList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ 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))));
+ FieldListSequence (stopset0, stopset1, stopset2);
+ v = pop ();
+ f = pop ();
+ mcDebug_assert (decl_isVarientField (f));
+ mcDebug_assert (decl_isVarient (v));
+ v = push (v);
+ }
+ mcDebug_assert (decl_isVarient (peep ()));
+ mcDebug_assert (d == (depth ()));
+}
+
+
+/*
+ VarientCaseLabelList := VarientCaseLabels { ','
+ VarientCaseLabels }
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void VarientCaseLabelList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ VarientCaseLabels (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ 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))));
+ VarientCaseLabels (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ VarientCaseLabels :=
+ % VAR l, h: node ; %
+
+ % h := NIL %
+ ConstExpression
+ % l := pop () %
+ [ '..' ConstExpression
+ % h := pop () %
+ ]
+ % l, h could be saved if necessary. %
+
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void VarientCaseLabels (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node l;
+ decl_node h;
+
+ h = static_cast<decl_node> (NULL);
+ ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodperiodtok-mcReserved_eoftok))), stopset1, stopset2);
+ l = pop ();
+ if (mcLexBuf_currenttoken == mcReserved_periodperiodtok)
+ {
+ 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))));
+ ConstExpression (stopset0, stopset1, stopset2);
+ h = pop ();
+ }
+}
+
+
+/*
+ SetType := ( 'SET' | 'PACKEDSET' ) 'OF' SimpleType
+
+ % VAR n: node ; %
+
+ % n := push (makeSet (pop ())) %
+
+
+ first symbols:oftok, packedsettok, settok
+
+ cannot reachend
+*/
+
+static void SetType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node n;
+
+ if (mcLexBuf_currenttoken == mcReserved_settok)
+ {
+ Expect (mcReserved_settok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_packedsettok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_packedsettok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: PACKEDSET SET", 31);
+ }
+ 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))));
+ SimpleType (stopset0, stopset1, stopset2);
+ n = push (decl_makeSet (pop ()));
+}
+
+
+/*
+ PointerType := 'POINTER' 'TO' Type
+ % VAR n: node ; %
+
+ % n := push (makePointer (pop ())) %
+
+
+ first symbols:pointertok
+
+ cannot reachend
+*/
+
+static void PointerType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node n;
+
+ Expect (mcReserved_pointertok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_totok-mcReserved_recordtok))));
+ 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))));
+ Type (stopset0, stopset1, stopset2);
+ n = push (decl_makePointer (pop ()));
+}
+
+
+/*
+ ProcedureType := 'PROCEDURE'
+ % curproc := push (makeProcType ()) %
+ [ FormalTypeList ]
+
+ first symbols:proceduretok
+
+ cannot reachend
+*/
+
+static void ProcedureType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_proceduretok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ curproc = push (decl_makeProcType ());
+ if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ FormalTypeList (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ FormalTypeList := '(' ( ')' FormalReturn |
+ ProcedureParameters ')'
+ FormalReturn )
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void FormalTypeList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ if (mcLexBuf_currenttoken == mcReserved_rparatok)
+ {
+ Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ FormalReturn (stopset0, stopset1, stopset2);
+ }
+ 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))))
+ {
+ /* avoid dangling else. */
+ ProcedureParameters (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ FormalReturn (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: VAR ... ARRAY identifier )", 44);
+ }
+}
+
+
+/*
+ FormalReturn := [ ':' OptReturnType ]
+
+ first symbols:colontok
+
+ reachend
+*/
+
+static void FormalReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_colontok)
+ {
+ Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ OptReturnType (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ OptReturnType := '[' PushQualident
+ % putReturnType (curproc, pop ()) %
+
+ % putOptReturn (curproc) %
+ ']' | PushQualident
+ % putReturnType (curproc, pop ()) %
+
+
+ first symbols:identtok, lsbratok
+
+ cannot reachend
+*/
+
+static void OptReturnType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ Expect (mcReserved_lsbratok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ PushQualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ decl_putReturnType (curproc, pop ());
+ decl_putOptReturn (curproc);
+ Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ /* avoid dangling else. */
+ PushQualident (stopset0, stopset1, stopset2);
+ decl_putReturnType (curproc, pop ());
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: identifier [", 30);
+ }
+}
+
+
+/*
+ ProcedureParameters := ProcedureParameter
+ % addParameter (curproc, pop ()) %
+ { ',' ProcedureParameter
+
+ % addParameter (curproc, pop ()) %
+ }
+
+ first symbols:identtok, arraytok, periodperiodperiodtok, vartok
+
+ cannot reachend
+*/
+
+static void ProcedureParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ ProcedureParameter (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ decl_addParameter (curproc, pop ());
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ 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))));
+ ProcedureParameter (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ decl_addParameter (curproc, pop ());
+ }
+ /* while */
+}
+
+
+/*
+ ProcedureParameter := '...'
+ % VAR n: node ; %
+
+ % n := push (makeVarargs ()) %
+ | 'VAR' FormalType
+ % n := push (makeVarParameter (NIL, pop (), curproc, TRUE)) %
+ | FormalType
+ % n := push (makeNonVarParameter (NIL, pop (), curproc, TRUE)) %
+
+
+ first symbols:identtok, arraytok, vartok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void ProcedureParameter (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node n;
+
+ if (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok)
+ {
+ Expect (mcReserved_periodperiodperiodtok, stopset0, stopset1, stopset2);
+ n = push (decl_makeVarargs ());
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_vartok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_vartok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ FormalType (stopset0, stopset1, stopset2);
+ n = push (decl_makeVarParameter (static_cast<decl_node> (NULL), pop (), curproc, TRUE));
+ }
+ else if ((mcLexBuf_currenttoken == mcReserved_arraytok) || (mcLexBuf_currenttoken == mcReserved_identtok))
+ {
+ /* avoid dangling else. */
+ FormalType (stopset0, stopset1, stopset2);
+ n = push (decl_makeNonVarParameter (static_cast<decl_node> (NULL), pop (), curproc, TRUE));
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: ARRAY identifier VAR ...", 42);
+ }
+}
+
+
+/*
+ VarIdent :=
+ % VAR n, a: node ; %
+
+ % n := pop () %
+ Ident
+ % checkDuplicate (putIdent (n, curident)) %
+
+ % n := push (n) %
+ [ '[' ConstExpression
+ % a := pop () could store, a, into, n. %
+ ']' ]
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void VarIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node n;
+ decl_node a;
+
+ n = pop ();
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ checkDuplicate (decl_putIdent (n, curident));
+ n = push (n);
+ if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ 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))));
+ ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ a = pop (); /* could store, a, into, n. */
+ Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ VarIdentList :=
+ % VAR n: node ; %
+
+ % n := makeIdentList () %
+
+ % n := push (n) %
+ VarIdent { ',' VarIdent }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void VarIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node n;
+
+ n = decl_makeIdentList ();
+ n = push (n);
+ VarIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ VarIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ VariableDeclaration :=
+ % VAR v, d: node ; %
+ VarIdentList
+ % v := pop () %
+ ':' Type
+ % d := makeVarDecl (v, pop ()) %
+ Alignment
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void VariableDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node v;
+ decl_node d;
+
+ VarIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ v = pop ();
+ 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))));
+ Type (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ d = decl_makeVarDecl (v, pop ());
+ Alignment (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Designator := Qualident { SubDesignator }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void Designator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Qualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_uparrowtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
+ 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)))
+ {
+ SubDesignator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_uparrowtok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ SubDesignator := '.' Ident | '[' ArrayExpList ']' |
+ '^'
+
+ first symbols:uparrowtok, lsbratok, periodtok
+
+ cannot reachend
+*/
+
+static void SubDesignator (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_periodtok)
+ {
+ Expect (mcReserved_periodtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ ArrayExpList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_uparrowtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_uparrowtok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: ^ [ .", 23);
+ }
+}
+
+
+/*
+ ArrayExpList := Expression { ',' Expression }
+
+ first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ArrayExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ 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))));
+ Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ ExpList := Expression { ',' Expression }
+
+ first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void ExpList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ 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))));
+ Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ Expression := SimpleExpression [ Relation SimpleExpression ]
+
+ first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void Expression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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);
+ 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))
+ {
+ 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))));
+ SimpleExpression (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ SimpleExpression := UnaryOrTerm { AddOperator Term }
+
+ first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void SimpleExpression (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ UnaryOrTerm (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_minustok-mcReserved_eoftok)) | (1 << (mcReserved_plustok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_ortok-mcReserved_arraytok))), stopset2);
+ 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))
+ {
+ 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))));
+ Term (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_plustok-mcReserved_eoftok)) | (1 << (mcReserved_minustok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_ortok-mcReserved_arraytok))), stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ UnaryOrTerm := '+' Term | '-' Term |
+ Term
+
+ first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void UnaryOrTerm (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_plustok)
+ {
+ 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))));
+ Term (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_minustok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ Term (stopset0, stopset1, stopset2);
+ }
+ 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))))
+ {
+ /* avoid dangling else. */
+ Term (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: NOT ( string integer number real number identifier { - +", 74);
+ }
+}
+
+
+/*
+ Term := Factor { MulOperator Factor }
+
+ first symbols:lcbratok, identtok, realtok, integertok, stringtok, lparatok, nottok
+
+ cannot reachend
+*/
+
+static void Term (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ 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))
+ {
+ 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))));
+ 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))));
+ }
+ /* while */
+}
+
+
+/*
+ Factor := Number | string | SetOrDesignatorOrFunction |
+ '(' Expression ')' |
+ 'NOT' ( Factor | ConstAttribute )
+
+ first symbols:identtok, lcbratok, nottok, lparatok, stringtok, integertok, realtok
+
+ cannot reachend
+*/
+
+static void Factor (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_integertok-mcReserved_recordtok)) | (1 << (mcReserved_realtok-mcReserved_recordtok))))) != 0)))
+ {
+ Number (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_stringtok)
+ {
+ /* avoid dangling else. */
+ string (stopset0, stopset1, stopset2);
+ }
+ else if ((mcLexBuf_currenttoken == mcReserved_lcbratok) || (mcLexBuf_currenttoken == mcReserved_identtok))
+ {
+ /* avoid dangling else. */
+ SetOrDesignatorOrFunction (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_nottok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ 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))))
+ {
+ Factor (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_attributetok)
+ {
+ /* avoid dangling else. */
+ ConstAttribute (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: __ATTRIBUTE__ real number integer number string ( NOT { identifier", 84);
+ }
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: NOT ( identifier { string integer number real number", 70);
+ }
+}
+
+
+/*
+ SetOrDesignatorOrFunction := Qualident [ Constructor |
+ SimpleDes
+ [ ActualParameters ] ] |
+ Constructor
+
+ first symbols:lcbratok, identtok
+
+ cannot reachend
+*/
+
+static void SetOrDesignatorOrFunction (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ /* avoid dangling else. */
+ 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);
+ 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)))
+ {
+ /* avoid gcc warning by using compound statement even if not strictly necessary. */
+ /* seen optional [ | ] expression */
+ if (mcLexBuf_currenttoken == mcReserved_lcbratok)
+ {
+ Constructor (stopset0, stopset1, stopset2);
+ }
+ 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)))
+ {
+ /* avoid dangling else. */
+ SimpleDes (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ ActualParameters (stopset0, stopset1, stopset2);
+ }
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: ( ^ [ . {", 27);
+ }
+ }
+ /* end of optional [ | ] expression */
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lcbratok)
+ {
+ /* avoid dangling else. */
+ Constructor (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: { identifier", 30);
+ }
+}
+
+
+/*
+ SimpleDes := { SubDesignator }
+
+ first symbols:periodtok, lsbratok, uparrowtok
+
+ reachend
+*/
+
+static void SimpleDes (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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)))
+ {
+ SubDesignator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok)) | (1 << (mcReserved_uparrowtok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ ActualParameters := '(' [ ExpList ] ')'
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void ActualParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ 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))))
+ {
+ ExpList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ExitStatement := 'EXIT'
+
+ first symbols:exittok
+
+ cannot reachend
+*/
+
+static void ExitStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_exittok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ReturnStatement := 'RETURN' [ Expression ]
+
+ first symbols:returntok
+
+ cannot reachend
+*/
+
+static void ReturnStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ 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))))
+ {
+ Expression (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ Statement := [ AssignmentOrProcedureCall |
+ IfStatement | CaseStatement |
+ WhileStatement |
+ RepeatStatement |
+ LoopStatement | ForStatement |
+ WithStatement | AsmStatement |
+ ExitStatement | ReturnStatement |
+ RetryStatement ]
+
+ first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok
+
+ reachend
+*/
+
+static void Statement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))))
+ {
+ /* avoid gcc warning by using compound statement even if not strictly necessary. */
+ /* seen optional [ | ] expression */
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ AssignmentOrProcedureCall (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_iftok)
+ {
+ /* avoid dangling else. */
+ IfStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_casetok)
+ {
+ /* avoid dangling else. */
+ CaseStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_whiletok)
+ {
+ /* avoid dangling else. */
+ WhileStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_repeattok)
+ {
+ /* avoid dangling else. */
+ RepeatStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_looptok)
+ {
+ /* avoid dangling else. */
+ LoopStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_fortok)
+ {
+ /* avoid dangling else. */
+ ForStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_withtok)
+ {
+ /* avoid dangling else. */
+ WithStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_asmtok)
+ {
+ /* avoid dangling else. */
+ AsmStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_exittok)
+ {
+ /* avoid dangling else. */
+ ExitStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_returntok)
+ {
+ /* avoid dangling else. */
+ ReturnStatement (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_retrytok)
+ {
+ /* avoid dangling else. */
+ RetryStatement (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: RETRY RETURN EXIT ASM WITH FOR LOOP REPEAT WHILE CASE IF identifier", 85);
+ }
+ }
+ /* end of optional [ | ] expression */
+}
+
+
+/*
+ RetryStatement := 'RETRY'
+
+ first symbols:retrytok
+
+ cannot reachend
+*/
+
+static void RetryStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_retrytok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ AssignmentOrProcedureCall := Designator ( ':=' Expression |
+ ActualParameters |
+
+ % epsilon %
+ )
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void AssignmentOrProcedureCall (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Designator (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_becomestok-mcReserved_eoftok)) | (1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_becomestok)
+ {
+ 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))));
+ Expression (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ /* avoid dangling else. */
+ ActualParameters (stopset0, stopset1, stopset2);
+ }
+ /* epsilon */
+}
+
+
+/*
+ StatementSequence := Statement { ';' Statement }
+
+ first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok
+
+ reachend
+*/
+
+static void StatementSequence (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Statement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_semicolontok)
+ {
+ 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))));
+ Statement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ IfStatement := 'IF' Expression 'THEN' StatementSequence
+ { 'ELSIF' Expression 'THEN' StatementSequence }
+ [ 'ELSE' StatementSequence ] 'END'
+
+ first symbols:iftok
+
+ cannot reachend
+*/
+
+static void IfStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ Expression (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_thentok-mcReserved_recordtok))));
+ 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))));
+ StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_elsiftok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_elsiftok)
+ {
+ 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))));
+ Expression (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_thentok-mcReserved_recordtok))));
+ 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))));
+ StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_elsiftok-mcReserved_arraytok))), stopset2);
+ }
+ /* while */
+ if (mcLexBuf_currenttoken == mcReserved_elsetok)
+ {
+ 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))));
+ StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ }
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ CaseStatement := 'CASE' Expression 'OF' Case { '|'
+ Case }
+ CaseEndStatement
+
+ first symbols:casetok
+
+ cannot reachend
+*/
+
+static void CaseStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ Expression (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
+ 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))));
+ Case (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_elsetok-mcReserved_arraytok)) | (1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_bartok)
+ {
+ 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))));
+ Case (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_bartok-mcReserved_eoftok))), stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_elsetok-mcReserved_arraytok))), stopset2);
+ }
+ /* while */
+ CaseEndStatement (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ CaseEndStatement := 'END' | 'ELSE' StatementSequence
+ 'END'
+
+ first symbols:elsetok, endtok
+
+ cannot reachend
+*/
+
+static void CaseEndStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_endtok)
+ {
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_elsetok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: ELSE END", 26);
+ }
+}
+
+
+/*
+ Case := [ CaseLabelList ':' StatementSequence ]
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ reachend
+*/
+
+static void Case (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))))
+ {
+ CaseLabelList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ 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))));
+ StatementSequence (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ CaseLabelList := CaseLabels { ',' CaseLabels }
+
+ first symbols:attributetok, identtok, lcbratok, stringtok, nottok, lparatok, integertok, realtok, minustok, plustok
+
+ cannot reachend
+*/
+
+static void CaseLabelList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ CaseLabels (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ 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))));
+ CaseLabels (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ CaseLabels := ConstExpressionNop [ '..' ConstExpressionNop ]
+
+ first symbols:stringtok, lcbratok, identtok, attributetok, realtok, integertok, lparatok, nottok, plustok, minustok
+
+ cannot reachend
+*/
+
+static void CaseLabels (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodperiodtok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_periodperiodtok)
+ {
+ 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))));
+ ConstExpressionNop (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ WhileStatement := 'WHILE' Expression 'DO' StatementSequence
+ 'END'
+
+ first symbols:whiletok
+
+ cannot reachend
+*/
+
+static void WhileStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ Expression (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_dotok-mcReserved_arraytok))), stopset2);
+ 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))));
+ StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ RepeatStatement := 'REPEAT' StatementSequence 'UNTIL'
+ Expression
+
+ first symbols:repeattok
+
+ cannot reachend
+*/
+
+static void RepeatStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ StatementSequence (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_untiltok-mcReserved_recordtok))));
+ 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))));
+ Expression (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ForStatement := 'FOR' Ident ':=' Expression 'TO'
+ Expression [ 'BY' ConstExpressionNop ]
+ 'DO' StatementSequence 'END'
+
+ first symbols:fortok
+
+ cannot reachend
+*/
+
+static void ForStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_fortok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_becomestok-mcReserved_eoftok))), stopset1, stopset2);
+ 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))));
+ Expression (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_totok-mcReserved_recordtok))));
+ 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))));
+ Expression (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_bytok-mcReserved_arraytok)) | (1 << (mcReserved_dotok-mcReserved_arraytok))), stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_bytok)
+ {
+ 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))));
+ ConstExpressionNop (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_dotok-mcReserved_arraytok))), stopset2);
+ }
+ 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))));
+ StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ LoopStatement := 'LOOP' StatementSequence 'END'
+
+ first symbols:looptok
+
+ cannot reachend
+*/
+
+static void LoopStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ WithStatement := 'WITH' Designator 'DO' StatementSequence
+ 'END'
+
+ first symbols:withtok
+
+ cannot reachend
+*/
+
+static void WithStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_withtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Designator (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_dotok-mcReserved_arraytok))), stopset2);
+ 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))));
+ StatementSequence (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ProcedureDeclaration := ProcedureHeading ';' ProcedureBlock
+ Ident
+ % leaveScope %
+
+
+ first symbols:proceduretok
+
+ cannot reachend
+*/
+
+static void ProcedureDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ ProcedureHeading (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ 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))));
+ ProcedureBlock (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0, stopset1, stopset2);
+ decl_leaveScope ();
+}
+
+
+/*
+ ProcedureIdent := Ident
+ % curproc := lookupSym (curident) %
+
+ % enterScope (curproc) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void ProcedureIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Ident (stopset0, stopset1, stopset2);
+ curproc = decl_lookupSym (curident);
+ decl_enterScope (curproc);
+}
+
+
+/*
+ DefProcedureIdent := Ident
+ % curproc := lookupSym (curident) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void DefProcedureIdent (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Ident (stopset0, stopset1, stopset2);
+ curproc = decl_lookupSym (curident);
+}
+
+
+/*
+ DefineBuiltinProcedure := [ '__ATTRIBUTE__' '__BUILTIN__'
+ '(' '(' Ident ')' ')' |
+ '__INLINE__' ]
+
+ first symbols:inlinetok, attributetok
+
+ reachend
+*/
+
+static void DefineBuiltinProcedure (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_inlinetok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok))))) != 0)))
+ {
+ /* avoid gcc warning by using compound statement even if not strictly necessary. */
+ /* seen optional [ | ] expression */
+ if (mcLexBuf_currenttoken == mcReserved_attributetok)
+ {
+ Expect (mcReserved_attributetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_builtintok-mcReserved_recordtok))));
+ Expect (mcReserved_builtintok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_lparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_lparatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_inlinetok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_inlinetok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: __INLINE__ __ATTRIBUTE__", 42);
+ }
+ }
+ /* end of optional [ | ] expression */
+}
+
+
+/*
+ ProcedureHeading := 'PROCEDURE' DefineBuiltinProcedure
+ ( ProcedureIdent [ FormalParameters ]
+ AttributeNoReturn )
+
+ first symbols:proceduretok
+
+ cannot reachend
+*/
+
+static void ProcedureHeading (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_proceduretok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_inlinetok-mcReserved_recordtok)) | (1 << (mcReserved_attributetok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
+ DefineBuiltinProcedure (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ ProcedureIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ FormalParameters (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ AttributeNoReturn (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Builtin := [ '__BUILTIN__' | '__INLINE__' ]
+
+ first symbols:inlinetok, builtintok
+
+ reachend
+*/
+
+static void Builtin (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_inlinetok-mcReserved_recordtok)) | (1 << (mcReserved_builtintok-mcReserved_recordtok))))) != 0)))
+ {
+ /* avoid gcc warning by using compound statement even if not strictly necessary. */
+ /* seen optional [ | ] expression */
+ if (mcLexBuf_currenttoken == mcReserved_builtintok)
+ {
+ Expect (mcReserved_builtintok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_inlinetok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_inlinetok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: __INLINE__ __BUILTIN__", 40);
+ }
+ }
+ /* end of optional [ | ] expression */
+}
+
+
+/*
+ DefProcedureHeading := 'PROCEDURE' Builtin ( DefProcedureIdent
+ [ DefFormalParameters ]
+ AttributeNoReturn )
+
+ first symbols:proceduretok
+
+ cannot reachend
+*/
+
+static void DefProcedureHeading (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_proceduretok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_inlinetok-mcReserved_recordtok)) | (1 << (mcReserved_builtintok-mcReserved_recordtok)) | (1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Builtin (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ DefProcedureIdent (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok)) | (1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ DefFormalParameters (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ AttributeNoReturn (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ProcedureBlock := { Declaration } [ 'BEGIN' ProcedureBlockBody ]
+ 'END'
+
+ first symbols:proceduretok, moduletok, consttok, typetok, vartok, endtok, begintok
+
+ cannot reachend
+*/
+
+static void ProcedureBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))))
+ {
+ 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))));
+ }
+ /* while */
+ if (mcLexBuf_currenttoken == mcReserved_begintok)
+ {
+ 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))));
+ ProcedureBlockBody (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ }
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Block := { Declaration } InitialBlock FinalBlock
+ 'END'
+
+ first symbols:proceduretok, moduletok, finallytok, begintok, consttok, typetok, vartok, endtok
+
+ cannot reachend
+*/
+
+static void Block (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))))
+ {
+ 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))));
+ }
+ /* while */
+ InitialBlock (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok)) | (1 << (mcReserved_finallytok-mcReserved_arraytok))), stopset2);
+ FinalBlock (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_endtok-mcReserved_arraytok))), stopset2);
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ InitialBlock := [ 'BEGIN' InitialBlockBody ]
+
+ first symbols:begintok
+
+ reachend
+*/
+
+static void InitialBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_begintok)
+ {
+ 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))));
+ InitialBlockBody (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ FinalBlock := [ 'FINALLY' FinalBlockBody ]
+
+ first symbols:finallytok
+
+ reachend
+*/
+
+static void FinalBlock (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_finallytok)
+ {
+ 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))));
+ FinalBlockBody (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ InitialBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
+
+ first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
+
+ reachend
+*/
+
+static void InitialBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ NormalPart (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_excepttok-mcReserved_arraytok))), stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_excepttok)
+ {
+ 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))));
+ ExceptionalPart (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ FinalBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
+
+ first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
+
+ reachend
+*/
+
+static void FinalBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ NormalPart (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_excepttok-mcReserved_arraytok))), stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_excepttok)
+ {
+ 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))));
+ ExceptionalPart (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ ProcedureBlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ]
+
+ first symbols:identtok, iftok, casetok, whiletok, repeattok, looptok, fortok, withtok, asmtok, retrytok, semicolontok, exittok, returntok, excepttok
+
+ reachend
+*/
+
+static void ProcedureBlockBody (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ NormalPart (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_excepttok-mcReserved_arraytok))), stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_excepttok)
+ {
+ 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))));
+ ExceptionalPart (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ NormalPart := StatementSequence
+
+ first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
+
+ reachend
+*/
+
+static void NormalPart (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ StatementSequence (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ExceptionalPart := StatementSequence
+
+ first symbols:retrytok, asmtok, withtok, fortok, looptok, repeattok, whiletok, casetok, iftok, identtok, returntok, exittok, semicolontok
+
+ reachend
+*/
+
+static void ExceptionalPart (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ StatementSequence (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Declaration := 'CONST' { ConstantDeclaration ';' } |
+ 'TYPE' { TypeDeclaration } |
+ 'VAR' { VariableDeclaration ';' } |
+ ProcedureDeclaration ';' |
+ ModuleDeclaration ';'
+
+ first symbols:moduletok, proceduretok, vartok, typetok, consttok
+
+ cannot reachend
+*/
+
+static void Declaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_consttok)
+ {
+ Expect (mcReserved_consttok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ while (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ ConstantDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ }
+ /* while */
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_typetok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_typetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ while (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ TypeDeclaration (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ }
+ /* while */
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_vartok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_vartok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ while (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ VariableDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ }
+ /* while */
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_proceduretok)
+ {
+ /* avoid dangling else. */
+ ProcedureDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_moduletok)
+ {
+ /* avoid dangling else. */
+ ModuleDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: MODULE PROCEDURE VAR TYPE CONST", 49);
+ }
+}
+
+
+/*
+ DefFormalParameters := '('
+ % paramEnter (curproc) %
+ [ DefMultiFPSection ] ')'
+
+ % paramLeave (curproc) %
+ FormalReturn
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void DefFormalParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ decl_paramEnter (curproc);
+ 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))))
+ {
+ DefMultiFPSection (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ decl_paramLeave (curproc);
+ FormalReturn (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ DefMultiFPSection := DefExtendedFP |
+ FPSection [ ';' DefMultiFPSection ]
+
+ first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void DefMultiFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if ((mcLexBuf_currenttoken == mcReserved_lsbratok) || (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok))
+ {
+ DefExtendedFP (stopset0, stopset1, stopset2);
+ }
+ else if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))))) != 0)))
+ {
+ /* avoid dangling else. */
+ FPSection (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_semicolontok)
+ {
+ 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))));
+ DefMultiFPSection (stopset0, stopset1, stopset2);
+ }
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: identifier VAR ... [", 38);
+ }
+}
+
+
+/*
+ FormalParameters := '('
+ % paramEnter (curproc) %
+ [ MultiFPSection ] ')'
+ % paramLeave (curproc) %
+ FormalReturn
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void FormalParameters (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ decl_paramEnter (curproc);
+ 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))))
+ {
+ MultiFPSection (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ Expect (mcReserved_rparatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ decl_paramLeave (curproc);
+ FormalReturn (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ AttributeNoReturn := [ NoReturn |
+ % setNoReturn (curproc, FALSE) %
+ ]
+
+ first symbols:ldirectivetok
+
+ reachend
+*/
+
+static void AttributeNoReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
+ {
+ /* avoid gcc warning by using compound statement even if not strictly necessary. */
+ /* seen optional [ | ] expression */
+ if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
+ {
+ NoReturn (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ decl_setNoReturn (curproc, FALSE);
+ }
+ }
+ /* end of optional [ | ] expression */
+}
+
+
+/*
+ NoReturn := ''
+
+ first symbols:ldirectivetok
+
+ cannot reachend
+*/
+
+static void NoReturn (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ decl_setNoReturn (curproc, TRUE);
+ checkReturnAttribute ();
+ Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ AttributeUnused := [ Unused ]
+
+ first symbols:ldirectivetok
+
+ reachend
+*/
+
+static void AttributeUnused (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
+ {
+ Unused (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ Unused := ''
+
+ first symbols:ldirectivetok
+
+ cannot reachend
+*/
+
+static void Unused (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_ldirectivetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rdirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ curisused = FALSE;
+ checkParameterAttribute ();
+ Expect (mcReserved_rdirectivetok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ MultiFPSection := ExtendedFP | FPSection [ ';'
+ MultiFPSection ]
+
+ first symbols:identtok, vartok, lsbratok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void MultiFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if ((mcLexBuf_currenttoken == mcReserved_lsbratok) || (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok))
+ {
+ ExtendedFP (stopset0, stopset1, stopset2);
+ }
+ else if ((mcLexBuf_currenttoken >= mcReserved_recordtok) && ((((1 << (mcLexBuf_currenttoken-mcReserved_recordtok)) & ((mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok)) | (1 << (mcReserved_vartok-mcReserved_recordtok))))) != 0)))
+ {
+ /* avoid dangling else. */
+ FPSection (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_semicolontok)
+ {
+ 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))));
+ MultiFPSection (stopset0, stopset1, stopset2);
+ }
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: identifier VAR ... [", 38);
+ }
+}
+
+
+/*
+ FPSection := NonVarFPSection |
+ VarFPSection
+
+ first symbols:vartok, identtok
+
+ cannot reachend
+*/
+
+static void FPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ NonVarFPSection (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_vartok)
+ {
+ /* avoid dangling else. */
+ VarFPSection (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: VAR identifier", 32);
+ }
+}
+
+
+/*
+ DefExtendedFP := DefOptArg | '...'
+ % addParameter (curproc, makeVarargs ()) %
+
+
+ first symbols:lsbratok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void DefExtendedFP (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ DefOptArg (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_periodperiodperiodtok, stopset0, stopset1, stopset2);
+ decl_addParameter (curproc, decl_makeVarargs ());
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: ... [", 23);
+ }
+}
+
+
+/*
+ ExtendedFP := OptArg | '...'
+
+ first symbols:lsbratok, periodperiodperiodtok
+
+ cannot reachend
+*/
+
+static void ExtendedFP (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ OptArg (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_periodperiodperiodtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_periodperiodperiodtok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: ... [", 23);
+ }
+}
+
+
+/*
+ VarFPSection := 'VAR' PushIdentList
+ % VAR l, t: node ; %
+ ':' FormalType
+ % t := pop () %
+
+ % l := pop () %
+
+ % curisused := TRUE %
+ [ AttributeUnused ]
+ % addVarParameters (curproc, l, t, curisused) %
+
+
+ first symbols:vartok
+
+ cannot reachend
+*/
+
+static void VarFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node l;
+ decl_node t;
+
+ Expect (mcReserved_vartok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ PushIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_colontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ FormalType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ t = pop ();
+ l = pop ();
+ curisused = TRUE;
+ if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
+ {
+ AttributeUnused (stopset0, stopset1, stopset2);
+ }
+ decl_addVarParameters (curproc, l, t, curisused);
+}
+
+
+/*
+ NonVarFPSection := PushIdentList
+ % VAR l, t: node ; %
+ ':' FormalType
+ % t := pop () %
+
+ % l := pop () %
+
+ % curisused := TRUE %
+ [ AttributeUnused ]
+ % addNonVarParameters (curproc, l, t, curisused) %
+
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void NonVarFPSection (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node l;
+ decl_node t;
+
+ PushIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_colontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ FormalType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok))), stopset1, stopset2);
+ t = pop ();
+ l = pop ();
+ curisused = TRUE;
+ if (mcLexBuf_currenttoken == mcReserved_ldirectivetok)
+ {
+ AttributeUnused (stopset0, stopset1, stopset2);
+ }
+ decl_addNonVarParameters (curproc, l, t, curisused);
+}
+
+
+/*
+ OptArg :=
+ % VAR p, init, type: node ; id: Name ; %
+ '[' Ident
+ % id := curident %
+ ':' FormalType
+ % type := pop () %
+
+ % init := NIL %
+ [ '=' ConstExpression
+ % init := pop () %
+ ] ']'
+ % p := addOptParameter (curproc, id, type, init) %
+
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void OptArg (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node p;
+ decl_node init;
+ decl_node type;
+ nameKey_Name id;
+
+ Expect (mcReserved_lsbratok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ id = curident;
+ Expect (mcReserved_colontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ FormalType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_equaltok-mcReserved_eoftok)) | (1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ type = pop ();
+ init = static_cast<decl_node> (NULL);
+ if (mcLexBuf_currenttoken == mcReserved_equaltok)
+ {
+ 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))));
+ ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ init = pop ();
+ }
+ Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
+ p = decl_addOptParameter (curproc, id, type, init);
+}
+
+
+/*
+ DefOptArg :=
+ % VAR p, init, type: node ; id: Name ; %
+ '[' Ident
+ % id := curident %
+ ':' FormalType
+ % type := pop () %
+ '=' ConstExpression
+ % init := pop () %
+ ']'
+ % p := addOptParameter (curproc, id, type, init) %
+
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void DefOptArg (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node p;
+ decl_node init;
+ decl_node type;
+ nameKey_Name id;
+
+ Expect (mcReserved_lsbratok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ id = curident;
+ Expect (mcReserved_colontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ FormalType (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_equaltok-mcReserved_eoftok))), stopset1, stopset2);
+ type = pop ();
+ 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))));
+ ConstExpression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ init = pop ();
+ Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
+ p = decl_addOptParameter (curproc, id, type, init);
+}
+
+
+/*
+ FormalType :=
+ % VAR c: CARDINAL ; %
+
+ % VAR n, a, s: node ; %
+
+ % c := 0 %
+ { 'ARRAY' 'OF'
+ % INC (c) %
+ } PushQualident
+ % pushNunbounded (c) %
+
+
+ first symbols:identtok, arraytok
+
+ cannot reachend
+*/
+
+static void FormalType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ unsigned int c;
+ decl_node n;
+ decl_node a;
+ decl_node s;
+
+ c = 0;
+ while (mcLexBuf_currenttoken == mcReserved_arraytok)
+ {
+ Expect (mcReserved_arraytok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_oftok-mcReserved_arraytok))), stopset2);
+ Expect (mcReserved_oftok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_arraytok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ c += 1;
+ }
+ /* while */
+ PushQualident (stopset0, stopset1, stopset2);
+ pushNunbounded (c);
+}
+
+
+/*
+ ModuleDeclaration := 'MODULE' Ident [ Priority ]
+ ';' { Import } [ Export ]
+ Block Ident
+
+ first symbols:moduletok
+
+ cannot reachend
+*/
+
+static void ModuleDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_moduletok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok)) | (1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ Priority (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ 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))));
+ 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)))
+ {
+ 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))));
+ }
+ /* while */
+ if (mcLexBuf_currenttoken == mcReserved_exporttok)
+ {
+ 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))));
+ }
+ Block (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Priority := '[' ConstExpressionNop ']'
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void Priority (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ ConstExpressionNop (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Export := 'EXPORT' ( 'QUALIFIED' IdentList |
+ 'UNQUALIFIED' IdentList |
+ IdentList ) ';'
+
+ first symbols:exporttok
+
+ cannot reachend
+*/
+
+static void Export (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))));
+ if (mcLexBuf_currenttoken == mcReserved_qualifiedtok)
+ {
+ Expect (mcReserved_qualifiedtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ IdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_unqualifiedtok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_unqualifiedtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ IdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ /* avoid dangling else. */
+ IdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: identifier UNQUALIFIED QUALIFIED", 50);
+ }
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ FromIdentList := Ident
+ % importInto (frommodule, curident, curmodule) %
+ { ',' Ident
+ % importInto (frommodule, curident, curmodule) %
+ }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void FromIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ importInto (frommodule, curident, curmodule);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ importInto (frommodule, curident, curmodule);
+ }
+ /* while */
+}
+
+
+/*
+ FromImport := 'FROM' Ident
+ % frommodule := lookupDef (curident) %
+ 'IMPORT' FromIdentList ';'
+
+ first symbols:fromtok
+
+ cannot reachend
+*/
+
+static void FromImport (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_fromtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_importtok-mcReserved_arraytok))), stopset2);
+ frommodule = decl_lookupDef (curident);
+ Expect (mcReserved_importtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ FromIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ ImportModuleList := Ident { ',' Ident }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void ImportModuleList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ WithoutFromImport := 'IMPORT' ImportModuleList ';'
+
+ first symbols:importtok
+
+ cannot reachend
+*/
+
+static void WithoutFromImport (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_importtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ ImportModuleList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ Import := FromImport | WithoutFromImport
+
+ first symbols:importtok, fromtok
+
+ cannot reachend
+*/
+
+static void Import (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_fromtok)
+ {
+ FromImport (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_importtok)
+ {
+ /* avoid dangling else. */
+ WithoutFromImport (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: IMPORT FROM", 29);
+ }
+}
+
+
+/*
+ DefinitionModule := 'DEFINITION' 'MODULE' [ 'FOR'
+ string ]
+ Ident ';'
+ % curmodule := lookupDef (curident) %
+
+ % enterScope (curmodule) %
+
+ % resetEnumPos (curmodule) %
+ { Import } [ Export ] { Definition }
+ 'END' Ident '.'
+ % checkEndName (curmodule, curident, 'definition module') %
+
+ % setConstExpComplete (curmodule) %
+
+ % leaveScope %
+
+
+ first symbols:definitiontok
+
+ cannot reachend
+*/
+
+static void DefinitionModule (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_definitiontok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_moduletok-mcReserved_arraytok))), stopset2);
+ Expect (mcReserved_moduletok, stopset0, stopset1|(mcp3_SetOfStop1) ((1 << (mcReserved_fortok-mcReserved_arraytok))), stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ if (mcLexBuf_currenttoken == mcReserved_fortok)
+ {
+ Expect (mcReserved_fortok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
+ string (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ }
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ 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))));
+ curmodule = decl_lookupDef (curident);
+ decl_enterScope (curmodule);
+ decl_resetEnumPos (curmodule);
+ 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)))
+ {
+ 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))));
+ }
+ /* while */
+ if (mcLexBuf_currenttoken == mcReserved_exporttok)
+ {
+ 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))));
+ }
+ 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))))
+ {
+ 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))));
+ }
+ /* while */
+ Expect (mcReserved_endtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_periodtok, stopset0, stopset1, stopset2);
+ checkEndName (curmodule, curident, (const char *) "definition module", 17);
+ decl_setConstExpComplete (curmodule);
+ decl_leaveScope ();
+}
+
+
+/*
+ PushQualident := Ident
+ % typeExp := push (lookupSym (curident)) %
+
+ % IF typeExp = NIL
+ THEN
+ metaError1 ('the symbol {%1k} is not visible in this scope (or any other nested scope)', curident)
+ END %
+ [ '.'
+ % IF NOT isDef (typeExp)
+ THEN
+ ErrorArray ('the first component of this qualident must be a definition module')
+ END %
+ Ident
+ % typeExp := replace (lookupInScope (typeExp, curident)) ;
+ IF typeExp=NIL
+ THEN
+ ErrorArray ('identifier not found in definition module')
+ END %
+ ]
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void PushQualident (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_periodtok-mcReserved_eoftok))), stopset1, stopset2);
+ typeExp = push (decl_lookupSym (curident));
+ if (typeExp == NULL)
+ {
+ 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));
+ }
+ if (mcLexBuf_currenttoken == mcReserved_periodtok)
+ {
+ Expect (mcReserved_periodtok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ if (! (decl_isDef (typeExp)))
+ {
+ ErrorArray ((const char *) "the first component of this qualident must be a definition module", 65);
+ }
+ Ident (stopset0, stopset1, stopset2);
+ typeExp = replace (decl_lookupInScope (typeExp, curident));
+ if (typeExp == NULL)
+ {
+ ErrorArray ((const char *) "identifier not found in definition module", 41);
+ }
+ }
+}
+
+
+/*
+ OptSubrange := [ SubrangeType
+ % VAR q, s: node ; %
+
+ % s := pop () %
+
+ % q := pop () %
+
+ % putSubrangeType (s, q) %
+
+ % typeExp := push (s) %
+ ]
+
+ first symbols:lsbratok
+
+ reachend
+*/
+
+static void OptSubrange (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node q;
+ decl_node s;
+
+ if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ SubrangeType (stopset0, stopset1, stopset2);
+ s = pop ();
+ q = pop ();
+ decl_putSubrangeType (s, q);
+ typeExp = push (s);
+ }
+}
+
+
+/*
+ TypeEquiv := PushQualident OptSubrange
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void TypeEquiv (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ PushQualident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ OptSubrange (stopset0, stopset1, stopset2);
+}
+
+
+/*
+ EnumIdentList :=
+ % VAR f: node ; %
+
+ % typeExp := push (makeEnum ()) %
+ Ident
+ % f := makeEnumField (typeExp, curident) %
+ { ',' Ident
+ % f := makeEnumField (typeExp, curident) %
+ }
+
+ first symbols:identtok
+
+ cannot reachend
+*/
+
+static void EnumIdentList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ decl_node f;
+
+ typeExp = push (decl_makeEnum ());
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ f = decl_makeEnumField (typeExp, curident);
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ f = decl_makeEnumField (typeExp, curident);
+ }
+ /* while */
+}
+
+
+/*
+ Enumeration := '(' EnumIdentList ')'
+
+ first symbols:lparatok
+
+ cannot reachend
+*/
+
+static void Enumeration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_lparatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ EnumIdentList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ SimpleType :=
+ % VAR d: CARDINAL ; %
+
+ % d := depth () %
+ ( TypeEquiv | Enumeration |
+ SubrangeType )
+ % assert (d = depth () - 1) %
+
+
+ first symbols:lsbratok, lparatok, identtok
+
+ cannot reachend
+*/
+
+static void SimpleType (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ unsigned int d;
+
+ d = depth ();
+ if (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ TypeEquiv (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lparatok)
+ {
+ /* avoid dangling else. */
+ Enumeration (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ /* avoid dangling else. */
+ SubrangeType (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: [ ( identifier", 32);
+ }
+ mcDebug_assert (d == ((depth ())-1));
+}
+
+
+/*
+ Type := SimpleType | ArrayType | RecordType |
+ SetType | PointerType | ProcedureType
+
+ first symbols:proceduretok, pointertok, settok, packedsettok, oftok, recordtok, arraytok, identtok, lparatok, lsbratok
+
+ cannot reachend
+*/
+
+static void Type (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ 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))
+ {
+ SimpleType (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_arraytok)
+ {
+ /* avoid dangling else. */
+ ArrayType (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_recordtok)
+ {
+ /* avoid dangling else. */
+ RecordType (stopset0, stopset1, stopset2);
+ }
+ 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))
+ {
+ /* avoid dangling else. */
+ SetType (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_pointertok)
+ {
+ /* avoid dangling else. */
+ PointerType (stopset0, stopset1, stopset2);
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_proceduretok)
+ {
+ /* avoid dangling else. */
+ ProcedureType (stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: PROCEDURE POINTER SET PACKEDSET OF RECORD ARRAY identifier ( [", 80);
+ }
+}
+
+
+/*
+ TypeDeclaration := { Ident
+ % typeDes := lookupSym (curident) %
+ ( ';' | '=' Type
+ % putType (typeDes, pop ()) %
+ Alignment ';' ) }
+
+ first symbols:identtok
+
+ reachend
+*/
+
+static void TypeDeclaration (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ while (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok)) | (1 << (mcReserved_equaltok-mcReserved_eoftok))), stopset1, stopset2);
+ typeDes = decl_lookupSym (curident);
+ if (mcLexBuf_currenttoken == mcReserved_semicolontok)
+ {
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_equaltok)
+ {
+ /* avoid dangling else. */
+ 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))));
+ Type (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_ldirectivetok-mcReserved_eoftok)) | (1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ decl_putType (typeDes, pop ());
+ Alignment (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: = ;", 21);
+ }
+ }
+ /* while */
+}
+
+
+/*
+ Definition := 'CONST' { ConstantDeclaration ';' } |
+ 'TYPE' { TypeDeclaration } |
+ 'VAR' { VariableDeclaration ';' } |
+ DefProcedureHeading ';'
+
+ first symbols:proceduretok, vartok, typetok, consttok
+
+ cannot reachend
+*/
+
+static void Definition (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_consttok)
+ {
+ Expect (mcReserved_consttok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ while (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ ConstantDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ }
+ /* while */
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_typetok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_typetok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ while (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ TypeDeclaration (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ }
+ /* while */
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_vartok)
+ {
+ /* avoid dangling else. */
+ Expect (mcReserved_vartok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ while (mcLexBuf_currenttoken == mcReserved_identtok)
+ {
+ VariableDeclaration (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ }
+ /* while */
+ }
+ else if (mcLexBuf_currenttoken == mcReserved_proceduretok)
+ {
+ /* avoid dangling else. */
+ DefProcedureHeading (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_semicolontok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_semicolontok, stopset0, stopset1, stopset2);
+ }
+ else
+ {
+ /* avoid dangling else. */
+ ErrorArray ((const char *) "expecting one of: PROCEDURE VAR TYPE CONST", 42);
+ }
+}
+
+
+/*
+ AsmStatement := 'ASM' [ 'VOLATILE' ] '(' AsmOperands
+ ')'
+
+ first symbols:asmtok
+
+ cannot reachend
+*/
+
+static void AsmStatement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_asmtok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_volatiletok-mcReserved_recordtok))));
+ if (mcLexBuf_currenttoken == mcReserved_volatiletok)
+ {
+ Expect (mcReserved_volatiletok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ Expect (mcReserved_lparatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
+ AsmOperands (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ AsmOperands := string [ AsmOperandSpec ]
+
+ first symbols:stringtok
+
+ cannot reachend
+*/
+
+static void AsmOperands (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ string (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_colontok)
+ {
+ AsmOperandSpec (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ AsmOperandSpec := [ ':' AsmList [ ':' AsmList [
+ ':' TrashList ] ] ]
+
+ first symbols:colontok
+
+ reachend
+*/
+
+static void AsmOperandSpec (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_colontok)
+ {
+ 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))));
+ AsmList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_colontok)
+ {
+ 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))));
+ AsmList (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_colontok-mcReserved_eoftok))), stopset1, stopset2);
+ if (mcLexBuf_currenttoken == mcReserved_colontok)
+ {
+ Expect (mcReserved_colontok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
+ TrashList (stopset0, stopset1, stopset2);
+ }
+ }
+ }
+}
+
+
+/*
+ AsmList := [ AsmElement ] { ',' AsmElement }
+
+ first symbols:lsbratok, stringtok, commatok
+
+ reachend
+*/
+
+static void AsmList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if ((mcLexBuf_currenttoken == mcReserved_lsbratok) || (mcLexBuf_currenttoken == mcReserved_stringtok))
+ {
+ AsmElement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ Expect (mcReserved_commatok, stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lsbratok-mcReserved_eoftok))), stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
+ AsmElement (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ NamedOperand := '[' Ident ']'
+
+ first symbols:lsbratok
+
+ cannot reachend
+*/
+
+static void NamedOperand (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ Expect (mcReserved_lsbratok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_identtok-mcReserved_recordtok))));
+ Ident (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rsbratok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rsbratok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ AsmOperandName := [ NamedOperand ]
+
+ first symbols:lsbratok
+
+ reachend
+*/
+
+static void AsmOperandName (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_lsbratok)
+ {
+ NamedOperand (stopset0, stopset1, stopset2);
+ }
+}
+
+
+/*
+ AsmElement := AsmOperandName string '(' Expression
+ ')'
+
+ first symbols:stringtok, lsbratok
+
+ cannot reachend
+*/
+
+static void AsmElement (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ AsmOperandName (stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
+ string (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_lparatok-mcReserved_eoftok))), stopset1, stopset2);
+ 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))));
+ Expression (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_rparatok-mcReserved_eoftok))), stopset1, stopset2);
+ Expect (mcReserved_rparatok, stopset0, stopset1, stopset2);
+}
+
+
+/*
+ TrashList := [ string ] { ',' string }
+
+ first symbols:commatok, stringtok
+
+ reachend
+*/
+
+static void TrashList (mcp3_SetOfStop0 stopset0, mcp3_SetOfStop1 stopset1, mcp3_SetOfStop2 stopset2)
+{
+ if (mcLexBuf_currenttoken == mcReserved_stringtok)
+ {
+ string (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ while (mcLexBuf_currenttoken == mcReserved_commatok)
+ {
+ Expect (mcReserved_commatok, stopset0, stopset1, stopset2|(mcp3_SetOfStop2) ((1 << (mcReserved_stringtok-mcReserved_recordtok))));
+ string (stopset0|(mcp3_SetOfStop0) ((1 << (mcReserved_commatok-mcReserved_eoftok))), stopset1, stopset2);
+ }
+ /* while */
+}
+
+
+/*
+ CompilationUnit - returns TRUE if the input was correct enough to parse
+ in future passes.
+*/
+
+extern "C" unsigned int mcp3_CompilationUnit (void)
+{
+ stk = mcStack_init ();
+ WasNoError = TRUE;
+ FileUnit ((mcp3_SetOfStop0) ((1 << (mcReserved_eoftok-mcReserved_eoftok))), (mcp3_SetOfStop1) 0, (mcp3_SetOfStop2) 0);
+ mcStack_kill (&stk);
+ return WasNoError;
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+extern "C" void _M2_mcp3_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+{
+}
+
+extern "C" void _M2_mcp3_finish (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+{
+}