DIRECTORY CCTypes USING[CCError], CedarParseSupport USING[], IO USING[STREAM], PPP1 USING[Parse], PPTree USING[Link, Node, NodeName, Null], PPTreeOps USING[Finalize, Initialize, PopTree], Rope USING[Cat, ROPE]; CedarParseSupportImpl: CEDAR MONITOR IMPORTS CCTypes, PPP1, PPTreeOps, Rope EXPORTS CedarParseSupport = BEGIN Tree: TYPE = PPTree.Link; ParseCedarExpression: PUBLIC PROC[expr: Rope.ROPE, errout: IO.STREAM _ NIL] RETURNS[Tree] = BEGIN progTree: PPTree.Link; assignment: PPTree.Link; progTree _ Parse[Rope.Cat["Expr: PROGRAM = { x _ ", expr, "\n}."], errout]; IF progTree = NIL THEN CCTypes.CCError[syntax, NIL]; assignment _ GetFirstAssign[progTree]; IF assignment = NIL THEN CCTypes.CCError[syntax, NIL]; WITH assignment SELECT FROM node: REF PPTree.Node => BEGIN kind: PPTree.NodeName _ node.name; nsons: CARDINAL = node.sonLimit - 1; IF kind # assign THEN CCTypes.CCError[syntax, NIL]; RETURN [node[2]]; END; ENDCASE => CCTypes.CCError[syntax, NIL]; END; Parse: ENTRY PROC [program: Rope.ROPE, errout: IO.STREAM] RETURNS [root: Tree _ NIL] = TRUSTED { ENABLE UNWIND => NULL; complete: BOOL; nErrors: CARDINAL; PPTreeOps.Initialize[]; [complete, , nErrors] _ PPP1.Parse[program, errout]; root _ IF complete AND nErrors = 0 THEN PPTreeOps.PopTree[] ELSE PPTree.Null; PPTreeOps.Finalize[]; }; GetFirstAssign: PROC [tree: Tree] RETURNS [Tree] = { WITH tree SELECT FROM node: REF PPTree.Node => { kind: PPTree.NodeName _ node.name; nsons: CARDINAL = node.sonLimit - 1; IF kind = assign THEN RETURN [node]; FOR i: CARDINAL IN [1..nsons] DO nt: Tree _ GetFirstAssign[node[i]]; IF nt # NIL THEN RETURN [nt] ENDLOOP} ENDCASE; RETURN [NIL] }; END..  CedarParseSupportImpl.mesa Sturgis, August 12, 1989 10:46:37 am PDT Cedar parsing support These two procedures came from InterpImpl.mesa (existing Cirio code for local d-machine world). following code copied from InterpreterImpl (via InterpImpl.mesa) NOTE: this is an ENTRY procedure to avoid scrambling the poor parser's tiny brains when multiple processes try to interpret at the same time. Don't try to get rid of this protection! returns first assignment in the tree (where "first" is first in the preorder traversal) Ęň•NewlineDelimiter ™Jšœ™Jšœ%Ďk™(J˜š ˜ Jšœ˜Jšœ˜J˜J˜Jšœ)˜)J˜/Jšœ˜J˜—š œœœœ œ˜gJš˜J˜J™J™J™™Jšœ_™_J™Jšœœ˜J˜šĎnœ œ œ œœœœ˜[Jš˜J˜J˜J˜J˜KJšœ œœœ˜4J˜J˜&Jšœœœœ˜6J˜šœ œœ˜šœœ˜Jš˜J˜#Jšœœ˜%Jšœœœ˜3Jšœ ˜Jšœ˜—Jšœœ˜(J˜—Jšœ˜—J˜Jšœ@™@˜š žœœœœ œœ˜9Jšœœœ˜&—Jšœ œĄ™ˇJšœœœ˜Jšœ œ˜Jšœ œ˜J˜Jšœœ˜4Jš œœ œ œœ ˜MJ˜J˜J˜šžœœœ ˜4JšœW™Wšœœœ˜šœœ˜J˜#Jšœœ˜%Jšœœœ ˜%šœœœ œ˜!J˜#Jšœœœœ˜Jšœ˜——Jšœ˜ —Jšœœ˜ J˜——J™—J™J™J˜J˜J™Jšœ˜——…—Ž š