Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/LpegRex3.lua.html
--   http://anggtwu.net/LUA/LpegRex3.lua
--          (find-angg "LUA/LpegRex3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- This is similar to:
--   (find-angg "LUA/Re2.lua")
-- but for lpegrex.lua.
--
-- (defun e1 () (interactive) (find-angg "LUA/ELpeg1.lua"))
-- (defun l3 () (interactive) (find-angg "LUA/LpegRex3.lua"))
-- (find-es "lpeg" "lpegrex")

-- «.LpegRex»		(to "LpegRex")
-- «.LpegRex-tests»	(to "LpegRex-tests")
-- «.Wikipedia»		(to "Wikipedia")
-- «.Wikipedia-tests»	(to "Wikipedia-tests")



--  _                      ____           
-- | |    _ __   ___  __ _|  _ \ _____  __
-- | |   | '_ \ / _ \/ _` | |_) / _ \ \/ /
-- | |___| |_) |  __/ (_| |  _ <  __/>  < 
-- |_____| .__/ \___|\__, |_| \_\___/_/\_\
--       |_|         |___/                
--
-- «LpegRex»  (to ".LpegRex")

LpegRex = Class {
  type     = "LpegRex",
  from     = function (str) return LpegRex {str=str} end,
  tagasast = function (name,node) node[0] = name; return AST(node) end,
  __index = {
    defs = {__options={}},
    compile = function (lr) return lpegrex.compile(lr.str, lr.defs) end,
    match   = function (lr,subj,init) return lr:compile():match(subj,init) end,
    pm      = function (lr,subj) return PP(lr:compile():match(subj)) end,
    pmt     = function (lr,subj) print(trees(lr:compile():match(subj))) end,
  },
}

lre = LpegRex.from

-- «LpegRex-tests»  (to ".LpegRex-tests")
--[==[
* (eepitch-lua52)
* (eepitch-kill)
* (eepitch-lua52)
dofile "LpegRex3.lua"
loadlpegrex()       -- (find-angg "LUA/lua50init.lua" "loadlpegrex")
require "Re2"       -- (find-angg "LUA/Re2.lua" "Re-tests")
rre "{ '<' {[io]} {[0-9]+} '>' } {.*}"      :pm "<i42> 2+3;"  -- re.lua
lre "{ '<' {[io]} {[0-9]+} '>' } {.*}"      :pm "<i42> 2+3;"  -- lpegrex

-- (find-es "lpeg" "lpegrex-tag")
-- (find-lpegrexpage 2 "AST Nodes" "NodeName <== patt")
-- (find-lpegrextext 2 "AST Nodes" "NodeName <== patt")
-- (find-lpegrexpage 5 "pos = 'init'")
-- (find-lpegrextext 5 "pos = 'init'")
-- (find-lpegrexpage 6 "tag = function(tag, node)")
-- (find-lpegrextext 6 "tag = function(tag, node)")

require "ELpeg1"
lre " foo <== {.} {.} "  :pm  "ab"
lre " foo <== {.} {.} "  :pmt "ab"

LpegRex.__index.defs.__options.pos    = "b"
LpegRex.__index.defs.__options.endpos = "e"
LpegRex.__index.defs.__options.tag    = function (name, node)
    node[0] = name
    return AST(node)
  end

-- Or:
LpegRex.__index.defs.__options = {pos="b", endpos="e", tag=LpegRex.tagasast}

-- Constant capture
-- A VA with a different name

lre " top <- foo   foo <-         {.} {.} "  :pmt "ab"
lre " top <- foo   foo <--        {.} {.} "  :pmt "ab"
lre " top <- foo   foo <-- $'bar' {.} {.} "  :pmt "ab"

lre " top <- foo   foo        <-| {.} {.} "  :pm  "ab"
lre " top <- foo   foo        <== {.} {.} "  :pm  "ab"
lre " top <- foo   foo        <== {.} {.} "  :pmt "ab"
lre " top <- foo   foo : bar  <== {.} {.} "  :pmt "ab"

--]==]




-- __        ___ _    _                _ _       
-- \ \      / (_) | _(_)_ __   ___  __| (_) __ _ 
--  \ \ /\ / /| | |/ / | '_ \ / _ \/ _` | |/ _` |
--   \ V  V / | |   <| | |_) |  __/ (_| | | (_| |
--    \_/\_/  |_|_|\_\_| .__/ \___|\__,_|_|\__,_|
--                     |_|                       
--
-- A figure from the Wikipedia:
-- 2hT6: (c2m231introp 5 "gramatica-fig")
--       (c2m231introa   "gramatica-fig")
--       http://anggtwu.net/LATEX/2023-2-C2-Tudo.pdf#page=6
--      https://en.wikipedia.org/wiki/Context-free_grammar
--
-- «Wikipedia»  (to ".Wikipedia")

wikipedia_lang_example = "if (x>9) { x=0; y=y+1;}"
wikipedia_lang_lpegrex = [=[
  StmtList     <== Stmt+
  Stmt         <== Id `=` Expr `;`
                 / `{` StmtList `}`
                 / `if` `(` Expr `)` Stmt
  Expr         <== Expr0 (Optr Expr0)*
  Expr0        <== Id
                 / Num
  Id           <== {[xy]}
  Num          <== {[019]}
  Optr         <== {[>+]}

  NAME_PREFIX  <-- [_a-zA-Z]
  NAME_SUFFIX  <-- [_a-zA-Z0-9]+
  SKIP         <-- ' '*
]=]

-- «Wikipedia-tests»  (to ".Wikipedia-tests")
--[==[
* (eepitch-lua52)
* (eepitch-kill)
* (eepitch-lua52)
dofile "LpegRex3.lua"
require "ELpeg1"
loadlpegrex()       -- (find-angg "LUA/lua50init.lua" "loadlpegrex")
LpegRex.__index.defs.__options = {pos="b", endpos="e", tag=LpegRex.tagasast}
    lre(wikipedia_lang_lpegrex) :pmt(wikipedia_lang_example)
p = lre(wikipedia_lang_lpegrex)
= p
= p:match(wikipedia_lang_example)
= p:match(wikipedia_lang_example, nil, "Num")

-- (find-lpegrexfile "parsers/lua.lua")

--]==]






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