Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/Pratt1.lua.html
--   http://anggtwu.net/LUA/Pratt1.lua
--          (find-angg "LUA/Pratt1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- Some of the classes here will be useful for writing Pratt parsers
-- someday, but right now this one processes, and produces, underbrace
-- diagrams...
--
-- Used by:
--   (find-angg "LUA/Und2D1.lua")
--
-- (defun e () (interactive) (find-angg "LUA/Pratt1.lua"))

-- «.Range»		(to "Range")
-- «.Range-tests»	(to "Range-tests")
-- «.Ranges»		(to "Ranges")
-- «.Ranges-tests»	(to "Ranges-tests")


--  ____                        
-- |  _ \ __ _ _ __   __ _  ___ 
-- | |_) / _` | '_ \ / _` |/ _ \
-- |  _ < (_| | | | | (_| |  __/
-- |_| \_\__,_|_| |_|\__, |\___|
--                   |___/      
--
-- «Range»  (to ".Range")

Range = Class {
  type    = "Range",
  __tostring = function (r)
      local c = r.rs and "_" or ""
      if r.a == r.b then return format("%d", r.a)..c end
      return format("%d-%d", r.a, r.b)..c
    end,
  __index = {
  },
}

-- «Range-tests»  (to ".Range-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pratt1.lua"
= Range {a=2,b=3}
= Range {a=20,b=20}

--]]


--  ____                             
-- |  _ \ __ _ _ __   __ _  ___  ___ 
-- | |_) / _` | '_ \ / _` |/ _ \/ __|
-- |  _ < (_| | | | | (_| |  __/\__ \
-- |_| \_\__,_|_| |_|\__, |\___||___/
--                   |___/           
--
-- «Ranges»  (to ".Ranges")

Ranges = Class {
  type    = "Ranges",
  __tostring = function (rs) return rs:tostring() end,
  __index = {
    tostring = function (rs, verbose)
        local f  = function (i) return tostring(rs[i]) end
        local fv = function (i) return i..":"..tostring(rs[i]) end
        if verbose then f = fv end
        return mapconcat(f, seq(1,#rs), " ")
      end,
    abtoij = function (rs, a, b)
        local i = 1
        while i<#rs and rs[i].b<a do i = i+1 end
        local j = i
        while j<#rs and rs[j].b<b do j = j+1 end
        return i,j
      end,
    packij = function (rs, i, j, verbose)
        local newrs = Ranges {}
        local newr  = Range  {a=rs[i].a, b=rs[j].b, rs=newrs}
        for k=i,j do table.insert(newrs, rs[k]) end
        -- if verbose then print(newr) end
        -- if verbose then print(newrs) end
        for k=i,j do table.remove(rs, i) end
        if verbose then print(rs) end
        table.insert(rs, i, newr)
        if verbose then print(rs) end
        return rs
      end,
  },
}

-- «Ranges-tests»  (to ".Ranges-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pratt1.lua"
rs = Ranges {
  Range {a=1,  b=9},
  Range {a=10, b=19},
  Range {a=20, b=29},
  Range {a=30, b=39},
  Range {a=40, b=49},
  Range {a=50, b=59},
}
= rs
= rs:tostring("v")
= rs:abtoij(25,45)
= rs:abtoij(20,40)
= rs:abtoij(29,49)
= rs:abtoij(30,49)
= rs:abtoij(30,50)

= rs:packij(2, 4)
= rs[2]
= rs[2].rs
= PP(rs[3])


--]]







-- Local Variables:
-- coding:  utf-8-unix
-- End: