|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LUA/PrecParser1.lua.html
-- http://angg.twu.net/LUA/PrecParser1.lua
-- (find-angg "LUA/PrecParser1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun p () (interactive) (find-angg "LUA/PrecParser1.lua"))
-- (defun o () (interactive) (find-angg "LUA/Parenthesize2.lua"))
-- (defun oo () (interactive) (find-angg "LUA/Parenthesize1.lua"))
-- (defun s () (interactive) (find-angg "LUA/Stack1.lua"))
require "Parenthesize2" -- (find-angg "LUA/Parenthesize2.lua")
require "Stack1" -- (find-angg "LUA/Stack1.lua")
numberify = function (str) return str:match("^[0-9]+$") and str+0 or str end
PrecParse = Class {
type = "PrecParse",
new = function () return PrecParse {} end,
__tostring = function (pp) return tostring(trees(unpack(pp))) end,
-- See: (find-es "lua5" "methodsover")
__index = methodsover(Stack.__index) {
-- See: (find-angg "LUA/Stack1.lua")
halfpre = function (pp) local op = pp:pop(); return pp:push(pre(op,"?")) end,
halfbin = function (pp) local a,op = pp:pop2(); return pp:push(bin(a,op,"?")) end,
closepre = function (pp) local a,b = pp:pop2(); return pp:push(pre(a[0],b)) end,
closebin = function (pp) local a,b = pp:pop2(); return pp:push(bin(a[1], a[0], b)) end,
closepost = function (pp) local a,op = pp:pop2(); return pp:push(post(a,op)) end,
--
orbp1 = function (pp) return opi:orbp(pp:pick(1)) end, -- use the global opi
reducep = function (pp, lbp) return #pp>=2 and pp:orbp1()>lbp end,
reduce1 = function (pp)
if opi:oprefix(pp:pick(1)) then return pp:closepre() end
if opi:oinfix (pp:pick(1)) then return pp:closebin() end
error("bad reduce")
end,
reduceforlbp = function (pp, lbp)
while pp:reducep(lbp) do pp:reduce1() end
return pp
end,
reduceforop = function (pp, op) return pp:reduceforlbp(opi:oplbp(op)) end,
reduceall = function (pp, op) return pp:reduceforlbp(0) end,
--
half = function (pp)
if opi:opinfix (pp:pick(0)) then return pp:halfbin() end
if opi:opprefix(pp:pick(0)) then return pp:halfpre() end
error("bad half")
end,
--
pushx = function (pp, x)
if opi:opinfix (x) then return pp:reduceforop(x):push(x):half()
elseif opi:opprefix (x) then return pp :push(x):half()
elseif opi:oppostfix(x) then return pp:reduceforop(x):push(x):closepost()
else return pp:push(x)
end
end,
pushxs = function (pp, str)
for i,x in ipairs(split(str)) do pp:pushx(numberify(x))
end
return pp
end,
},
}
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "PrecParser1.lua"
s = PrecParse.new()
= s:pushs (2, "*")
= s:halfbin ()
= s:pushs ("u-")
= s:halfpre ()
= s:pushs (3)
= s:closepre ()
= s:closebin ()
= s:pushs ("!")
= s:closepost()
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "PrecParser1.lua"
s = PrecParse.new()
= opi:opinfo("+")
= opi:oplbp("+")
= opi:oprbp("+")
= opi:oplbp("!")
= opi:oprbp("!")
= opi:oplbp("u-")
= opi:oprbp("u-")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "PrecParser1.lua"
s = PrecParse.new()
= s:pushs(1)
= s:pushs("+"):halfbin()
= s:pushs(2)
= s:pushs("+"):halfbin()
= s:pushs(3)
= s:pushs("^"):halfbin()
= s:pushs(4)
= s:pushs("^"):halfbin()
= s:pushs(5)
= s:pushs("^"):halfbin()
= s:pushs(6)
= s:reduceforop("*")
= s:reduceall()
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "PrecParser1.lua"
s = PrecParse.new()
= s:pushx(2)
= s:pushx("*")
= s:pushx(3)
= s:pushx("+")
= s:pushx("u-")
= s:pushx(4)
= s:pushx("!")
= s:pushx("^")
= s:pushx(5)
= s:pushx("+")
s = PrecParse.new()
= s:pushxs("2 * 3 + u- 4 ! ^ 5 +")
= s:pushxs("6 + 7")
= s:reduceall()
= s[1]
= opi:text(s[1])
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: