Skip to content

Instantly share code, notes, and snippets.

@randrews
Created May 29, 2015 23:32
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save randrews/3348d96cd35e5b154741 to your computer and use it in GitHub Desktop.
Save randrews/3348d96cd35e5b154741 to your computer and use it in GitHub Desktop.
Toy calculator in Lua, version 1
function eval(num1, operator, num2)
if operator == '+' then
return num1 + num2
elseif operator == '-' then
return num1 - num2
elseif operator == '*' then
return num1 * num2
elseif operator == '/' then
return num1 / num2
else
return num1
end
end
spc = lpeg.S(" \t\n")^0
number = spc * lpeg.C(
lpeg.P('-')^-1 *
lpeg.R('09')^0 *
( lpeg.P('.') *
lpeg.R('09')^0
)^-1 ) * spc /
tonumber
expr = lpeg.P{
"EXPR";
EXPR = ( lpeg.V("TERM") * lpeg.C( lpeg.S('+-') ) * lpeg.V("EXPR") +
lpeg.V("TERM") ) / eval,
TERM = ( lpeg.V("FACT") * lpeg.C( lpeg.S('/*') ) * lpeg.V("TERM") +
lpeg.V("FACT") ) / eval,
FACT = ( spc * "(" * lpeg.V("EXPR") * ")" * spc +
number ) / eval
}
function repl(file)
file = file or io.input()
parser = expr
for line in file:lines() do
print(parser:match(line))
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment