Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
-- This file:
-- http://angg.twu.net/LUA/precedenceparser.lua
-- http://angg.twu.net/LUA/precedenceparser.lua.html
--  (find-angg        "LUA/precedenceparser.lua")
--
-- (find-lua51manualw3m "")
-- (find-books "__comp/__comp.el" "ierusalimschy")
-- (find-pil2page 8 "Contents")
-- (find-pil2text 8 "Contents")

userocks()
require "re"

Expr = Class {
  type    = "Expr",
  __tostring = function (e) return mapconcat(tostring, e, " ") end,
  __index = {
  },
}

Aop = Class {
  type    = "Aop",
  __tostring = function (op) return op[4] end,
  __index = {
    reduce = function (op, stack)
        local aop, e = stack[#stack-1], stack[#stack]
        local newe = Expr {e, aop}
        stack[#stack-1], stack[#stack] = newe, nil
      end,
    push = function (op, stack)
        table.insert(stack, op)
      end,
  },
}
Bop = Class {
  type    = "Bop",
  __tostring = function (op) return op[4] end,
  __index = {
    reduce = function (op, stack)
        local e1, bop, e2 = stack[#stack-2], stack[#stack-1], stack[#stack]
        local newe = Expr {e1, e2, bop}
        stack[#stack-2], stack[#stack-1], stack[#stack] = newe, nil
      end,
    push = function (op, stack)
        while #stack > 1 and stack[#stack-1][3] > op[1] do
          stack[#stack-1]:reduce(stack)
        end
        table.insert(stack, op)
      end,
  },
}
Cop = Class {
  type    = "Cop",
  __tostring = function (op) return op[4] end,
  __index = {
    reduce = function (op, stack)
        local e, cop = stack[#stack-1], stack[#stack]
        local newe = Expr {e, cop}
        stack[#stack-1], stack[#stack] = newe, nil
      end,
    push = function (op, stack)
        while #stack > 1 and stack[#stack-1][3] > op[1] do
          stack[#stack-1]:reduce(stack)
        end
        table.insert(stack, op)
        stack[#stack]:reduce(stack)
      end,
  },
}

aops = {}  -- prefix operators
bops = {}  -- binary operators
bops = {}  -- postfix operators
newop = function (str)
    local l,op,r,forth = unpack(split(str))
    l = tonumber(l)
    r = tonumber(r)
    forth = forth or op
    if not l and     r then aops[op] = Aop {l,op,r,forth} end
    if     l and     r then bops[op] = Bop {l,op,r,forth} end
    if     l and not r then cops[op] = Cop {l,op,r,forth} end
    -- print(l,op,r,forth)
  end

newop "10 + 11"
newop "10 - 11"
newop "20 * 21"
newop "20 / 21"
newop "30 ^ 31"
newop " . - 15 u-"

Stack = Class {
  type    = "Stack",
  __tostring = function (s) return mapconcat(tostring, s, "\n") end,
  __index = {
  },
}

stk = {}
stk = Stack {}
pa = function (op) aops[op]:push(stk) end
pb = function (op) bops[op]:push(stk) end
pc = function (op) cops[op]:push(stk) end
pn = function (n) table.insert(stk, n) end

--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "precedenceparser.lua"
PP(bops)
= bops["+"]

stk = {}
stk = Stack {}
pn(2)
pb"*"
pn(3)
pb"+"
pn(4)
pb"*"
pn(5)
= stk

while #stk > 1 do stk[#stk-1]:reduce(stk) end
= stk




--]]


-- Local Variables:
-- coding: raw-text-unix
-- End: