<> <> DIRECTORY Rope, IO, Convert, AlgebraClasses, Variables, Ints, Sequences, VariableSequences; VariableSequencesImpl: CEDAR PROGRAM IMPORTS Rope, Convert, AlgebraClasses, Variables, Sequences EXPORTS VariableSequences = BEGIN OPEN AC: AlgebraClasses, VARS: Variables, SEQ: Sequences, VariableSequences; <> ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; Object: TYPE = AC.Object; Method: TYPE = AC.Method; TypeError: PUBLIC ERROR [message: ATOM _ $Unspecified] = CODE; <> VariableSequences: PUBLIC AC.Object _ SEQ.MakeSequenceStructure[VARS.Variables]; <> VariableFirstChar: PUBLIC PROC [char: CHAR, V: VariableSequence] RETURNS [BOOL] ~ { vData: SEQ.SequenceData _ NARROW[V.data]; FOR i:NAT IN [1..vData.lengthPlus1) DO IF Rope.Equal[ Convert.RopeFromChar[from: char, quote: FALSE], Rope.Substr[VARS.ToRope[vData[i] ], 0, 1] ] THEN RETURN[TRUE]; ENDLOOP; RETURN[FALSE]; }; <> <> <<>> MergeVariableSequences: PUBLIC AC.BinaryOp ~ { <> firstSeqData: SEQ.SequenceData _ NARROW[firstArg.data]; secondSeqData: SEQ.SequenceData _ NARROW[secondArg.data]; firstStructureData: SEQ.SequenceStructureData _ NARROW[firstArg.class.data]; secondStructureData: SEQ.SequenceStructureData _ NARROW[firstArg.class.data]; firstElementStructure: Object _ firstStructureData.elementStructure; secondElementStructure: Object _ firstStructureData.elementStructure; intIndex: Ints.Int; lowVars, lowVarsPointer: LIST OF VARS.Variable; lowVarSeq: VariableSequence _ NIL; IF NOT AC.StructureEqual[firstElementStructure, secondElementStructure] THEN TypeError[]; FOR i:INT IN [1..firstSeqData.lengthPlus1) DO intIndex _ SEQ.Find[secondArg, firstSeqData[i] ]; IF intIndex=NIL THEN { IF lowVars # NIL THEN lowVarsPointer _ lowVarsPointer.rest _ LIST[firstSeqData[i] ] ELSE lowVars _ lowVarsPointer _ LIST[firstSeqData[i] ]; }; ENDLOOP; IF lowVars # NIL THEN lowVarSeq _ SEQ.MakeSequence[lowVars, VariableSequences]; RETURN[SEQ.Concatenate[lowVarSeq, secondArg] ]; }; NewMainVariable: PUBLIC AC.BinaryOp ~ { <> pos: Ints.Int _ SEQ.Find[firstArg, secondArg]; delSeq: Object; IF pos#NIL THEN delSeq _ SEQ.Delete[firstArg, pos] ELSE delSeq _ firstArg; RETURN[ SEQ.Append[delSeq, secondArg] ]; }; <> <> <> <> <> <> <> END.