Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/Gram4.lua.html
--   http://anggtwu.net/LUA/Gram4.lua
--          (find-angg "LUA/Gram4.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- This is a miniature of:
--   (find-angg "LUA/ELpeg1.lua")
--
-- (defun e () (interactive) (find-angg "LUA/Gram4.lua"))
-- See: (find-angg "LUA/LpegRex3.lua" "LpegRex")
--      (find-angg "LUA/Re2.lua" "Re")

-- «.Gram»		(to "Gram")
-- «.Gram-tests»	(to "Gram-tests")



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

Gram = Class {
  type       = "Gram",
  new        = function ()  return Gram{}:setentries():withV() end,
  __tostring = function (gr) return gr:tostring() end,
  __index = {
    tostring = function (gr, sep)
        local ks = sorted(keys(gr.entries))
        return mapconcat(mytostring, ks, sep or "\n")
      end,
    setentries = function (gr,e) gr.entries=(e or VTable{}); return gr end,
    withV = function (gr)
      local V,V_mt = {}, {
        __call     = function (v,key) return lpeg.V(key) end,
        __index    = function (v,key) return lpeg.V(key) end,
        __newindex = function (v,key,val) gr.entries[key] = val end,
      }
      setmetatable(V, V_mt)
      return gr,V
    end,
    compile = function (gr, top)
        local entries = copy(gr.entries)
        entries[1] = top
        return lpeg.P(entries)
      end,
    cm = function (gr, top, subj, pos)    -- compile and match
        if type(pos) == "string" then pos = subj:match(pos) end
        return gr:compile(top):match(subj, pos)
      end,
    cmp = function (gr, top, subj, pos)   -- compile, match, pretty-print
        return PP(gr:cm(top, subj, pos))
      end,
  }
}

-- «Gram-tests»  (to ".Gram-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile  "Gram4.lua"

-- (find-angg "LUA/ELpeg1.lua" "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

require "Fold1"    -- (find-angg "LUA/Fold1.lua")
f = function (a,op,b) return format("(%s%s%s)", a, op, b) end
g = function (...)    return Fold{A={...}}:l2(f) end
= g(1)
= g(1,2,3,4,5,6,7)

gr,V = Gram.new()
_    = S" \t\n"^0
V.N  = C(R"09"^1)
V.E  = V.N
V.M  = V.E * (_ * C(S"*/") *_* V.E)^0 / g
V.A  = V.M * (_ * C(S"+-") *_* V.M)^0 / g

= gr:cmp("M", "1*2 + 3/4")
= gr:cmp("A", "1*2 + 3/4")
= gr:cmp("A", "1*2 + 3/(4-5+6)")  -- bad

V.E  = V.N + "("*_*V.A*_*")"

= gr:cmp("A", "1*2 + 3/(4-5+6)")  -- good
= gr
= gr:tostring()
= gr:tostring(" ")

--]==]







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