Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/Gram3.lua.html
--   http://anggtwu.net/LUA/Gram3.lua
--          (find-angg "LUA/Gram3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/Gram3.lua"))

-- «.Block»		(to "Block")
-- «.Block-test»	(to "Block-test")
-- «.Call»		(to "Call")
-- «.var»		(to "var")
-- «.var-tests»		(to "var-tests")
-- «.callargs»		(to "callargs")
-- «.callargs-tests»	(to "callargs-tests")
-- «.opor»		(to "opor")
-- «.opor-tests»	(to "opor-tests")
-- «.expr»		(to "expr")
-- «.expr-tests»	(to "expr-tests")

require "Gram2"  -- (find-angg "LUA/Gram2.lua")

gr,V,VA,VE = Gram.new()
wordpat = Cs(R("__", "AZ", "az") *
             R("__", "AZ", "az", "09")^0)
keywords,K,KE,KW,NKW = Keywords.from(wordpat)

V.S    = (S" \t\n")^0
  s    = V.S
  _    = V.S

V[","]        = P","
V["]"]        = P"]"
V["}"]        = P"}"
V[")"]        = P")"

-- (find-es "lpeg" "lpegrex")
-- (find-es "lpeg" "lpegrex" "lua.lua")

-- «Block»  (to ".Block")
-- (find-lpegrexfile "parsers/lua.lua" "\nBlock")
V.Block         = ((V.Label + V.Return + V.Break + V.Goto + V.Do
                  + V.While + V.Repeat + V.If + V.ForNum + V.ForIn
                  + V.FuncDef + V.FuncDecl + V.VarDecl + V.Assign + V.call + P";")*_)^0
VA.Label        = P"::" * VE.NAME * P"::"
VA.Return       = K"return" *_* V.exprlist^0
VA.Break        = K"break"
VA.Goto         = K"goto"    *_* VE.NAME
VA.Do           = K"do"      *_* V.Block *_* KE"end"
VA.While        = K"while"   *_* VE.expr *_* KE"do"    *_* V.Block *_* KE"end"
VA.Repeat       = K"repeat"  *_* V.Block *_* KE"until" *_* V.expr
VA.If           = K"if"      *_* VE.expr *_* KE"then"  *_* V.Block
                * (K"elseif" *_* V.expr  *_* KE"then"  *_* V.Block)^0
                * (K"else"   *_* V.Block)^-1
                * KE"end"
VA.ForNum       = K"for"  *_* V.Id     *_
                * P"="    *_* VE.expr  *_* VE[","] *_* VE.expr *_* (P"," *_* VE.expr *_)^-1
                * KE"do"  *_* V.Block  *_* KE"end"
VA.ForIn        = K"for"  *_* V.idlist *_* K"in" *_* V.exprlist *_
                * KE"do"  *_* V.Block  *_* KE"end"
VA.FuncDef      = K"function" *_* VE.funcname *_* VE.funcbody
VA.FuncDecl     = K"local" *_* K"function" *_* VE.Id  *_* VE.funcbody
VA.VarDecl      = K"local" *_* V.iddecllist * (_* P"=" *_* V.exprlist)^-1
VA.Assign       = V.varlist *_* P"=" *_* V.exprlist

-- «Block-test»  (to ".Block-test")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Gram3.lua"
= keywords
= gr:cm("Block", "")
= gr:cm("Block", "a b")
= gr:cm("Block", "a=b")
= gr:cm("Block", "return")
= gr:cm("Block", "return a,b,c")
= gr:cm("Block", "break")
= gr:cm("Block", "goto foo")
= gr:cm("Block", "do a=b end")
= gr:cm("Block", "do a=b c(d) end")
= gr:cm("Block", "do a=b c(d) e end")
= gr:cm("Block", "while a do     end")
= gr:cm("Block", "while a do b=c end")
= gr:cm("Block", "repeat a=b until c")
= gr:cm("Block", "repeat a   until c")
= gr:cm("Block", "if a then b=c end")
= gr:cm("Block", "if a then b=c else d=e end")
= gr:cm("Block", "if a then b=c else d=e else f=g end")
= gr:cm("Block", "if a then b   end")
= gr:cm("Block", "if a then b=c elseif d then e=f end")
= gr:cm("Block", "for a=b     do end")
= gr:cm("Block", "for a=b,c   do end")
= gr:cm("Block", "for a=b,c,d do end")
= gr:cm("Block", "for a=b,c,d,e do end")
= gr:cm("Block", "for a,b in c,d do end")
= gr:cm("Block", "function a  (c) end")
= gr:cm("Block", "function a.b(c) end")
= gr:cm("Block", "function a      end")
= gr:cm("Block", "function    (c) end")
= gr:cm("Block", "local function a  (c) end")
= gr:cm("Block", "local function a.b(c) end")

                  + V.FuncDef + V.FuncDecl + V.VarDecl + V.Assign + V.call + P";")*_)^0


  grd:dbg("Block Assign Id call Call")
= grd
= grd:cm("Block", "e")
= grd:cm("call", "e")

--]]

-- (find-lpegrexfile "parsers/lua.lua" "\nNumber")
V.Number      = Cttag("N", Cs(R("09")^1))
V.String      = Cttag("Str", Cs(V.STRING))
V.Boolean     = Cs(P"false" + P"true")
V.Nil         = Cs(P"nil")
V.Varargs     = Cs(P"...")
VA.Id         = Cs(NKW)
VA.IdDecl     = Cs(NKW)
V.fieldsep    = S",;"
V.Function    = P"notyet"
V.Table       = Cttag("{}", P"{" *_* zeroormorecc(V.field, V.fieldsep) *_* P"}")
V.Paren       = P"(" *_* V.expr *_* P")"
V.Pair        = Cttag("Pair", V.PairL *_*P"="*_* V.expr)
V.PairL       = P"["*_* V.expr *_*P"]" + V.NAME

-- «Call»  (to ".Call")
-- (find-lpegrexfile "parsers/lua.lua" "\nCall")
V.Call        = V.callargs
V.CallMethod  = P":"*_* V.NAME *_* V.callargs
V.DotIndex    = P"."*_* V.NAME
V.ColonIndex  = P":"*_* V.NAME
V.KeyIndex    = P"["*_* V.expr *_*P"]"

-- (find-lpegrexfile "parsers/lua.lua" "\nindexsuffix")
V.indexsuffix = V.DotIndex + V.KeyIndex
V.callsuffix  = V.Call + V.CallMethod

-- «var»  (to ".var")
-- (find-lpegrexfile "parsers/lua.lua" "\nvar ")
V.var          = assocpost (V.exprprimary, endingwith(V.callsuffix, V.indexsuffix)) + V.Id
V.call         = assocpostp(V.exprprimary, endingwith(V.indexsuffix, V.callsuffix))
V.exprsuffixed = assocpost (V.exprprimary, V.indexsuffix + V.callsuffix)
V.funcname     = Ct(V.Id * (_*V.DotIndex)^0 * (_*V.ColonIndex)^-1) / foldpost

-- «var-tests»  (to ".var-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Gram3.lua"
= gr:cm("var",  "a")
= gr:cm("call", "a")
= gr:cm("var",  "a.b")
= gr:cm("var",  "a.b(c)")
= gr:cm("call", "a.b(c)")
= gr:cm("var",  "a.b(c).d")
= gr:cm("var",  "a:b(c).d")
= gr:cm("var",  "a[234].d")
= gr:cm("var",  "a[234]")
= gr:cm("funcname", "a.b.c:d")

--]]

-- (find-lpegrexfile "parsers/lua.lua" "\nfuncbody")
V.funcbody    = P"(" *_* V.funcargs *_* P")" *_* V.Block *_* KE"end"
V.field       = V.Pair + V.expr
V.fieldsep    = P"," + P";"

-- «callargs»  (to ".callargs")
-- (find-lpegrexfile "parsers/lua.lua" "\ncallargs")
V.callargs      = Cast("()", P"("*_* zeroormorec(V.expr, P",") *_*P")") + V.Table + V.String
V.idlist        = oneormorec (V.Id,     P",")
V.iddecllist    = oneormorec (V.IdDecl, P",")
V.funcargs      = oneormorec (V.Id,     P",") * (_*P","*_* V.Varargs)^-1 + V.Varargs^-1
V.exprlist      = oneormorec (V.expr,   P",")
V.varlist       = oneormorec (V.var,    P",")

-- «callargs-tests»  (to ".callargs-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Gram3.lua"
= gr:cm("callargs", "(a, bc, def)")
= gr:cm("callargs", "(a, bc, def, ...)")
= gr:cm("callargs", "(...)")
= gr:cm("callargs", "()")
= gr:cm("callargs", "'abc'")
= gr:cm("callargs", "{abc}")

--]]

-- «opor»  (to ".opor")
-- (find-lpegrexfile "parsers/lua.lua" "opor")
V.opor     = anyof "or"
V.opand    = anyof "and"
V.opcmp    = anyof "== ~= <= >= < >"
V.opbor    = anyof "|"
V.opbxor   = anyof "~"
V.opband   = anyof "&"
V.opbshift = anyof "<< >>"
V.opconcat = anyof ".."
V.oparit   = anyof "+ -"
V.opfact   = anyof "* // / %"
V.oppow    = anyof "^"
V.opunary  = anyof "not # - ~"

-- «opor-tests»  (to ".opor-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Gram3.lua"
V.pat = assocpre(V.opunary, V.Id) 
= gr:cm("pat", "not # ~ a")

--]]

-- «expr»  (to ".expr")
-- (find-lpegrexfile "parsers/lua.lua" "\nexpr")
V.expr          = V.expror
V.expror        = assocl(V.exprand,    V.opor    )
V.exprand       = assocl(V.exprcmp,    V.opand   )
V.exprcmp       = assocl(V.exprbor,    V.opcmp   )
V.exprbor       = assocl(V.exprbxor,   V.opbor   )
V.exprbxor      = assocl(V.exprband,   V.opbxor  )
V.exprband      = assocl(V.exprbshift, V.opband  )
V.exprbshift    = assocl(V.exprconcat, V.opbshift)
V.exprconcat    = assocl(V.exprarit,   V.opconcat)
V.exprarit      = assocl(V.exprfact,   V.oparit  )
V.exprfact      = assocl(V.exprunary,  V.opfact  )
V.exprunary     = assocpre(V.opunary,  V.exprpow )
V.exprpow       = assocr(V.exprsimple, V.oppow   )
V.exprsimple    = V.Nil + V.Boolean + V.Number + V.String + V.Varargs
                + V.Function + V.Table + V.exprsuffixed
V.exprprimary   = V.Id + V.Paren

-- «expr-tests»  (to ".expr-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Gram3.lua"
= gr:cm("expr", "2 + 3 * 'a'")
= gr:cm("expr", "2^3^4 - 5*6*7 - (8 / 9)")
= gr:cm("expr", "{a=3, ['b']=4, 5}")
= gr:cm("expr", "a")
= gr:cm("expr", "a.b")

--]]





--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Gram3.lua"
= gr:cm("NAME", "foo_9")
= gr:cm("Id",   "foo_9")

--]]








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