<> <> <> <> <> <> DIRECTORY Basics: TYPE USING [bitsPerWord, charsPerWord], IO: TYPE USING [STREAM], PGSTypes: TYPE USING [Aliases, alternateLim, AttrVec, BackChain, BitsInfo, BitString, Column, HashTab, maxProd, maxRhsSymbols, maxRule, NTDefaults, Options, PInfo, ProdInfo, pssLim, Renumber, RhsChar, rhsLim, SInfo, Stack, StateData, StateInfo, SymInfo, SymTab, symTabSize, Tab, Table, TokenInfo, tokenSize, VocabIndex], PrincOps: TYPE USING [wordsPerPage], Rope: TYPE USING [ROPE], TimeStamp: TYPE USING [Stamp]; PGSConDefs: DEFINITIONS = { OPEN PGSTypes; <> cpw: NAT = Basics.charsPerWord; pageSize: NAT = PrincOps.wordsPerPage; wordLength: NAT = Basics.bitsPerWord; maxCharCode: NAT = CHAR.LAST.ORD; <> outbufLim: NAT = 90; <> alternateLim: CARDINAL = PGSTypes.alternateLim; maxProd: CARDINAL = PGSTypes.maxProd; maxRhsSymbols: CARDINAL = PGSTypes.maxRhsSymbols; maxRule: CARDINAL = PGSTypes.maxRule; pssLim: CARDINAL = PGSTypes.pssLim; rhsLim: CARDINAL = PGSTypes.rhsLim; symTabSize: CARDINAL = PGSTypes.symTabSize; tokenSize: CARDINAL = PGSTypes.tokenSize; wordsForToken: CARDINAL = (tokenSize+cpw-1)/cpw; query: CHAR = '?; -- marker character in PGSformat <> maxStateNum: CARDINAL = 400; stateExt: CARDINAL = 100; maxTabEntries: CARDINAL = 7000; tabExt: CARDINAL = 1000; maxContexts: CARDINAL = 960; <> defaultMarker: CARDINAL = 0; <> pgsVersion: VAR TimeStamp.Stamp; sourceVersion: VAR TimeStamp.Stamp; sourceName: VAR Rope.ROPE; objectVersion: VAR TimeStamp.Stamp; <> warningsLogged: VAR BOOL; eofMark: VAR CARDINAL; -- last terminal totalTokens: VAR CARDINAL; -- size of grammar vocabulary numProd: VAR CARDINAL; -- number of productions numRules: VAR CARDINAL; -- number of rules nextAlias: VAR CARDINAL; -- number of aliased terminal symbols flags: VAR ARRAY Options OF BOOL; symTab: VAR SymTab; symInfo: VAR SymInfo; aliases: VAR Aliases; tokenInfo: VAR TokenInfo; prodInfo: VAR ProdInfo; rhsChar: VAR RhsChar; <> sLim, tEntries, ntEntries: VAR CARDINAL; <> bitstrSize: VAR CARDINAL; <> <> <<>> MakeSymTab: PROC[length: CARDINAL] RETURNS[new: SymTab]; MakeSymInfo: PROC[length: CARDINAL] RETURNS[new: SymInfo]; MakeAliases: PROC[length: CARDINAL] RETURNS[new: Aliases]; MakeTokenInfo: PROC[length: CARDINAL] RETURNS[new: TokenInfo]; MakeProdInfo: PROC[length: CARDINAL] RETURNS[new: ProdInfo]; MakeRhsChar: PROC[length: CARDINAL] RETURNS[new: RhsChar]; MakeStateInfo: PROC[length: CARDINAL] RETURNS[new: StateInfo]; MakeTable: PROC[length: CARDINAL] RETURNS[new: Table]; MakeBackChain: PROC[length: CARDINAL] RETURNS[new: BackChain]; MakeStack: PROC[length: CARDINAL] RETURNS[new: Stack]; MakeBitsInfo: PROC[length: CARDINAL] RETURNS[new: BitsInfo]; MakeBitString: PROC[length, width: CARDINAL] RETURNS[new: BitString]; MakeAttrVec: PROC[length: CARDINAL] RETURNS[new: AttrVec]; MakeHashTab: PROC[length: CARDINAL] RETURNS[new: HashTab]; MakeTab: PROC[length: CARDINAL] RETURNS[new: Tab]; MakeColumn: PROC[length: CARDINAL] RETURNS[new: Column]; MakeStateData: PROC[length: CARDINAL] RETURNS[new: StateData]; MakeNTDefaults: PROC[length: CARDINAL] RETURNS[new: NTDefaults]; MakeRenumber: PROC[length: CARDINAL] RETURNS[new: Renumber]; MakeVocabIndex: PROC[length: CARDINAL] RETURNS[new: VocabIndex]; MakeSInfo: PROC[length: CARDINAL] RETURNS[new: SInfo]; MakePInfo: PROC[length: CARDINAL] RETURNS[new: PInfo]; <<>> ExpandSymTab: PROC[old: SymTab, ext: CARDINAL] RETURNS[new: SymTab]; ExpandSymInfo: PROC[old: SymInfo, ext: CARDINAL] RETURNS[new: SymInfo]; ExpandAliases: PROC[old: Aliases, ext: CARDINAL] RETURNS[new: Aliases]; ExpandProdInfo: PROC[old: ProdInfo, ext: CARDINAL] RETURNS[new: ProdInfo]; ExpandRhsChar: PROC[old: RhsChar, ext: CARDINAL] RETURNS[new: RhsChar]; ExpandStateInfo: PROC[old: StateInfo, ext: CARDINAL] RETURNS[new: StateInfo]; ExpandStack: PROC[old: Stack, ext: CARDINAL] RETURNS[new: Stack]; ExpandBitsInfo: PROC[old: BitsInfo, ext: CARDINAL] RETURNS[new: BitsInfo]; ExpandBitString: PROC[old: BitString, ext: CARDINAL] RETURNS[new: BitString]; ExpandSInfo: PROC[old: SInfo, ext: CARDINAL] RETURNS[new: SInfo]; ExpandPInfo: PROC[old: PInfo, ext: CARDINAL] RETURNS[new: PInfo]; <<>> <> seterrstream: PROC; setoutstream: PROC[dotstring: Rope.ROPE]; resetoutstream: PROC; closeoutstream: PROC; cleanupstreams: PROC; inchar: PROC RETURNS[c: CHAR, end: BOOL]; getindex: PROC RETURNS[CARDINAL]; setindex: PROC[index: CARDINAL]; outchar: PROC[c: CHAR, n: INTEGER]; outeol: PROC[n: INTEGER]; outnum: PROC[val: INTEGER, cols: NAT, signChar: CHAR_'-]; outstring: PROC[string: Rope.ROPE]; outtab: PROC; outtime: PROC; openwordstream: PROC[scratch: BOOL _ TRUE]; closewordstream: PROC; inword: PROC RETURNS[CARDINAL]; outword: PROC[n: CARDINAL]; outblock: PROC[address: LONG POINTER, words: CARDINAL, offset: CARDINAL _ 0]; <> BitsPtr: PRIVATE TYPE ~ LONG POINTER TO PACKED ARRAY[0..0) OF BOOL; FindBit: PROC[source: BitString, index, bit: CARDINAL] RETURNS[BOOL] ~ TRUSTED INLINE {RETURN[LOOPHOLE[@source[index*source.width], BitsPtr][bit]]}; InsertBit: PROC[sink: BitString, index, bit: CARDINAL] ~ TRUSTED INLINE {LOOPHOLE[@sink[index*sink.width], BitsPtr][bit] _ TRUE}; <<>> orCount: VAR CARDINAL; OrBits: PROC[source: BitString, sourceI: CARDINAL, sink: BitString, sinkI: CARDINAL]; <<>> <> PGSFail: ERROR; <> OutToken: PROC[symbol: CARDINAL] RETURNS[CARDINAL]; CheckOut: PROC; <> LALRGen: PROC RETURNS[BOOL]; <> TabGen: PROC[prefix, suffix: PROC] RETURNS[BOOL]; OutModule: PROC[typename, modfname: Rope.ROPE, long: BOOL_FALSE]; <> Format: PROC RETURNS[table, type, export: Rope.ROPE]; PrintGrammar: PROC; <> WriteBcdHeader: PROC[ outStream: IO.STREAM, tableId, binaryId: Rope.ROPE, -- file being written interfaceId, fileId: Rope.ROPE, -- interface being exported altoCode: BOOL_FALSE]; FixupBcdHeader: PROC; <> WriteSymbols: PROC[s: IO.STREAM, moduleId: Rope.ROPE]; }.