Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/LUA/binops-re.lua -- http://angg.twu.net/LUA/binops-re.lua.html -- (find-angg "LUA/binops-re.lua") -- 2014apr28 -- -- (find-lua51manualw3m "") -- (find-books "__comp/__comp.el" "ierusalimschy") -- (find-pil2page 8 "Contents") -- (find-pil2text 8 "Contents") -- (find-angg "LUA/precedenceparser.lua") binops = { ["*"] = {size=20, leftsize=21, rightsize=19, fmt="%s*%s"}, ["+"] = {size=30, leftsize=31, rightsize=29, fmt="%s+%s"}, ["^"] = {size=10, leftsize=11, rightsize= 9, fmt="%s^%s"}, } ExprNum = Class { type = "ExprNum", __tostring = function (o) return o:ptos() end, __index = { ptos = function (o) return o[1] end, pntos = function (o) return o[1] end, rpntos = function (o) return o[1] end, }, } ExprBin = Class { type = "ExprBin", __tostring = function (o) return o:ptos() end, __index = { binops = binops, ptos = function (o, size) local op = o.binops[o.op] local leftstr = o[1]:ptos(op.leftsize) local rightstr = o[2]:ptos(op.rightsize) local str = string.format(op.fmt, leftstr, rightstr) if size and op.size > size then str = "("..str..")" end return str end, pntos = function (o) return o.op.." "..o[1]:pntos().." "..o[2]:pntos() end, rpntos = function (o) return o[1]:rpntos().." "..o[2]:rpntos().." "..o.op end, }, -- class methods: fromLeft = function (list) -- "2-3-4-5" is "((2-3)-4)-5" local a = list[1] for i=3,#list,2 do local op,b = list[i-1], list[i] a = ExprBin {op=op, a, b} end return a end, fromRight = function (list) -- "2^3^4^5" is "2^(3^(4^5))" local b = list[#list] for i=#list-2,1,-2 do local a,op = list[i], list[i+1] b = ExprBin {op=op, a, b} end return b end, } N = function (n) return ExprNum {n} end B = function (op, a, b) return ExprBin {op=op, a, b} end -- e2345 = B("*", B("+", N(2), N(3)), B("^", N(4), N(5))) -- print(e2345) -- print(e2345:pntos()) -- print(e2345:rpntos()) -- (find-es "lua5" "lpeg-re") -- file:///home/edrx/usrc/lpeg-0.12/re.html userocks() require "re" pat = re.compile([[ E30 <- {| E20 ( _ { [-+] } _ E20 )* |} -> fromLeft E20 <- {| E10 ( _ { [*/] } _ E10 )* |} -> fromLeft E10 <- {| E0 ( _ { '^' } _ E0 )* |} -> fromRight E0 <- N / '(' _ E30 _ ')' N <- { [0-9]+ } -> N _ <- ' '* ]], { N = function (s) return ExprNum {s} end, fromLeft = ExprBin.fromLeft, fromRight = ExprBin.fromRight, }) print(pat:match "9+3*4^5") print(pat:match "(9+3)*4^5") print(pat:match "(9 +3 )* 4 ^5") print(pat:match "9 +3* 4 ^5") --[===[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "binops-re.lua" paat = re.compile ([[ o <- {| word ( _ word )* |} -> concat word <- [%S]+ -> "<%0>" _ <- { ' '+ } ]], { concat = table.concat }) print(paat:match "abc de") PP(paat:match "abc de fg ") macros = { -- (find-angg "LUA/lua50init.lua" "split") oneof = function (str) local quote = function (s) return "'"..s.."'" end return mapconcat(quote, split(str), " / ") end, binprec = function (f, abops) local a, b, ops = abops:match "%s*(%S+)%s+(%S+)%s+(.*)" return string.format("%s <- {| %s ( _ { %s } _ %s )* |} -> %s", a, b, macros.oneof(ops), b, f) end, fromLeft = function (abops) return macros.binprec("fromLeft", abops) end, fromRight = function (abops) return macros.binprec("fromRight", abops) end, } LR_to_re = function (li) local lr, newe, olde, op1, ops = li:match "%s*([LR]):%s+(%S+)%s+(%S+)%s+(%S+)%s+(.*)" local newops = "'"..op1.."' "..ops:gsub("(%S+)", "/ '%0'") local s = string.format("%s <- {| %s ( _ { %s } _ %s )* |} -> %s", newe, olde, newops, olde, ({L="fromLeft", R="fromRight"})[lr]) return s end = LR_to_re " L: e20 e10 + := / " ee = {N"3", "+", N"4", "+", N"5", "+", N"6"} -- eee = fromLeft(ee) PP(ee) -- PP(eee) -- print(eee) eee = fromRight(ee) print(eee) gabgrammar = [[ macro fromRight ( e e ^ ) macro fromLeft ( e e * / ) macro fromLeft ( e e + - ) macro fromLeft ( e e < <= = >= > != ) macro fromLeft ( e e & ) macro fromLeft ( e e or ) macro fromLeft ( e e -> ) macro nonAssoc ( e e <- ) macro fromRight ( e e := ) elist0 <- {| ( e ( _ ',' _ e )* )? |} elist1 <- {| e ( _ ',' _ e )* |} elist2 <- {| e ( _ ',' _ e )+ |} parenish <- '(' _ e _ ')' / '(' _ elist2 _ ')' -> tuple / '{' _ elist0 _ '}' -> explicitSet / '{' _ elist1 _ '|' _ elist1 _ '}' -> suchThatSet faish <- macro oneof ( Fa Ex \ ) e '.' e falta: function application ]] --]===] -- Local Variables: -- coding: raw-text-unix -- End: