INTERFACEThis interface provides the proceduresJunoParse ;
Block, Command, and Expression
for parsing Juno block (declarations), commands, and expressions. The Juno
grammar implemented by this interface is described in the text file:
/proj/m3/pkg/juno-compiler/src/Grammar/Juno.bnf
All the parsing procedures in this module guarantee that any newly created
AST nodes have a back pointer to the sentinel JunoAST.End.
IMPORT JunoAST, JunoToken, Rd, JunoLex;Each of the parsing procedures takes its input from an abstract token stream. Typically, the stream is created from a reader.
TYPE IterativeParse <: REFANY;
AnIterativeParseobject has an associated token stream. The stream can be passed as an argument to theBlockprocedure to successively parse the top-level blocks of an entire module.
PROCEDURE StartIterativeParse(READONLY rd: Rd.T): IterativeParse
RAISES {JunoLex.Error, Rd.Failure};
Returns a newly initializedIterativeParseobject with a token stream supplied fromrd.
PROCEDURE FinishIterativeParse(ip: IterativeParse) RAISES {Rd.Failure};
Close ip's token stream. Each of the following procedures parses its input according to a particular non-terminal of the Juno grammar, and returns its result as a
VAR (*OUT"
parameter named "ast". The "VAR (*OUT*)" parameter named "tokenCnt" is set
to contain the number of tokens parsed and successfully incorporated into
the result "ast".
These procedures raise either "Error" if the tokens in their input stream
do not form a legal syntactic block, command, or expression, respectively.
They raise "JunoLex.Error" in case of a lexical error in their input. If
the procedures cannot read from the stream, they raise the "Rd.Failure"
exception. *)
PROCEDURE Block(
ip: IterativeParse;
VAR (*OUT*) ast: JunoAST.Block;
VAR (*OUT*) tokenCnt: CARDINAL)
RAISES {Error, JunoLex.Error, Rd.Failure};
Parse the next Block non-terminal from the reader underlying ip. A
module is a sequence of top-level blocks. Returns with ast = NIL when
ip's token stream is empty.
PROCEDURE GetIndex(
ip: IterativeParse): INTEGER;
Return the number of characters that occur in the source text for the
ASTs that have been returned so far by calls to Block(ip,...), including
any trailing whitespace. This is the index of the first character of the first
token of the AST that will be returned by the next call to Block(ip,...).
PROCEDURE Command(
READONLY rd: Rd.T;
VAR (*OUT*) ast: JunoAST.Cmd;
VAR (*OUT*) tokenCnt: CARDINAL)
RAISES {Error, JunoLex.Error, Rd.Failure};
Parse a Cmd non-terminal from rd.
PROCEDURE Expression(
READONLY rd: Rd.T;
VAR (*OUT*) ast: JunoAST.Expr;
VAR (*OUT*) tokenCnt: CARDINAL)
RAISES {Error, JunoLex.Error, Rd.Failure};
Parse an Expr non-terminal from rd.
PROCEDURE FoldHeader(
READONLY rd: Rd.T;
VAR (*OUT*) ast: JunoAST.PredHeader;
VAR (*OUT*) tokenCnt: CARDINAL)
RAISES {Error, JunoLex.Error, Rd.Failure};
Parse an Id optionally applied to a list of Ids, and set ast to the
result. If rd contains just an id, it will be returned in ast.name
and ast.ins will be NIL. Otherwise ast.ins will contain the list
of arguments (which may be EmptyIdList).
PROCEDURE IdList(
READONLY rd: Rd.T;
VAR (*OUT*) ast: JunoAST.IdList;
VAR (*OUT*) tokenCnt: CARDINAL)
RAISES {Error, JunoLex.Error, Rd.Failure};
Parse a comma-separated list of identifiers, and set ast to the result.
An empty list is allowed.
TYPE
ErrorRec = REF RECORD
found: JunoToken.T;
expected: JunoToken.Kind; (* may be "JunoToken.Kind.Unknown" *)
additional: TEXT;
END;
EXCEPTION Error(ErrorRec);
The exception Error is raised when the input does not form a legal
sentence derivable from the specified non-terminal. The returned
ErrorRec contains information about the parse error.
The found field contains the token which caused the parser to fail. In
some cases, the parse fails because the parser is expecting a single
particular token in the token stream. In such cases, expected is
the expected token; otherwise, it is JunoToken.Kind.Unknown.
The field additional contains characters which properly follow
the found token, but which have been pulled off the underlying
reader.
In the event that the Error exception is raised, the ast parameter will
contain the partial AST corresponding to the tokens that have been parsed
so far; the AST will contain NIL fields for those parts of the input that
were not parsed before the error occurred.
END JunoParse.