DIRECTORY CedarCode USING[Operator, ParseTree, ParseTreeBody], CirioTypes USING[CompilerContext, NameArgPair, Node, Type, TypedCode], Rope USING[ROPE]; CirioSyntacticOperations: CEDAR DEFINITIONS = BEGIN OPEN CedarCode, CirioTypes; 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]; 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]; 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]]; 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..  CirioSyntacticOperations.mesa Copyright Σ 1990, 1992 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 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. Here are the compile functions Here is what the creator of a ParseTree must supply These general syntactic procedures are common to compile time and run time Each procedure corresponds roughly to some syntactic construction Κq–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ Οeœ7™BKšœ%™%K™>—K˜Kšœ(™(Kšœ(™(K˜šΟk ˜ Kšœ žœ%˜4Kšœ žœ6˜FKšœžœžœ˜—K˜šΟnœžœž œ˜-Kšžœžœ˜!K˜šœš™šK˜Kšœ žœ˜&Kšœžœ˜.K˜Kšœ žœ˜+K˜Kš Ÿœžœ žœžœžœžœ ˜[K˜Kš Ÿ œžœžœžœžœ˜>K˜Kšœ™K˜KšŸ œžœ<žœ ˜bK˜KšŸ œžœ'žœ ˜MK˜šŸœžœFžœ ˜wK˜—KšŸœžœNžœ ˜~K˜KšŸ œžœ(žœžœ˜OK˜K˜Kšœ3™3K™šœžœžœ˜"Kš œžœBžœžœžœ ˜qKš œžœ-žœžœžœ ˜\Kš œžœLžœžœžœ ˜†Kš œžœTžœžœžœ ˜Kš œžœ.žœžœžœžœ˜_——˜K˜—KšœJ™JKšœA™A˜KšŸ œžœ;˜L—šžœ ˜K˜KšŸ œžœ3˜C—šžœ ˜K˜KšŸ œžœžœžœ ˜K—šžœ ˜K˜KšŸ œžœ0žœ ˜RK˜KšŸ œžœBžœ ˜eK˜KšŸ œžœ.žœ ˜TK˜KšŸœžœ=žœ ˜hK˜KšŸœžœ.žœ ˜MK˜KšŸœžœ.žœ ˜OK˜KšŸœžœ:žœ ˜[K˜Kš Ÿœžœžœžœ3žœ ˜hK˜Kš Ÿœžœžœžœ5žœ ˜nK˜KšŸœžœ žœ+žœ ˜dK˜KšŸ œžœ žœ)žœ ˜]K˜KšŸœžœ)žœ ˜HK˜KšŸ œžœ5žœ ˜XK˜Kš Ÿœžœ žœ žœžœ ˜]K™K™K™KšŸœžœ žœ3žœ ˜lK˜KšŸ œžœ žœžœ ˜KK˜KšŸœžœžœžœ ˜UK˜KšŸ œžœ'žœ ˜JK˜KšŸœžœ.žœ ˜OK˜K˜—K˜Kšžœ˜——…—dσ