Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/LUA/Arith4.lua.html -- http://angg.twu.net/LUA/Arith4.lua -- (find-angg "LUA/Arith4.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun a () (interactive) (find-angg "LUA/Arith4.lua")) -- (find-es "lpeg" "lpegrex") -- (find-lpegrexpage) -- (find-lpegrextext) -- (find-lpegrexfile "parsers/lua.lua") 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} ]==] Grammar = [==[ top <-- expr SKIP <- %s+ Id <== NAME NAME <-- {NAME_PREFIX NAME_SUFFIX?} SKIP NAME_PREFIX <-- [_a-zA-Z] NAME_SUFFIX <-- [_a-zA-Z0-9]+ Nil <== `nil` opor :BinaryOp <== `or`->'or' @exprand opand :BinaryOp <== `and`->'and' @exprcmp opcmp :BinaryOp <== (`==`->'eq' / `~=`->'ne' / `<=`->'le' / `>=`->'ge' / `<`->'lt' / `>`->'gt') @exprbor opbor :BinaryOp <== `|`->'bor' @exprbxor opbxor :BinaryOp <== `~`->'bxor' @exprband opband :BinaryOp <== `&`->'band' @exprbshift opbshift :BinaryOp <== (`<<`->'shl' / `>>`->'shr') @exprconcat opconcat :BinaryOp <== `..`->'concat' @exprconcat oparit :BinaryOp <== (`+`->'add' / `-`->'sub') @exprfact opfact :BinaryOp <== (`*`->'mul' / `//`->'idiv' / `/`->'div' / `%`->'mod') @exprunary oppow :BinaryOp <== `^`->'pow' @exprunary opunary :UnaryOp <== (`not`->'not' / `#`->'len' / `-`->'unm' / `~`->'bnot') @exprunary Paren <== `(` @expr @`)` expr <-- expror expror <-- (exprand opor*)~>foldleft exprand <-- (exprcmp opand*)~>foldleft exprcmp <-- (exprbor opcmp*)~>foldleft exprbor <-- (exprbxor opbor*)~>foldleft exprbxor <-- (exprband opbxor*)~>foldleft exprband <-- (exprbshift opband*)~>foldleft exprbshift <-- (exprconcat opbshift*)~>foldleft exprconcat <-- (exprarit opconcat*)~>foldleft exprarit <-- (exprfact oparit*)~>foldleft exprfact <-- (exprunary opfact*)~>foldleft exprunary <-- opunary / exprpow exprpow <-- (exprsimple oppow*)~>foldleft exprsimple <-- [0-9]+ exprprimary <-- Id / Paren ]==] patt = lpegrex.compile(Grammar) bigstr = "(1+2)*3" ast, errlabel, errpos = patt:match(bigstr) PPPV(ast, errlabel, errpos) --[[ * (eepitch-lua52) * (eepitch-kill) * (eepitch-lua52) dofile "Arith4.lua" --]] -- Local Variables: -- coding: utf-8-unix -- End: