CirioSyntacticOperations.mesa
Copyright Ó 1990 by Xerox Corporation. All rights reserved.
Sturgis, March 5, 1989 4:08:55 pm PST
Last tweaked by Mike Spreitzer on December 5, 1990 5:52 pm PST
Started: November 5, 1988 3:31:32 pm PST
Sturgis: November 5, 1988 3:51:28 pm PST
DIRECTORY
CedarCode USING[Operator, ParseTree, ParseTreeBody],
CirioTypes USING[CompilerContext, NameArgPair, Node, Type, TypedCode],
Rope USING[ROPE];
CirioSyntacticOperations: CEDAR DEFINITIONS =
BEGIN OPEN CedarCode, CirioTypes;
We treat a parse tree as an object to which certain compile functions can be applied. Notice that there will be a flip/flop between general syntactic code (e.g., RHSBinaryOp) and code specific to a specific parse tree implementation (e.g., due to an object call on CompileForRHS). Each time a routine in the specific parse tree implementation wishes to call a general syntactic routine, it must first call CreateParseTree with the next deeper level of tree structure. Thus, a ParseTree will be created for each node in the actual tree.
ParseTree: TYPE = CedarCode.ParseTree;
ParseTreeBody: TYPE = CedarCode.ParseTreeBody;
NameArgPair: TYPE = CirioTypes.NameArgPair;
CreateParseTree: PROC[functions: REF ParseTreeFunctions, data: REF ANY] RETURNS[ParseTree];
NilParseTree: PUBLIC PROC [tree: ParseTree] RETURNS [BOOLEAN];
Here are the compile functions
CompileForRHS: PROC[tree: ParseTree, nominalTarget: Type, cc: CompilerContext] RETURNS[TypedCode];
CompileForLHS: PROC[tree: ParseTree, cc: CompilerContext] RETURNS[TypedCode];
CompileAsFieldExtraction: PROC[tree: ParseTree, fieldContext: CirioTypes.Type, cc: CompilerContext] RETURNS[TypedCode];
CompileAsFieldSelection: PROC[tree: ParseTree, fieldIndirectContext: CirioTypes.Type, cc: CompilerContext] RETURNS[TypedCode];
ShowParseTree: PROC [tree: ParseTree, cc: CompilerContext] RETURNS [Rope.ROPE];
Here is what the creator of a ParseTree must supply
ParseTreeFunctions: TYPE = RECORD[
compileForRHS: PROC[tree: ParseTree, nominalTarget: Type, cc: CompilerContext, data: REF ANY] RETURNS[TypedCode],
compileForLHS: PROC[tree: ParseTree, cc: CompilerContext, data: REF ANY] RETURNS[TypedCode],
compileAsFieldExtraction: PROC[tree: ParseTree, fieldContext: CirioTypes.Type, cc: CompilerContext, data: REF ANY] RETURNS[TypedCode],
compileAsFieldSelection: PROC[tree: ParseTree, fieldIndirectContext: CirioTypes.Type, cc: CompilerContext, data: REF ANY] RETURNS[TypedCode],
showParseTree: PROC [tree: ParseTree, cc: CompilerContext, data: REF ANY] RETURNS [Rope.ROPE]];
These general syntactic procedures are common to compile time and run time
Each procedure corresponds roughly to some syntactic construction
RHSBinaryOp: PROC[op: Operator, left, right: ParseTree, cc: CompilerContext]
RETURNS[TypedCode];
RHSUnaryOp: PROC[op: Operator, arg: ParseTree, cc: CompilerContext]
RETURNS[TypedCode];
RHSnAryOp: PROC[op: Operator, args: LIST OF ParseTree, cc: CompilerContext]
RETURNS[TypedCode];
RHSTypeOp: PROC[op: Operator, type: Type, cc: CompilerContext] RETURNS[TypedCode];
RHSTypeOp2: PROC[op: Operator, type: Type, param: ParseTree, cc: CompilerContext] RETURNS[TypedCode];
RHSAssignment: PROC[left, right: ParseTree, cc: CompilerContext] RETURNS[TypedCode];
RHSBinOpAssignment: PROC [op: Operator, left, right: ParseTree, cc: CompilerContext] RETURNS[TypedCode];
RHSDot: PROC[left, right: ParseTree, cc: CompilerContext] RETURNS[TypedCode];
RHSApply: PROC[left, right: ParseTree, cc: CompilerContext] RETURNS[TypedCode];
RHSCons: PROC [list: ParseTree, targetType: Type, cc: CompilerContext] RETURNS [TypedCode];
RHSConstructor: PROC[list: LIST OF ParseTree, targetType: Type, cc: CompilerContext] RETURNS[TypedCode];
RHSPairConstructor: PROC[list: LIST OF NameArgPair, targetType: Type, cc: CompilerContext] RETURNS[TypedCode];
RHSFieldIdentifier: PROC[id: Rope.ROPE, fieldContext: Type, cc: CompilerContext] RETURNS[TypedCode];
RHSIdentifier: PROC[id: Rope.ROPE, targetType: Type, cc: CompilerContext] RETURNS[TypedCode];
RHSNil: PROC[pointerType: Type, cc: CompilerContext] RETURNS[TypedCode];
RHSLiteral: PROC[literalValue: CirioTypes.Node, cc: CompilerContext] RETURNS[TypedCode];
RHSGlobalFrame: PROC [name: Rope.ROPE, nToSkip: INT, cc: CompilerContext] RETURNS[TypedCode];
LHSFieldIdentifier: PROC[id: Rope.ROPE, fieldIndirectContext: Type, cc: CompilerContext] RETURNS[TypedCode];
LHSIdentifier: PROC[id: Rope.ROPE, cc: CompilerContext] RETURNS[TypedCode];
LHSDot: PROC[left: ParseTree, id: Rope.ROPE, cc: CompilerContext] RETURNS[TypedCode];
LHSuparrow: PROC[left: ParseTree, cc: CompilerContext] RETURNS[TypedCode];
LHSapply: PROC[left, right: ParseTree, cc: CompilerContext] RETURNS[TypedCode];
END..