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 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 ΚT•NewlineDelimiter ™codešœ™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Π