HerculesParser.mesa (ex Parser.mesa)
NOW JUNK - See HerculesParseUnparse

Simple operator precedence parser for operators of the following types: infix, prefix, postfix, matchfix (like "begin" or left grouping parenthesis), subfix (like "[" in Mesa or "(" in f(x)) and closefix (like "end" or ")").
The symbolic expression constructed by the parser is represented as in Lisp, by a nest of ordered pairs; the list cells employed are those of Mesa's LIST OF REF ANY.
Last Edited by: Gnelson, January 10, 1983 5:50 pm
Last Edited by: Stolfi, February 16, 1984 3:28 am
DIRECTORY
Rope USING [ROPE],
Lexer USING [Handle],
HerculesAlgebra USING [Se]
ParseTable USING [Properties, PRec];
HerculesParser: DEFINITIONS =
BEGIN OPEN PTab: ParseTable, Alg: HerculesAlgebra;
Handle: TYPE = REF HandleRec;
HandleRec: TYPE = RECORD
[error: Rope.ROPENIL, -- set to error message on lexical error
eof: BOOLFALSE, -- initially FALSE, set to TRUE on end of input.
result: Alg.Se ← NIL, -- contains last thing produced by Parse.
openCount: INT ← 0, -- number of unmatched matchfixs or subfixs in last thing parsed
in: Lexer.Handle ← NIL, -- Source of lexemes to be parsed.
-- WARNING The initial value of in.a is relevant; see "Parse" below
defaultIdProps: PTab.Properties ← NIL, -- default properties of identifiers
table: PTab.Handle ← NIL]; -- associates operator types with operators.
NewHandle: PROC RETURNS [h: Handle];
Parse: PUBLIC PROC[h: Handle];
-- sets h.result to the List representing the longest prefix of
-- the lexeme stream h.in that is a valid symbolic expression,
-- counting the current value of h.in.a as the first lexeme. Thus
-- the way to start the parser is to call Lex[h.in]; Parse[h].
-- This will parse one expression and leave in h.in.a the first lexeme
-- not used in the parse tree; thus successive calls will work.
-- Sets h.eof if h.in.eof is set
-- Sets h.error if h.in.error is set, or if a parse error occurs.
-- If h.error AND NOT h.in.error AND NOT h.in.eof then the input can be reconstructed
-- by Unparse[h.result]; print h.in.a; print all of h.in, except that
-- in the unparse you should skip the NIL that appears at the right-most
-- position in h.result.
END.
Edited on February 15, 1984 2:14 am, by Stolfi
Added Tioga formatting.
changes to: HandleRec (added defaultIdProps, changed type of result to Alg.Se),