-- file PGScondefs.Mesa -- last modified by Satterthwaite, July 14, 1980 1:57 PM DIRECTORY AltoDefs: TYPE USING [CharsPerWord, maxcharcode, PageSize, wordlength], BcdDefs: TYPE USING [VersionStamp], CharIO: TYPE USING [CR,TAB], Mopcodes: TYPE USING [zLI4, zRFS, zSHIFT, zWFS], StreamDefs: TYPE USING [StreamHandle]; PGScondefs: DEFINITIONS = BEGIN -- machine parameters cpw: CARDINAL=AltoDefs.CharsPerWord; pagesize: CARDINAL=AltoDefs.PageSize; wordlength: CARDINAL=AltoDefs.wordlength; maxcharcode: CARDINAL=AltoDefs.maxcharcode; Bit: PRIVATE TYPE = [0..1]; GetBit: PRIVATE PROC [word:LongPointer, bit:CARDINAL] RETURNS [Bit] = MACHINE CODE {Mopcodes.zLI4; Mopcodes.zSHIFT; Mopcodes.zRFS}; SetBit: PRIVATE PROC [v:Bit, word:LongPointer, bit:CARDINAL] = MACHINE CODE {Mopcodes.zLI4; Mopcodes.zSHIFT; Mopcodes.zWFS}; -- common compile time constants outbuflim: CARDINAL = 90; TextPages: CARDINAL = 6; TextWords: CARDINAL = TextPages*pagesize; TextChars: CARDINAL = TextWords*cpw; --PGSScan compile time constants maxprod: CARDINAL = 500; maxrule: CARDINAL = 255; --this is the current PGSTab limit maxrhssymbols: CARDINAL = 2*maxprod; -- empirical relation tokensize: CARDINAL = 14; symtabsize: CARDINAL = 350; --initial symbol table size rhslim: CARDINAL = 15; --this is the current PGSTab limit, change the grammar? alternatelim: CARDINAL = 31; psslim:CARDINAL = 1023; -- 10 bit field in itemrec to hold production, symbol -- or state numbers, PGSTab allows an 11 bit field wordsfortoken: CARDINAL = (tokensize+cpw-1)/cpw; CR: CHARACTER = CharIO.CR; TAB: CHARACTER = CharIO.TAB; -- used by PGSformat ControlZ: CHARACTER = 32C; --Bravo escape character query: CHARACTER = '?; -- marker character in PGSformat --PGSLALR constants maxstatenum: CARDINAL = 400; stateext: CARDINAL = 100; maxtabentries: CARDINAL = 7000; tabext: CARDINAL = 1000; maxcontexts: CARDINAL = 960; --PGSTab constants defaultmarker: CARDINAL = 0; -- data structures and associated types -- data structtures using the following types are built by PGSScan Symtab:TYPE = --LONG-- DESCRIPTOR FOR PACKED ARRAY OF CHARACTER; -- [0..(symtabsize+1)*tokensize) symtabrecord:TYPE = RECORD[link:[0..symtabsize], length:[0..tokensize], used:BOOLEAN]; Syminfo:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF symtabrecord; -- [0..symtabsize] aliasrecord: TYPE = RECORD[terminal,alias:CARDINAL]; Aliases:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF aliasrecord; -- [0..63] tokenrecord: TYPE = RECORD[count:[0..alternatelim], empty:BOOLEAN, index:[0..maxprod]]; Tokeninfo:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF tokenrecord;--(eofile..totaltokens] prodrecord: TYPE = RECORD[count:[0..rhslim], rule:[0..maxrule], chain:BOOLEAN, lhs:[0..symtabsize], index:[0..maxrhssymbols]]; Prodinfo:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF prodrecord; -- [0..maxprod] Rhschar:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF CARDINAL; -- [0..maxrhssymbols] Options: TYPE = {echo,chain,lists,printlr,printlalr,first,ids}; -- data structures built and implemented by PGSControl, used by PGSFormat and PGSBcd pgsVersion: BcdDefs.VersionStamp; sourceVersion: BcdDefs.VersionStamp; sourceName: STRING; objectVersion: BcdDefs.VersionStamp; -- data structures built by PGSScan, implemented by PGSControl, used by PGSLALR and PGSTab warningslogged: BOOLEAN; eofile: CARDINAL; -- last terminal totaltokens: CARDINAL; -- size of grammar vocabulary numprod: CARDINAL; -- number of productions nextalias: CARDINAL; -- number of aliased terminal symbols flags: ARRAY Options OF BOOLEAN; symtab: Symtab; syminfo: Syminfo; aliases: Aliases; tokeninfo: Tokeninfo; prodinfo: Prodinfo; rhschar: Rhschar; -- built by PGSLALR, implemented by PGSControl, used by PGSTab slim, tentries, ntentries: CARDINAL; -- built by PGSLALR, implemented by PGSControl, used by PGSControl and PGSLALR bitstrsize: CARDINAL; --data structures types for LR(0) tables in PGSLALR stateinforec: TYPE = RECORD[link,nucleus,entries:CARDINAL]; Stateinfo: TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF stateinforec; --[0,maxstatenum+1]; itemrec: TYPE = RECORD[tag:[0..3],jf:[0..15],pss:[0..psslim]]; Table: TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF itemrec; --[0..maxtabentries] --after table is built, --tag = 3 => pss is a nonterminal symbol, such an entry is followed by an entry: --tag = 0 => pss is a next state number --tag = 1 => pss is production number, scanreduce, jf=n[p] --tag = 2 => pss is production number, reduce, jf=n[p] --data structure types for LALR(1) lookahead sets in PGSLALR chainrec: TYPE = RECORD[state,link:CARDINAL]; Backchain: TYPE= --LONG-- DESCRIPTOR FOR ARRAY OF chainrec; --[0..totalshifts] initially Stack:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF CARDINAL; --[0..30) initially Chainstack:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF CARDINAL; --[0..90) initially contextrec:TYPE = RECORD[state,status,link:CARDINAL,item:itemrec]; Bitsinfo:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF contextrec; --[0..maxcontexts) Bitstring:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF UNSPECIFIED; --[0..maxcontexts) Firstbits:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF UNSPECIFIED; --[eofile+1..totaltokens] --data structure types for PGSTab hashtabrec:TYPE = MACHINE DEPENDENT RECORD[symptr:[0..255], link:[0..255]]; Hashtab:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF hashtabrec; --[0..hashval] tabrec:TYPE = RECORD[symbol:CARDINAL, item:itemrec]; Ttab:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF tabrec; --[0..tentries-1]; Ntab:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF tabrec; --[0..ntentries-1]; columnrec:TYPE = RECORD[link, count:CARDINAL, item:itemrec]; Column:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF columnrec; --[0..ntentries]; statedatarec:TYPE = RECORD[tindex, ntindex:CARDINAL, tlink,ntlink:INTEGER]; Statedata:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF statedatarec; --[0..slim-1]; ntdefaultrec:TYPE = RECORD[count:CARDINAL, item:itemrec]; Ntdefaults:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF ntdefaultrec; --[0..totaltokens-eofile+1]; Renumber:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF CARDINAL; --[0..slim-1] Vocabindex:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF CARDINAL; --[0..eofile-1] --data structure types for PGSformat which also uses Symtab and Rhschar sinforec:TYPE = RECORD[symptr,link,lhshead:CARDINAL]; Sinfo:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF sinforec; --[0..symtabsize+1]; pinforec:TYPE = RECORD[rule:[0..77777B],chain:BOOLEAN,link,rhsptr:CARDINAL]; Pinfo:TYPE = --LONG-- DESCRIPTOR FOR ARRAY OF pinforec; --[0..maxprod+1]; -- procedures -- implemented by PGSControl PGSfail: ERROR; outeol: PROC [n:CARDINAL]; outchar: PROC [c:CHARACTER, n:INTEGER]; outstring: PROC [string:STRING]; outtime: PROC; outtab: PROC; outword: PROC [n:CARDINAL]; inword: PROC RETURNS [CARDINAL]; outblock: PROC [address:POINTER, words:CARDINAL]; signchar: CHARACTER; outnum: PROC [val:INTEGER, cols:CARDINAL]; nextbuffer: PROC RETURNS [ p:POINTER TO PACKED ARRAY OF CHARACTER, c:CARDINAL, last:BOOLEAN]; seterrstream: PROC; setoutstream: PROC [dotstring:STRING]; resetoutstream: PROC; cleanupstreams: PROC; closeoutstream: PROC; openwordstream: PROC [scratch: BOOLEAN ← TRUE]; closewordstream: PROC; AllocateSegment: PROC [nwords:CARDINAL] RETURNS [POINTER]; FreeSegment: PROC [POINTER]; LongDes: TYPE = -- LONG -- DESCRIPTOR FOR ARRAY OF UNSPECIFIED; LongPointer: TYPE = -- LONG -- POINTER; makearray: PROC [length,width:CARDINAL] RETURNS [LongDes]; expand: PROC [des:LongDes, width, ext:CARDINAL] RETURNS [LongDes]; insertbit: PROC [num:CARDINAL, sink:LongPointer] = INLINE {SetBit[1, sink + num/wordlength, num MOD wordlength]}; findbit: PROC [num:CARDINAL, source:LongPointer] RETURNS [BOOLEAN] = INLINE {RETURN [GetBit[source+num/wordlength, num MOD wordlength]#0]}; orcount: CARDINAL; orbits: PROC [source,sink:LongPointer]; -- implemented by PGSScan outtoken: PROC [symbol:CARDINAL] RETURNS [CARDINAL]; checkout: PROC; -- implemented by PGSLALR lalrgen: PROC RETURNS [BOOLEAN]; -- implemented by PGSTab tabgen: PROC RETURNS [BOOLEAN]; outmodule: PROC [typename, modfname: STRING]; -- implemented by PGSFormat Format: PROC [binary, type, module, interface: STRING]; PrintGrammar: PROC; -- implemented by PGSBcd WriteBcdHeader: PROC [ outStream: StreamDefs.StreamHandle, binaryId, interfaceId: STRING, altoCode: BOOLEAN ← TRUE]; FixupBcdHeader: PROC; -- implemented by PGSSymbols WriteSymbols: PROC [s: StreamDefs.StreamHandle, moduleId: STRING]; END.