Fontos hangsúlyozni, hogy a mintaillesztés "anchored", ami számomra azt jelenti, hogy az illesztést rögtön az első karakternél kezdi.
Vajon hol kell módosítani ahhoz, hogy támogassa a racionális számokat?
local Number = lpeg.C(lpeg.P"-"^-1 * lpeg.R("09")^1 * lpeg.P"."^-1 * lpeg.R("09")^0) * Space
lpeg = require "lpeg"
if arg[1] == nil then
print ""
print "Lpeg calc v0.2 --- LUA calculator"
print "================================"
print "http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html"
print ""
print "Usage: lua calc.lua <expression>"
print "Example: lua calc.lua (2+2)*10+2"
print ""
print ""
os.exit(1)
end
-- Lexical Elements
local Space = lpeg.S(" \n\t")^0
local Number = lpeg.C(lpeg.P"-"^-1 * lpeg.R("09")^1) * Space
local FactorOp = lpeg.C(lpeg.S("+-")) * Space
local TermOp = lpeg.C(lpeg.S("*/")) * Space
local Open = "(" * Space
local Close = ")" * Space
-- Auxiliary function
function eval (v1, op, v2)
if (op == "+") then return v1 + v2
elseif (op == "-") then return v1 - v2
elseif (op == "*") then return v1 * v2
elseif (op == "/") then return v1 / v2
end
end
-- Grammar
local V = lpeg.V
G = lpeg.P{ "Exp",
Exp = lpeg.Cf(V"Factor" * lpeg.Cg(FactorOp * V"Factor")^0, eval);
Factor = lpeg.Cf(V"Term" * lpeg.Cg(TermOp * V"Term")^0, eval);
Term = Number / tonumber + Open * V"Exp" * Close;
}
-- small example
print(lpeg.match(G, arg[1] ))
- foofighter blogja
- A hozzászóláshoz be kell jelentkezni
Hozzászólások
LuaRocks telepítéshez (Lua 5.3) --> http://www.thijsschreijer.nl/blog/?p=772
- A hozzászóláshoz be kell jelentkezni