|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://anggtwu.net/LUA/Pratt2.lua.html
-- http://anggtwu.net/LUA/Pratt2.lua
-- (find-angg "LUA/Pratt2.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun p2 () (interactive) (find-angg "LUA/Pratt2.lua"))
-- (defun e1 () (interactive) (find-angg "LUA/ELpeg1.lua"))
-- (find-angg "LUA/ELpeg1.lua")
-- (find-angg "LUA/Tree1.lua")
-- (find-es "pratt")
require "ELpeg1" -- (find-angg "LUA/ELpeg1.lua")
ptable = VTable {
["num"] = HTable {lbp="err", rbp="err"},
["end"] = HTable {lbp=0, rbp="err"},
["+"] = HTable {lbp=10, rbp=10},
["*"] = HTable {lbp=20, rbp=20},
["^"] = HTable {lbp=30, rbp=30},
}
mkbin = function (a, op, b) return AST {[0]=op, a, b} end
GetTokens = Class {
type = "GetTokens",
from = function (str)
local isnum = function (s) return s:match("^[0-9]+$") end
local f = function (s) return isnum(s) and s+0 or s end
return GetTokens {pos=1, unpack(map(f, split(str)))}
end,
__tostring = function (gt)
local f = function (i) return format(" %d:%s", i, mytostring(gt[i])) end
return format("pos=%d %s", gt.pos, mapconcat(f, seq(1,#gt)))
end,
__index = {
raw = function (gt) return gt[gt.pos] end,
here = function (gt) return type(gt:raw())=="number" and "num" or gt:raw() end,
pt = function (gt) return ptable[gt:here()] end,
lbp = function (gt) return gt:pt().lbp end,
--
accept_1 = function (gt) local tk=gt:raw(); gt.pos=gt.pos+1; return tk end,
accept_opb = function (gt,rbp) return gt:accept_1(), gt:accept_b(rbp) end,
accept_b = function (gt,rbp) return gt:accept_1() end, -- stub
accept_a = function (gt,rbp) return gt:add_opbs(rbp, gt:accept_1()) end,
--
add_opb = function (gt,rbp,a)
local op,b = gt:accept_opb(rbp)
return mkbin(a,op,b)
end,
add_opbs = function (gt,rbp,a)
while gt:lbp() > rbp do
a = gt:add_opb(rbp,a)
end
return a
end,
},
}
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pratt2.lua"
= ptable
tks = GetTokens.from(" 2 * 3 + 4 ^ 5 end ")
= tks
= tks:raw()
= tks:here()
= tks:pt()
tks.pos = tks.pos + 1
= tks:raw()
tks = GetTokens.from(" 200 * 300 + 400 ^ 500 end ")
= tks:accept_a()
a0 = tks:accept_1()
a0 = tks:add_opbs(0, a0)
= a0
= a0
= tks
= tks:lbp()
a0 = tks:add_opb(0, a0)
= tks
= tks:lbp()
a0 = tks:add_opb(0, a0)
= tks:lbp()
a0 = tks:add_opb(0, a0)
= tks:lbp()
a0 = tks:add_opbs(0, a0)
= a0
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: