|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LUA/Lpeg2.lua.html
-- http://angg.twu.net/LUA/Lpeg2.lua
-- (find-angg "LUA/Lpeg2.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/Lpeg2.lua"))
-- «.download» (to "download")
-- «.tests» (to "tests")
-- «download» (to ".download")
--[[
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
rm -v ~/LUA/lua50init.lua
mkdir -p ~/LUA/
cd ~/LUA/
wget http://angg.twu.net/LUA/lua50init.lua
# (setenv "LUA_INIT" (concat "@" (ee-expand "~/LUA/lua50init.lua")))
rm -Rv /tmp/parser/
mkdir /tmp/parser/
cd /tmp/parser/
wget http://angg.twu.net/LUA/Lpeg2.lua
# (find-anchor "/tmp/parser/Lpeg2.lua")
--]]
lpeg = require("lpeg")
-- (find-es "lpeg" "globals")
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
-- (find-angg "LUA/LpegRex1.lua" "rectfromast")
rectfromast = function (o)
if type(o) == "number" then return Rect.from(o) end
if type(o) == "string" then return Rect.from(o) end
if type(o) == "table" then
local out = rectfromast(o[#o]):syn1()
for i=#o-2,1,-2 do
local lowerleft = rectfromast(o[i])
local left = lowerleft:syn1(o[i+1])
local left_ = left:pad0(1, left:width()+2, "_")
out = left_ .. out
end
return out
end
PP("rectfromast can't handle this", o)
end
Ast = Class {
type = "Ast",
from = function (...) return Ast({...}) end,
fromsimp = function (...)
local L = {...} -- if ... has a single argument
if #L == 1 then return L[1] end -- then return a simplified result.
return Ast.from(...)
end,
__tostring = function (o) return rectfromast(o):tostring() end,
__index = {
},
}
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Lpeg1.lua"
= Ast.from(2, "+", 4, "-", 6)
= Ast.from(2, "_[_]", 4)
= Ast.fromsimp(2, "+", 4, "-", 6)
= Ast.from (Ast.from (2, "+", 4, "-", 6))
= Ast.fromsimp(Ast.fromsimp(2, "+", 4, "-", 6))
= Ast.from (Ast.from (2, "+", 4, "-", 6), "*", 3)
= Ast.fromsimp(Ast.fromsimp(2, "+", 4, "-", 6), "*", 3)
--]]
-- (find-es "lpeg" "lpeg-quickref")
pskip = P(" ")^0
pnum = (R("09")^1):C() * pskip
plit = function (str) return P(str) * pskip end
ptok = function (str) return P(str):C() * pskip end
passoc = function (pexp, ptok)
return (pexp * (ptok * pexp)^0) / Ast.fromsimp
end
pexpr = P({
"add",
add = passoc(V"mul", ptok("+") + ptok("-")),
mul = passoc(V"norp", ptok("*") + ptok("/")),
norp = pnum + plit("(") * V("add") * plit(")"),
})
-- «tests» (to ".tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Lpeg2.lua"
= pexpr:match( "1*2 + 3 + 4*5*6 + 7")
= pexpr:match("(1*2 + 3 + 4*5*6 + 7)")
= pexpr:match("(1*2 + 3 + 4*5*6 + 7) * 8")
PPP(pexpr:match( "1*2 + 3 + 4*5*6 + 7"))
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: