|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- -*- coding: raw-text-unix -*-
-- preproc.lua - a non-intrusive generic preprocessor
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2008sep26
-- (find-es "lua5" "preproc")
loadlpeg() -- (find-angg "LUA/lua50init.lua" "loadlpeg")
cmdA = {} -- one entry for each command (arg parser)
cmdC = {} -- one entry for each command (body)
cmdname = "" -- accumulator variable
cmdargs = {} -- accumulator variable
cmdsetname = function (s, p, name)
if cmdA[name] then cmdname = name; return true end
end
cmdsetargs = function (s, p, ...)
cmdargs = pack(...)
return true
end
cmddef = function (name, ArgPat, f)
cmdA[name] = ArgPat:Cmt(cmdsetargs)
cmdC[name] = f
end
CmdName = (lpeg.R"AZ" ^1):Cmt(cmdsetname)
CmdArgs = lpeg.P(function (s, p) return cmdA[cmdname]:match(s, p) end)
CmdNoArgs = lpeg.P(function (s, p) error("No args for "..cmdname) end)
CmdRun = lpeg.P(function (s, p) return p, cmdC[cmdname](unpack(cmdargs)) end)
Cmd = lpeg.P"\\" * CmdName * (CmdArgs + CmdNoArgs) * CmdRun
-- (find-angg "LUA/lua50init.lua" "lpeg_togsub")
-- (find-angg "LUA/lua50init.lua" "lpeg_gsub_")
CmdGsub = Cmd:togsub():Ct()
preproc = function (str) return CmdGsub:gsub_(str) end
-- The only "exports" from the code above
-- are cmddef and preproc.
-- Useful.
-- (find-angg "LUA/lua50init.lua" "lpeg_balanced")
Curly = lpeg.Balanced("{", nil, "}")
Space = lpeg.S" \t\n"
SCurly = Space^0 * Curly
Curly00 = lpeg.P ""
Curly0 = Space^0
Curly1 = SCurly
Curly2 = SCurly * SCurly
Curly3 = SCurly * SCurly * SCurly
--[[
-- A demo:
-- (find-es "lua5" "preproc")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
ee_dofile "~/LUA/preproc.lua" -- (find-angg "LUA/preproc.lua")
F = function (fmt) return function (...) return format(fmt, ...) end end
cmddef("ONE", Curly1, F"(one: %s)")
cmddef("TWO", Curly2, F"(two: %s %s)")
cmddef("THREE", Curly3, F"(three: %s %s %s)")
= preproc "\\ONE{foo}{bar}_\\TWO{plic}{ploc}{woo} bleh"
--> "(one: foo){bar}_(two: plic ploc){woo} bleh"
= preproc "\\ONE{foo}{bar}_\\TWO{plic} no second arg"
--> error: No args for TWO
--]]