Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/LUA/LpegRex1.lua.html -- http://angg.twu.net/LUA/LpegRex1.lua -- (find-angg "LUA/LpegRex1.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- Tests for lpegrex. -- See: (find-es "lpeg" "lpegrex") -- (find-lpegrexpage) -- (find-lpegrextext) -- (find-lpegrexpage 6 "__options =") -- (find-lpegrextext 6 "__options =") -- -- (defun a () (interactive) (find-angg "LUA/Arith4.lua")) -- (defun l () (interactive) (find-angg "LUA/LpegRex1.lua")) -- -- «.rectfromast» (to "rectfromast") Path.prepend("cpath", "~/usrc/lpeglabel/?.so") Path.prepend("path", "~/usrc/lpegrex/?.lua") lpegrex = require "lpegrex" Grammar = [==[ top <-- plusexpr plusexpr <-| timesexpr ({"+"} timesexpr)* timesexpr <-| norp ({"*"} norp)* norp <-| num / ("(" plusexpr ")") num <-- {%d} ]==] patt = lpegrex.compile(Grammar) bigstr = "(1+2)*3" ast, errlabel, errpos = patt:match(bigstr) -- PPPV(ast, errlabel, errpos) __options = {} t0 = function (str) local gram,subj = str:match("^(.-)::%s*(.*)$") -- local patt = lpegrex.compile(gram) local patt = lpegrex.compile(gram, {__options = __options}) ast,errlabel,errpos = patt:match(subj) PP(ast) end simplify = function (o) if type(o) ~= "table" then return o end if #o == 1 then return simplify(o[1]) end return map(simplify, o) end -- «rectfromast» (to ".rectfromast") -- (find-angg "LUA/Rect.lua" "Rect") -- (find-angg "LUA/Rect.lua" "SynTree") -- 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 --[==[ * (eepitch-lua52) * (eepitch-kill) * (eepitch-lua52) dofile "LpegRex1.lua" = rectfromast(42) = rectfromast(42):syn1() = Rect.from(42):syn1() = rectfromast({42}) = rectfromast({2, "+", 3, "-", 4}) = rectfromast({2, "+", {5, "*", 6}, "-", 4}) = a = a:syn1() --]==] --[==[ * (eepitch-lua52) * (eepitch-kill) * (eepitch-lua52) dofile "LpegRex1.lua" t0 [=[ top <-- {%d} :: 42 ]=] t0 [=[ top <-| {%d} :: 42 ]=] t0 [=[ top <== {%d} :: 42 ]=] t0 [=[ top : foo <== {%d}* :: 42 ]=] t0 [=[ top <== num* num <-- {%d} :: 42 ]=] t0 [=[ top <-| num* num <== {%d} :: 42 ]=] t0 [=[ top : nums <== num* num <== {%d} :: 42 ]=] t0 [=[ top <-- addexpr norp <-- num / "(" addexpr ")" addexpr <== mulexpr ({"+"} mulexpr)* mulexpr <== norp ({"*"} norp)* num <== {%d+} :: (1+2*3*4+5)*6+7 ]=] PPPV(ast) asts = simplify(ast) astr = rectfromast(asts) PPP(asts) = astr -- Ugly: = rectfromast(ast) --]==] --[==[ * (eepitch-lua52) * (eepitch-kill) * (eepitch-lua52) dofile "LpegRex1.lua" -- (find-lpegrexpage 6 "__options =") -- (find-lpegrextext 6 "__options =") __options = { tag = function(tag, node) print('new node', tag) node.tag = tag return node end } t0 [=[ top : nums <== num* num <== {%d} :: 42 ]=] --]==] -- Local Variables: -- coding: utf-8-unix -- End: