Warning: this is an htmlized version!
The original is across this link,
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

--]]