Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://angg.twu.net/LUA/lpeg-minitut.lua.html
--   http://angg.twu.net/LUA/lpeg-minitut.lua
--           (find-angg "LUA/lpeg-minitut.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun l () (interactive) (find-angg "LUA/lpeg-minitut.lua"))
-- (find-es "lua-intro" "lpeg-quickref")
-- (find-es "lpeg")
-- (find-es "lua-intro" "lpeg-re-infix-1")
--
-- See: (find-angg "LUA/Re.lua")

-- «.arit1»	(to "arit1")



require "re"

syntreeg = function (...)
    local A = {...}
    local S = SynTree {[0] = A[2]}
    for i=1,#A,2 do table.insert(S, A[i]) end
    return S
  end

packcaptures = function (...)
    local A={...}
    return #A==1 and A[1] or packcaptures0(...)
  end
packcaptures_pars = function (...) return "("..table.concat({...}, " ")..")" end
packcaptures_tree = function (...) return syntreeg(...) end

usepars = function () packcaptures0 = packcaptures_pars end
usetree = function () packcaptures0 = packcaptures_tree end
usetree()

defs   = { f = packcaptures }
c      = function (pat) return re.compile(pat, defs) end
retest = function (pat) return function (s) print(re.match(s, c(pat))) end end


-- «arit1»  (to ".arit1")
-- (find-es "lpeg" "re-quickref")
--[[
      "string"         literal string
      [class]          character class
      p *              zero or more repetitions
      p +              one or more repetitions

      name             non terminal
      p1 p2            concatenation
      p1 / p2          ordered choice

      ( p )            grouping
      { p }            simple capture
      (name <- p)+     grammar
      p -> name        function/query/string capture equivalent to p / defs[name]
--]]

test_arit1 = retest [[
  e  <- e3
  e3 <- (e2 ({"+"} e2)*) -> f
  e2 <- (e1 ({"*"} e1)*) -> f
  e1 <- (e0 ({"^"} e0)*) -> f
  e0 <- "(" e3 ")" / {[0-9]+}
]]

--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "lpeg-minitut.lua"

= syntreeg(1, "+", 2)
= syntreeg(1, "+", 2, "*", 3)
= syntreeg(1, "+", 2, "*", syntreeg(1, "/", 2))
= syntreeg(1, "+", 2, "*", syntreeg(1, "/", syntreeg(4)))

usepars(); test_arit1 "1*2+3^4*5^6+7^8"
usetree(); test_arit1 "1*2+3^4*5^6+7^8"


= packcaptures(1, "+", 2)
= packcaptures(1, "+", 2, "*", 3)
= packcaptures(1, "+", 2, "*", packcaptures(1, "/", 2))

usetree(); test_arit1 "1*2+3^4*5^6+7^8"

usetree(); test_arit1 "1*2+3^4*5^6+7^8"


print(str)

--]]





-- (find-es "lpeg" "re-quickref")

sfpack = function (...) return {...} end

sfdefs = {
  pack = sfpack,
  validword = function (subj, pos, word)
      if word:match"^b" then return pos end
    end, 
  }
sfc    = function (pat) return re.compile(pat, sfdefs) end
sftest = function (pat) return function (s) PP(re.match(s, sfc(pat))) end end

sf1 = sftest [[
  top        <- %s* {} Thing {}

  number     <- { [-+]? [0-9]+ ( "." [0-9]+ )? }
  quotedlit  <- { '"' [^"]* '"' }
  dquotedlit <- { "'" [^']* "'" }
  word       <- { [!-~]+ }
  validword  <- { word => validword }

  Number    <- {| ""->"Number"     number                  |}
  QuotedLit <- {| ""->"QuotedLit" (quotedlit / dquotedlit) |}
  Word      <- {| ""->"Word"       validword               |}

  Thing     <- Number / QuotedLit / Word

]]






-- Local Variables:
-- coding:  utf-8-unix
-- End: