Good afternoon Steve, Than you for this. i have a copy of the UniLib and I'll track down this in it.
regards Bruce Rennie On 27/05/15 13:28, Steve Wampler wrote: > On 05/26/2015 04:27 PM, Jeffery, Clint ([email protected]) wrote: > > Regarding balancing multi-character strings, I hope someone finds a > procedure you can use. You might also try the > Icon mailing list. Ralph Griswold was fond of writing replacements for > built-ins in Icon, so a version of bal() written > in Icon may very well be floating around. > > I have the following in the UniLib package I wrote a while back, > but it relies on other parts of the UniLib package (specifically > the FindFirst class), so it'll take some adaptation to use without > UniLib. Also not the last sentence of the intro comment... > > ------------------------------------------------------- > #<p> > # Match strings the same way bal() matches characters. > # The input table is a tagged set of strings to match. The key is > # the <I>start</I> string while the value is the <I>end</I> string. > # This makes sure the start and stop strings are balanced w.r.t > # each other. > # <[param keyStrings table of start->stop pairs]> > # <[generates matching substrings]> > #</p> > #<p> > # For example, given the table: > #<pre> > # > # t := table() > # t["begin"] := "end" > # > #</pre> > # then the code: > #<pre> > # > # if match("begin") then > # clause := sbal(t) > # > #</pre> > # assigns to <tt>clause</tt> the substring from <tt>begin</tt> through > # the matching <tt>end</tt>. (Assuming, of course, that there are no > # conflicts along the way...) > #</p> > #<p> > # <b>This is an unoptimized preliminary version that may contain bugs.</b> > #</p> > procedure sbal(keyStrings) > local startStrings, stopStrings, allStrings, w, ff, bCount > > every insert(startStrings := set(), key(keyStrings)) > every insert(stopStrings := set(), !keyStrings) > every put(allStrings := [], !(startStrings|stopStrings)) > > ff := FindFirst(allStrings) > inside := 0 > > while tab(ff.locate()) do { > p1 := &pos > w := ff.moveMatch() > if member(startStrings, w) then { > if (inside +:= 1) = 1 then sPos := p1 > } > else if member(stopStrings, w) then { > if (inside -:= 1) = 0 then { > suspend .&subject[sPos:&pos] > } > } > if inside < 0 then fail > } > > end > ------------------------------------------------------- ------------------------------------------------------------------------------ _______________________________________________ Unicon-group mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/unicon-group
