<<>> <> <> <> <> DIRECTORY Rope USING [ROPE, Size, Fetch, FromRefText], SpellingCorrection; SpellingCorrectionImpl: CEDAR MONITOR IMPORTS Rope EXPORTS SpellingCorrection = BEGIN ROPE: TYPE = Rope.ROPE; BruteForceCorrection: PUBLIC PROC [word: ROPE, f: PROC [REF TEXT] RETURNS [BOOL], buffer: REF TEXT] RETURNS [corrections: LIST OF ROPE ¬ NIL, newBuffer: REF TEXT] = { <> s: CARDINAL ¬ word.Size[]; w: REF TEXT; c, t: CHAR; Test: PROC [w: REF TEXT] = INLINE { <> IF f[w] THEN corrections ¬ CONS[Rope.FromRefText[w], corrections]; }; IF buffer.maxLength < s+1 THEN buffer ¬ NEW[TEXT[s+1]]; w ¬ buffer; w.length ¬ s; FOR i: CARDINAL IN [0..s) DO w[i] ¬ Rope.Fetch[word, i]; ENDLOOP; <> FOR i: CARDINAL IN [0..s-1) DO t ¬ w[i]; w[i] ¬ w[i+1]; w[i+1] ¬ t; Test[w]; w[i+1] ¬ w[i]; w[i] ¬ t; ENDLOOP; <> c ¬ w[s-1]; w.length ¬ s - 1; FOR i: CARDINAL DECREASING IN [0..s-1) DO Test[w]; t ¬ c; c ¬ w[i]; w[i] ¬ t; ENDLOOP; Test[w]; w.length ¬ s; FOR i: CARDINAL DECREASING IN [0..s-1) DO w[i+1] ¬ w[i]; ENDLOOP; w[0] ¬ c; <> w.length ¬ s + 1; FOR i: CARDINAL DECREASING IN [0..s] DO IF i < s THEN w[i+1] ¬ w[i]; IF i = s THEN c ¬ w[s-1] ELSE c ¬ w[i]; IF c IN ['A..'Z] THEN FOR x: CHAR IN ['A..'Z] DO w[i] ¬ x; Test[w]; ENDLOOP ELSE FOR x: CHAR IN ['a..'z] DO w[i] ¬ x; Test[w]; ENDLOOP; ENDLOOP; FOR i: CARDINAL IN [0..s) DO w[i] ¬ w[i+1]; ENDLOOP; w.length ¬ s; <> FOR i: CARDINAL IN [0..s) DO c ¬ w[i]; IF c IN ['A..'Z] THEN FOR x: CHAR IN ['A..'Z] DO IF x # c THEN { w[i] ¬ x; Test[w]; }; ENDLOOP ELSE FOR x: CHAR IN ['a..'z] DO IF x # c THEN { w[i] ¬ x; Test[w]; }; ENDLOOP; w[i] ¬ c; ENDLOOP; newBuffer ¬ buffer; }; END. CHANGE LOG Created by Nix on October 7, 1983 2:22 pm