-- ParserGraphs.mesa -- last edit November 1, 1984 3:41:32 pm PST -- Sturgis, April 1, 1986 2:17:06 pm PST DIRECTORY GrammarBasic USING[Grammar, Symbol]; ParserGraphs: CEDAR DEFINITIONS = BEGIN OPEN GrammarBasic; -- These graphs are used to represent LR(0) canonical parsers, LALR(1) parsers, LR(1) canonical parsers, and my split node parsers. -- a graph is a collection of nodes and arcs Graph: TYPE = REF GraphBody; GraphBody: TYPE; Node: TYPE = REF NodeBody; NodeBody: TYPE; GraphClass: TYPE = {LR0, LALR1, SplitNode}; -- operations on graphs as a whole CreateEmptyGraph: PROC[Grammar, GraphClass] RETURNS[Graph]; GetGraphStats: PROC[Graph] RETURNS[nNodes, nArcs, nNodesMarkedToSplit: INT]; GetClass: PROC[Graph] RETURNS[GraphClass]; GetGrammar: PROC[Graph] RETURNS[Grammar]; GetStartNode: PROC[Graph] RETURNS[Node]; GetAnyStage1Node: PROC[Graph] RETURNS[Node]; GetAnyDirtyNode: PROC[Graph] RETURNS[Node]; GenerateAllNodes: PROC[Graph, PROC[Node] RETURNS[--continue--BOOLEAN]]; ClearAllUpperNodePointers: PROC[Graph]; IndexTheNodes: PROC[Graph]; -- can only be done once CleanTheGraph: PROCEDURE[graph: Graph] RETURNS[Graph]; -- so that it can be garbage collected (returns NIL) -- operations on nodes CreateTentativeStage1Node: PROC[g: Graph, s: REF ANY, base: Node] RETURNS[Node]; InstallStage1Node: PROC[n: Node, startNode: BOOLEAN]; SetUpperNode: PROC[n: Node, upper: Node]; SetRingNumber: PROC[n: Node, ring: CARDINAL]; AppendAnArc: PROC[source: Node, s: Symbol, target: Node]; ResetArcTarget: PROC[source: Node, s: Symbol, newTarget: Node]; SetAssociatedSet: PROC[Node, --new value-- REF ANY, --old value-- REF ANY]; -- S MarkAsStage2: PROC[Node]; MarkNodeDirty: PROC[Node]; MarkNodeToSplit: PROC[Node]; GetGraph: PROC[Node] RETURNS[Graph]; GenerateArcs: PROC[Node, PROC[Symbol, Node] RETURNS[--continue-- BOOLEAN]]; FollowSymbol: PROC[Node, Symbol] RETURNS[Node]; GetAssociatedSet: PROC[Node] RETURNS[REF ANY]; -- S GetBaseNode: PROC[Node] RETURNS[Node]; -- upsilon GetUpperNode: PROC[Node] RETURNS[Node]; -- psi GetRingNumber: PROC[Node] RETURNS[CARDINAL]; GetSplittingMark: PROC[Node] RETURNS[BOOLEAN]; NarrowNode: PROC[REF ANY] RETURNS[Node]; GetNodeIndex: PROC[Node] RETURNS[CARDINAL]; END.. Ê\˜J˜J˜0J˜(J˜˜ Jšœ$˜$—J˜J˜J˜"˜Jšœ˜J˜J˜ƒJ˜J˜,J˜J˜J˜J˜J˜J˜J˜J˜+J˜J˜J˜"˜J˜;J˜J˜LJ˜J˜J˜*J˜J˜)J˜J˜(J˜J˜,J˜J˜+J˜J˜GJ˜J˜'J˜J˜4J˜J˜kJ˜—J˜J˜˜J˜J˜QJ˜J˜5J˜J˜)J˜J˜-J˜J˜9J˜J˜?J˜J˜PJ˜J˜J˜J˜J˜J˜J˜J˜J˜J˜J˜J˜$J˜J˜KJ˜J˜/J˜J˜3J˜J˜1J˜Ipsi˜.K˜K˜,K˜K˜.K˜K˜(K˜K˜+—J˜J˜J˜J˜—J˜—…—Þ @