Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://angg.twu.net/LUA/Arith5.lua.html
--   http://angg.twu.net/LUA/Arith5.lua
--           (find-angg "LUA/Arith5.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e4 () (interactive) (find-angg "LUA/Arith4.lua"))
-- (defun e  () (interactive) (find-angg "LUA/Arith5.lua"))
-- (find-es "lpeg" "lpeg-quickref")
-- (find-es "lpeg" "globals")

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_methods = getmetatable(P("")).__index

s = S(" \t\n")^0

AssocOp = Class {
  type  = "AssocOp",
  from  = function (opsstr, name)
      local a = AssocOp {opsstr=opsstr, name=name}
      return a:prep()
    end,
  __index = {
    prep = function (a)
        local opslist = split(a.opsstr)
        local op = P(opslist[1])
        for i=2,#opslist do op = op + P(opslist[i]) end
        local ops = C(op)*s
        a.ops = ops
        return a
      end,
    eoes = function (a, e)
        local f = function (...)
            local A = {...}
            if #A == 1 then return A[1] end
            A.name = a.name
            return HTable(A)
          end
        return (e * (a.ops * e)^0) / f
      end,
  },
}

lpeg_methods.inassoc = function (exprpat, oppat)
    return oppat:eoes(exprpat)
  end

num  = R("09")^1
nums = C(num)*s
assocop_mul = AssocOp.from("* /", "mul")
assocop_add = AssocOp.from("+ -", "add")
expr_mul = assocop_mul:eoes(nums)
expr_add = assocop_add:eoes(expr_mul)



--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Arith5.lua"

= expr_add:match("1 * 2 / 3 + 4 * 5 * 6 + 7")
= expr_add:match("1 * 2 / 3 + 4 * 5 * 6 + 7")

expr_pat = nums:
  inassoc(assocop_mul):
  inassoc(assocop_add)

= expr_pat:match("1 * 2 / 3 + 4 * 5 * 6 + 7")


--]]








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