(* P2SymBuild.def pass 2 symbol creation. Copyright (C) 2001-2025 Free Software Foundation, Inc. Contributed by Gaius Mulley . 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 COPYING3. If not see . *) DEFINITION MODULE P2SymBuild ; (* BlockStart - tokno is the module/procedure/implementation/definition token *) PROCEDURE BlockStart (tokno: CARDINAL) ; (* BlockEnd - declare module ctor/init/fini/dep procedures. *) PROCEDURE BlockEnd (tokno: CARDINAL) ; (* BlockBegin - assign curBeginTok to tokno. *) PROCEDURE BlockBegin (tokno: CARDINAL) ; (* BlockFinally - assign curFinallyTok to tokno. *) PROCEDURE BlockFinally (tokno: CARDINAL) ; (* StartBuildDefinitionModule - Creates a definition module and starts a new scope. The Stack is expected: Entry Exit Ptr -> <- Ptr +------------+ +-----------+ | NameStart | | NameStart | |------------| |-----------| *) PROCEDURE P2StartBuildDefModule ; (* EndBuildDefinitionModule - Destroys the definition module scope and checks for correct name. The Stack is expected: Entry Exit Ptr -> +------------+ +-----------+ | NameEnd | | | |------------| |-----------| | NameStart | | | <- Ptr |------------| |-----------| *) PROCEDURE P2EndBuildDefModule ; (* StartBuildImplementationModule - Creates an implementation module and starts a new scope. The Stack is expected: Entry Exit Ptr -> <- Ptr +------------+ +-----------+ | NameStart | | NameStart | |------------| |-----------| *) PROCEDURE P2StartBuildImplementationModule ; (* EndBuildImplementationModule - Destroys the implementation module scope and checks for correct name. The Stack is expected: Entry Exit Ptr -> +------------+ +-----------+ | NameEnd | | | |------------| |-----------| | NameStart | | | <- Ptr |------------| |-----------| *) PROCEDURE P2EndBuildImplementationModule ; (* StartBuildProgramModule - Creates a program module and starts a new scope. The Stack is expected: Entry Exit Ptr -> <- Ptr +------------+ +-----------+ | NameStart | | NameStart | |------------| |-----------| *) PROCEDURE P2StartBuildProgramModule ; (* EndBuildProgramModule - Destroys the program module scope and checks for correct name. The Stack is expected: Entry Exit Ptr -> +------------+ +-----------+ | NameEnd | | | |------------| |-----------| | NameStart | | | <- Ptr |------------| |-----------| *) PROCEDURE P2EndBuildProgramModule ; (* StartBuildInnerModule - Creates an Inner module and starts a new scope. The Stack is expected: Entry Exit Ptr -> <- Ptr +------------+ +-----------+ | NameStart | | NameStart | |------------| |-----------| *) PROCEDURE StartBuildInnerModule ; (* EndBuildInnerModule - Destroys the Inner module scope and checks for correct name. The Stack is expected: Entry Exit Ptr -> +------------+ +-----------+ | NameEnd | | | |------------| |-----------| | NameStart | | | <- Ptr |------------| |-----------| *) PROCEDURE EndBuildInnerModule ; (* BuildImportOuterModule - Builds imported identifiers into an outer module from a definition module. The Stack is expected: Entry OR Entry Ptr -> Ptr -> +------------+ +-----------+ | # | | # | |------------| |-----------| | Id1 | | Id1 | |------------| |-----------| . . . . . . . . . . . . |------------| |-----------| | Id# | | Id# | |------------| |-----------| | ImportTok | | Ident | |------------| |-----------| IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ; Error Condition Exit All above stack discarded *) PROCEDURE BuildImportOuterModule ; (* BuildExportOuterModule - Builds exported identifiers from an outer module to the outside world of library modules. The Stack is expected: Entry OR Entry Ptr -> Ptr -> +------------+ +--------------+ | # | | # | |------------| |--------------| | Id1 | | Id1 | |------------| |--------------| . . . . . . . . . . . . |------------| |--------------| | Id# | | Id# | |------------| |--------------| | ExportTok | | QualifiedTok | |------------| |--------------| EXPORT Id1, .. Id# ; EXPORT QUALIFIED Id1 .. Id# ; Error Condition Exit All above stack discarded *) PROCEDURE BuildExportOuterModule ; (* BuildImportInnerModule - Builds imported identifiers into an inner module from the last level of module. The Stack is expected: Entry OR Entry Ptr -> Ptr -> +------------+ +-----------+ | # | | # | |------------| |-----------| | Id1 | | Id1 | |------------| |-----------| . . . . . . . . . . . . |------------| |-----------| | Id# | | Id# | |------------| |-----------| | ImportTok | | Ident | |------------| |-----------| IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ; Error Condition Exit All above stack discarded *) PROCEDURE BuildImportInnerModule ; (* BuildExportInnerModule - Builds exported identifiers from an inner module to the next layer module. The Stack is expected: Entry OR Entry Ptr -> Ptr -> +------------+ +--------------+ | # | | # | |------------| |--------------| | Id1 | | Id1 | |------------| |--------------| . . . . . . . . . . . . |------------| |--------------| | Id# | | Id# | |------------| |--------------| | ExportTok | | QualifiedTok | |------------| |--------------| EXPORT Id1, .. Id# ; EXPORT QUALIFIED Id1 .. Id# ; Exit All above stack discarded *) PROCEDURE BuildExportInnerModule ; (* BuildNumber - Converts a number into a symbol. Stack Entry Exit Ptr -> <- Ptr +------------+ +------------+ | Name | | Sym | |------------+ |------------| *) PROCEDURE BuildNumber ; (* BuildString - Converts a string into a symbol. Stack Entry Exit Ptr -> <- Ptr +------------+ +------------+ | Name | | Sym | |------------+ |------------| *) PROCEDURE BuildString ; (* BuildConst - builds a constant. Stack Entry Exit Ptr -> +------------+ | Name | |------------+ <- Ptr *) PROCEDURE BuildConst ; (* StartBuildEnumeration - Builds an Enumeration type Type. Stack Entry Exit Ptr -> +------------+ | # | |------------| | en 1 | |------------| | en 2 | |------------| . . . . . . <- Ptr |------------| +------------+ | en # | | Type | |------------| |------------| | Name | | Name | |------------| |------------| *) PROCEDURE StartBuildEnumeration ; (* BuildSubrange - Builds a Subrange type Symbol, the base type can also be supplied if known. Stack Entry Exit <- Ptr +------------+ Ptr -> | Type | +------------+ |------------| | Name | | Name | |------------| |------------| *) PROCEDURE BuildSubrange (tok: CARDINAL; Base: CARDINAL) ; (* BuildAligned - builds an alignment constant symbol which is placed onto the stack. It expects the ident ALIGNED to be on the stack. Stack Entry Exit Ptr -> <- Ptr +---------------+ +-----------------+ | bytealignment | | AlignmentConst | +---------------+ |-----------------| *) PROCEDURE BuildAligned ; (* BuildVarAlignment - the AlignmentConst is either a temporary or NulSym. A type may only have one alignment value and error checking is performed. Stack Entry Exit Ptr -> +-----------------+ | AlignmentConst | <- Ptr |-----------------| +------------------+ | Type | | Type | TypeName | |-----------------| |------------------| *) PROCEDURE BuildVarAlignment ; (* BuildTypeAlignment - the AlignmentConst is either a temporary or NulSym. A type may only have one alignment value and error checking is performed. Stack Entry Exit Ptr -> +-----------------+ | AlignmentConst | |-----------------| | Type | Empty |-----------------| *) PROCEDURE BuildTypeAlignment ; (* BuildDefaultFieldAlignment - The Stack: Entry Exit ===== ==== Ptr -> +-----------+ | Alignment | |-----------| +-----------+ | RecordSym | | RecordSym | |-----------| |-----------| | Name | | Name | |-----------| |-----------| *) PROCEDURE P2BuildDefaultFieldAlignment ; (* BuildPragmaConst - pushes a constant to the stack and stores it away into the const fifo queue ready for pass 3. *) PROCEDURE BuildPragmaConst ; (* BuildVariable - Builds variables listed in an IdentList with a Type. Stack Entry Exit Ptr -> +------------+ +------------+ | Type | Name| | | |------------| |------------| | # | | | |------------| |------------| | Ident 1 | | | |------------| |------------| | Ident 2 | | | |------------| |------------| . . . . . . . . . . . . |------------| |------------| | Ident # | | | <- Ptr |------------| |------------| Empty *) PROCEDURE BuildVariable ; (* BuildType - Builds a Type. Stack Entry Exit Ptr -> +------------+ | Type | <- Ptr |------------| +---------------+ | Name | | Type | Name | |------------| |---------------| Empty *) PROCEDURE BuildType ; (* StartBuildFormalParameters - Initialises the quadruple stack for Formal Parameters. The Stack: Entry Exit <- Ptr +------------+ Empty | 0 | |------------| *) PROCEDURE StartBuildFormalParameters ; (* EndBuildFormalParameters - Resets the quadruple stack after building Formal Parameters. The Stack: Entry Exit Ptr -> +------------+ | NoOfParam | <- Ptr |------------| +------------+ | ProcSym | | ProcSym | |------------| |------------| *) PROCEDURE EndBuildFormalParameters ; (* BuildProcedureHeading - Builds a procedure heading for the definition module procedures. Operation only performed if compiling a definition module. The Stack: Entry Exit Ptr -> +------------+ | ProcSym | Empty |------------| *) PROCEDURE BuildProcedureHeading ; (* BuildFunction - Builds a procedures return type. Procedure becomes a function. The Stack: Entry Exit Ptr -> +------------+ | TypeSym | <- Ptr |------------| +------------+ | ProcSym | | ProcSym | |------------| |------------| *) PROCEDURE BuildFunction ; (* BuildOptFunction - Builds a procedures optional return type. Procedure becomes a function and the user can either call it as a function or a procedure. The Stack: Entry Exit Ptr -> +------------+ | TypeSym | <- Ptr |------------| +------------+ | ProcSym | | ProcSym | |------------| |------------| *) PROCEDURE BuildOptFunction ; (* BuildFPSection - Builds a Formal Parameter in a procedure. The Stack: Entry Exit Ptr -> +------------+ | ParamTotal | |------------| | TypeName | |------------| | Array/Nul | |------------| | NoOfIds | |------------| | Id 1 | |------------| . . . . . . |------------| | Id n | <- Ptr |------------| +------------+ | Var / Nul | | ParamTotal | |------------| |------------| | ProcSym | | ProcSym | |------------| |------------| *) PROCEDURE BuildFPSection ; (* BuildVarArgs - indicates that the ProcSym takes varargs after ParamTotal. <- Ptr +------------+ +------------+ | ParamTotal | | ParamTotal | |------------| |------------| | ProcSym | | ProcSym | |------------| |------------| *) PROCEDURE BuildVarArgs ; (* BuildFormalVarArgs - indicates that the procedure type takes varargs. <- Ptr +------------+ +------------+ | ProcSym | | ProcSym | |------------| |------------| *) PROCEDURE BuildFormalVarArgs ; (* BuildOptArg - indicates that the ProcSym takes a single optarg after ParamTotal. <- Ptr +------------+ +------------+ | ParamTotal | | ParamTotal | |------------| |------------| | ProcSym | | ProcSym | |------------| |------------| *) PROCEDURE BuildOptArg ; (* StartBuildProcedure - Builds a Procedure. The Stack: Entry Exit <- Ptr +------------+ Ptr -> | ProcSym | +------------+ |------------| | Name | | Name | |------------| |------------| *) PROCEDURE StartBuildProcedure ; (* EndBuildProcedure - Ends building a Procedure. It checks the start procedure name matches the end procedure name. The Stack: Entry Exit Ptr -> +------------+ | NameEnd | |------------| | ProcSym | |------------| | NameStart | |------------| Empty *) PROCEDURE EndBuildProcedure ; (* EndBuildForward - ends building a forward procedure. *) PROCEDURE EndBuildForward ; (* BuildNoReturnAttribute - provide an interface to the symbol table module. *) PROCEDURE BuildNoReturnAttribute ; (* CheckProcedure - checks to see that the top of stack procedure has not been declared as a procedure function. The Stack: Entry Exit Ptr -> <- Ptr +------------+ +------------+ | ProcSym | | ProcSym | |------------| |------------| *) PROCEDURE CheckProcedure ; (* BuildPointerType - builds a pointer type. The Stack: Entry Exit ===== ==== Ptr -> <- Ptr +------------+ +-------------+ | Type | | PointerType | |------------| |-------------| | Name | | Name | |------------| |-------------| *) PROCEDURE BuildPointerType (pointerpos: CARDINAL) ; (* BuildSetType - builds a set type. The Stack: Entry Exit ===== ==== Ptr -> <- Ptr +------------+ +-------------+ | Type | | SetType | |------------| |-------------| | Name | | Name | |------------| |-------------| *) PROCEDURE BuildSetType (setpos: CARDINAL; ispacked: BOOLEAN) ; (* BuildRecord - Builds a record type. The Stack: Entry Exit ===== ==== <- Ptr +-----------+ Ptr -> | RecordSym | +------------+ |-----------| | Name | | Name | |------------| |-----------| *) PROCEDURE BuildRecord ; (* BuildFieldRecord - Builds a field into a record sym. The Stack: Entry Exit ===== ==== Ptr -> +-------------+ | Alignment | |-------------| | Type | Name | |-------------| | n | |-------------| | Id 1 | |-------------| . . . . . . |-------------| | Id n | <- Ptr |-------------| +-------------+ | RecordSym | | RecordSym | |-------------| |-------------| | RecordName | | RecordName | |-------------| |-------------| *) PROCEDURE BuildFieldRecord ; (* StartBuildVarient - Builds a varient symbol on top of a record sym. The Stack: Entry Exit ===== ==== <- Ptr +-------------+ Ptr -> | VarientSym | +-------------+ |-------------| | RecordSym | | RecordSym | |-------------| |-------------| | RecordName | | RecordName | |-------------| |-------------| *) PROCEDURE StartBuildVarient ; (* EndBuildVarient - Removes the varient symbol from the stack. The Stack: Entry Exit ===== ==== Ptr -> +-------------+ | VarientSym | <- Ptr |-------------| +-------------+ | RecordSym | | RecordSym | |-------------| |-------------| | RecordName | | RecordName | |-------------| |-------------| *) PROCEDURE EndBuildVarient ; (* BuildVarientSelector - Builds a field into a record sym. The Stack: Entry Exit ===== ==== Ptr -> +-------------+ | Qualident | |-------------| | Ident | <- Ptr |-------------| +-------------+ | RecordSym | | RecordSym | |-------------| |-------------| *) PROCEDURE BuildVarientSelector ; (* StartBuildVarientFieldRecord - Builds a varient field into a varient sym. The Stack: Entry Exit ===== ==== <- Ptr +-------------+ Ptr -> | VarientField| +-------------+ |-------------| | VarientSym | | RecordSym | |-------------| |-------------| *) PROCEDURE StartBuildVarientFieldRecord ; (* EndBuildVarientFieldRecord - Removes a varient field from the stack. The Stack: Entry Exit ===== ==== Ptr -> +-------------+ | VarientField| <- Ptr |-------------| +-------------+ | VarientSym | | VarientSym | |-------------| |-------------| *) PROCEDURE EndBuildVarientFieldRecord ; (* BuildNulName - Pushes a NulKey onto the top of the stack. The Stack: Entry Exit <- Ptr Empty +------------+ | NulKey | |------------| *) PROCEDURE BuildNulName ; (* BuildTypeEnd - Pops the type Type and Name. The Stack: Entry Exit Ptr -> +-------------+ | Type | Name | Empty |-------------| *) PROCEDURE BuildTypeEnd ; (* StartBuildArray - Builds an array type. The Stack: Entry Exit ===== ==== <- Ptr +-----------+ Ptr -> | ArraySym | +------------+ |-----------| | Name | | Name | |------------| |-----------| *) PROCEDURE StartBuildArray ; (* EndBuildArray - Builds an array type. The Stack: Entry Exit ===== ==== Ptr -> +------------+ | TypeSym | <- Ptr |------------| +------------+ | ArraySym | | ArraySym | |------------| |------------| | Name | | Name | |------------| |------------| *) PROCEDURE EndBuildArray ; (* BuildFieldArray - Builds a field into an array sym. The Stack: Entry Exit ===== ==== Ptr -> +-------------+ | Type | Name | <- Ptr |-------------| +-------------+ | ArraySym | | ArraySym | |-------------| |-------------| | ArrayName | | ArrayName | |-------------| |-------------| *) PROCEDURE BuildFieldArray ; (* BuildArrayComma - converts ARRAY [..], [..] OF into ARRAY [..] OF ARRAY [..] Ptr -> <- Ptr +-------------+ +-------------+ | ArraySym1 | | ArraySym2 | |-------------| |-------------| | ArrayName | | ArrayName | |-------------| |-------------| *) PROCEDURE BuildArrayComma ; (* BuildProcedureType - builds a procedure type symbol. The Stack: <- Ptr +-------------+ Ptr -> | ProcTypeSym | +-------------+ |-------------| | Name | | Name | |-------------| |-------------| *) PROCEDURE BuildProcedureType ; (* BuildFormalType - Builds a Formal Parameter in a procedure type. The Stack: Entry Exit Ptr -> +------------+ | TypeSym | |------------| | Array/Nul | |------------| | Var / Nul | <- Ptr |------------| +--------------+ | ProcTypeSym| | ProcTypeSym | |------------| |--------------| *) PROCEDURE BuildFormalType ; (* SeenUnknown - sets the operand type to unknown. *) PROCEDURE SeenUnknown ; (* SeenCast - sets the operand type to cast. *) PROCEDURE SeenCast (sym: CARDINAL) ; (* SeenSet - sets the operand type to set. *) PROCEDURE SeenSet ; (* SeenConstructor - sets the operand type to constructor. *) PROCEDURE SeenConstructor ; (* SeenArray - sets the operand type to array. *) PROCEDURE SeenArray ; (* SeenString - sets the operand type to string. *) PROCEDURE SeenString ; (* SeenBoolean - sets the operand type to a BOOLEAN. *) PROCEDURE SeenBoolean ; (* SeenZType - sets the operand type to a Z type. *) PROCEDURE SeenZType ; (* SeenRType - sets the operand type to a R type. *) PROCEDURE SeenRType ; (* SeenCType - sets the operand type to a C type. *) PROCEDURE SeenCType ; (* DetermineType - assigns the top of stack symbol with the type of constant expression, if known. *) PROCEDURE DetermineType ; (* PushType - pushes the current constant type. *) PROCEDURE PushType ; (* PopType - pops the stacked type. *) PROCEDURE PopType ; (* PushRememberConstant - *) PROCEDURE PushRememberConstant ; (* PopRememberConstant - *) PROCEDURE PopRememberConstant ; (* RememberConstant - *) PROCEDURE RememberConstant (sym: CARDINAL) ; END P2SymBuild.