aboutsummaryrefslogtreecommitdiff
path: root/examples/lmath.lua
diff options
context:
space:
mode:
authorChloe Kudryavtsev <toast@toast.cafe>2022-01-17 19:29:00 -0500
committerChloe Kudryavtsev <toast@toast.cafe>2022-01-17 19:29:00 -0500
commit226ddb38551079a325c2abe220106e65a635e4e4 (patch)
tree2153dc3c7422c6e4a7a43f825311f2d36d03fcc0 /examples/lmath.lua
parentadd eof, patch parse to work with it (diff)
add eof to README
Diffstat (limited to 'examples/lmath.lua')
-rw-r--r--examples/lmath.lua36
1 files changed, 36 insertions, 0 deletions
diff --git a/examples/lmath.lua b/examples/lmath.lua
new file mode 100644
index 0000000..2fd0535
--- /dev/null
+++ b/examples/lmath.lua
@@ -0,0 +1,36 @@
+local lpeg = require 'lpeg'
+
+-- Lexical Elements
+local Space = lpeg.S(" \n\t")^0
+local Number = lpeg.C(lpeg.P"-"^-1 * lpeg.R("09")^1) * Space
+local TermOp = lpeg.C(lpeg.S("+-")) * Space
+local FactorOp = 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"Term" * lpeg.Cg(TermOp * V"Term")^0, eval);
+ Term = lpeg.Cf(V"Factor" * lpeg.Cg(FactorOp * V"Factor")^0, eval);
+ Factor = Number / tonumber + Open * V"Exp" * Close;
+}
+
+local test
+if arg[1] then
+ local f = io.open(arg[1], 'r')
+ test = f:read '*a'
+ f:close()
+else
+ test = [[10 + 5 * 2 + 10]]
+end
+print(lpeg.match(G, test))