Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://anggtwu.net/LUA/AnyOf1.lua.html -- http://anggtwu.net/LUA/AnyOf1.lua -- (find-angg "LUA/AnyOf1.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun e () (interactive) (find-angg "LUA/AnyOf1.lua")) -- -- Based on: -- (find-angg "LUA/Caepro4.lua" "MkTable") -- (find-angg "LUA/Caepro4.lua" "AnyOf") -- «.MkTable» (to "MkTable") -- «.MkTable-tests» (to "MkTable-tests") -- «.AnyOf» (to "AnyOf") -- «.AnyOf-tests» (to "AnyOf-tests") require "lpeg" -- (find-es "lpeg" "lpeg-quickref") -- (find-es "lpeg" "globals") lpeg = lpeg or require "lpeg" B,C,P,R,S,V = lpeg.B,lpeg.C,lpeg.P,lpeg.R,lpeg.S,lpeg.V Cb,Cc,Cf,Cg = lpeg.Cb,lpeg.Cc,lpeg.Cf,lpeg.Cg Cp,Cs,Ct = lpeg.Cp,lpeg.Cs,lpeg.Ct Carg,Cmt = lpeg.Carg,lpeg.Cmt lpeg.ptmatch = function (pat, str) PP(pat:Ct():match(str)) end lpeg.Copyto = function (pat, tag) return pat:Cg(tag) * Cb(tag) end -- __ __ _ _____ _ _ -- | \/ | | _|_ _|_ _| |__ | | ___ -- | |\/| | |/ / | |/ _` | '_ \| |/ _ \ -- | | | | < | | (_| | |_) | | __/ -- |_| |_|_|\_\ |_|\__,_|_.__/|_|\___| -- -- «MkTable» (to ".MkTable") -- Supersedes: (find-angg "LUA/Caepro4.lua" "MkTable") MkTable = Class { type = "MkTable", from = function (bigstr) return MkTable.from0(bigstr):read() end, from0 = function (bigstr) return MkTable {bigstr=bigstr, _=VTable{}} end, __tostring = function (mkt) return "a MkTable whose bigstr is:\n"..mkt.bigstr end, __index = { pat = "(%S+) +%-> +(%S+)", kvs = function (mkt) return mkt.bigstr:gmatch(mkt.pat) end, read = function (mkt) for k,v in mkt:kvs() do mkt._[k] = v end; return mkt end, v = function (mkt,k) return mkt._[k] end, -- kset = function (mkt) -- keys, as a set local s = Set.new() for k,v in mkt:kvs() do s:add(k) end return s end, ksets = function (mkt) return VTable(mkt:kset():ks()) end, -- sorted ksetr = function (mkt) -- reversed local s,r = mkt:ksets(), VTable{} for i=#s,1,-1 do table.insert(r, s[i]) end return r end, }, } mktable = function (bigstr) return MkTable.from(bigstr)._ end -- «MkTable-tests» (to ".MkTable-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "AnyOf1.lua" bigstr = [[ foobar -> OOBAR (This is a comment) foo -> OO foob -> OOB ]] mkt = MkTable.from0(bigstr); PPPV(mkt) mkt = MkTable.from (bigstr); PPPV(mkt) = mkt._ = mktable(bigstr) = mkt = mkt:v("foo") for k,v in mkt:kvs() do print(k,v) end -- parses bigstr again = mkt:kset() = mkt:ksets() = mkt:ksetr() --]==] -- _ ___ __ -- / \ _ __ _ _ / _ \ / _| -- / _ \ | '_ \| | | | | | | |_ -- / ___ \| | | | |_| | |_| | _| -- /_/ \_\_| |_|\__, |\___/|_| -- |___/ -- -- «AnyOf» (to ".AnyOf") -- Supersedes: -- (find-angg "LUA/Caepro4.lua" "AnyOf") -- This class implements a version of this basic "anyof", -- (find-angg "LUA/Gram2.lua" "anyof") -- that uses a MkTable to translate the matched string. -- Idea: -- ms is the matched string, -- tms is the translated version of the matched string, -- mtag says where to store the matched string, -- tmtag says where to store the translated matched string AnyOf = Class { type = "AnyOf", from = function (bigstr, mtag, tmtag, default) local mkt = MkTable.from(bigstr) return AnyOf {mkt=mkt, mtag=mtag, tmtag=tmtag, default=default} end, __tostring = function (anyo) return "An AnyOf with this bigstr:\n"..anyo.mkt.bigstr end, __index = { kvs = function (anyo) return anyo.mkt:kvs() end, v = function (anyo, k) return anyo.mkt:v(k) end, ksetr = function (anyo) return anyo.mkt:ksetr() end, pat = function (anyo) local p = P(false) local r = anyo:ksetr() -- for k,v in anyo:kvs() do p = p + Cs(k) end for i,k in ipairs(r) do p = p + Cs(k) end if anyo.default then p = p + Cc(anyo.default) end -- if anyo.tag then p = p:Cg(anyo.tag) * Cb(anyo.tag) end if anyo.mtag then p = p:Copyto(anyo.mtag) end if anyo.tmtag then p = p * (Cb(anyo.mtag) / anyo.mkt._):Cg(anyo.tmtag) end return p end, }, } -- «AnyOf-tests» (to ".AnyOf-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "AnyOf1.lua" bigstr = [[ aa -> AA a -> A aaa -> AAA ]] ao = AnyOf.from(bigstr, "MTAG", "TMTAG") = ao = ao.mkt = ao.mkt:ksetr() PPPV(ao) s = Cs"_" p = ao:pat() (s * p * s):ptmatch("_a_") (s * p * s):ptmatch("_aa_") (s * p * s):ptmatch("_aaa_") (s * p * s):ptmatch("__") (s * p * s):ptmatch("_d_") --]==] -- Local Variables: -- coding: utf-8-unix -- End: