Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/ParseTree1.lua.html
--   http://anggtwu.net/LUA/ParseTree1.lua
--          (find-angg "LUA/ParseTree1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- A "parse tree" is something like this:
--   (c2m231introp 5 "gramatica-fig")
--   (c2m231introa   "gramatica-fig")
--
-- (defun pt () (interactive) (find-angg "LUA/ParseTree1.lua"))
-- (defun a6 () (interactive) (find-angg "LUA/Ast6.lua"))
-- (defun tt () (interactive) (find-angg "LUA/TikzTrees1.lua"))
-- (find-angg "LUA/ELpeg1.lua" "Gram")
--
-- «.b-and-e»	(to "b-and-e")
-- «.subj»	(to "subj")
-- «.cot»	(to "cot")
-- «.NTify»	(to "NTify")
-- «.grammar»	(to "grammar")
-- «.totex»	(to "totex")

--require "TikzTrees1" -- (find-angg "LUA/TikzTrees1.lua")
--require "Capts1"     -- (find-angg "LUA/Capts1.lua")
require "ELpeg1"       -- (find-angg "LUA/ELpeg1.lua")
require "Co1"          -- (find-angg "LUA/Co1.lua")

-- «b-and-e»  (to ".b-and-e")
-- (find-angg "LUA/ELpeg1.lua" "Gram" "mt_VAST =")
Gram.__index.mt_VAST = function (gr)
    return {
      __newindex = function (v,name,pat)
          pat = Cp():Cg"b" * pat * Cp():Cg"e"
          gr:set(name, Cast(name,pat))
        end,
    }
  end

-- «subj»  (to ".subj")
-- (find-angg "LUA/ELpeg1.lua" "Gram" "cm0 =")
Gram.__index.cm0 = function (gr, top, newsubj, pos)
    subj = newsubj
    if type(pos) == "string" then pos = subj:match(pos) end
    return gr:compile(top):match(subj, pos)
  end

-- «cot»  (to ".cot")
-- (find-angg "LUA/Capts1.lua" "totex")
co0 = Co.new(" %_{}", "\\^")
cot = co0:translator()




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

isterminal = function (o)
    return otype(o) == "AST" and #o == 1 and type(o[1]) == "string"
  end

NTify = function (o)
    if isterminal(o) then
      local tag  = AST {[0]="<>", o[0]}
      local text = AST {[0]="co", o[1]}
      local und  = AST {[0]="und", text, tag}
      return und
    else
      local tag  = AST {[0]="<>", o[0]}
      local b,e  = o.b,o.e
      local subs = AST {[0]="."}
      local pos  = o.b
      local mkco  = function (pos1,pos2) return AST {[0]="co", subj:sub(pos1,pos2-1)} end
      local addco = function (pos1,pos2) table.insert(subs, mkco(pos1,pos2)) end
      if #o == 0 then
        error("#o == 0 not implemented")
      else
        for i=1,#o do
          local thisb = o[i].b
          if pos < thisb then addco(pos,thisb) end
          table.insert(subs, NTify(o[i]))
          pos = o[i].e
        end
        if pos < e then addco(pos,e) end
      end
      local und  = AST {[0]="und", subs, tag}
      return und
    end
  end

-- «grammar»  (to ".grammar")
gr,V,VA,VE,PE = Gram.new()
_ = S(" ")^0

VA.num = (R"09"^1):C()
VA.op  = (S"+-"):C()
VA.sum = V.num *(_*V.op*_*V.num)^0

VA.Stmt = V.Id *_*C("=")*_* V.Expr *_*";"
        + "{"  *_* V.StmtList *_*"}"
        + C("if") *_* "(" *_* V.Expr *_* ")" *_* V.Stmt
VA.StmtList = V.Stmt * (_*V.Stmt)^0
V.Expr0 = V.Id
         + V.Num
VA.Expr  = V.Expr0*(_*V.Optr*_*V.Expr0)^0
VA.Id    = C"x" + C"y"
VA.Num   = C(R"09")
VA.Optr  = C(S">+")

-- «totex»  (to ".totex")
usepackages = [=[
  % \usepackage{tikz}
  % \usetikzlibrary{shapes.geometric}
]=]
middletexbody = Dang.from [=[
\scalebox{<<scale>>}{%
  <<texbody>>
  }
]=]
defs = [=[
  % (find-LATEX "2023-2-C2-intro.tex" "gramatica-fig")
  \def\ColorRed#1{{\color{red}{#1}}}
  \def\NT#1{\langle\textsf{#1}\rangle}
  \def\T#1{\ColorRed{\tt#1}}
  \def\T#1{\mathstrut \ColorRed{\tt#1}}
  \def\und#1#2{\underbrace{#1}_{\textstyle#2}}
]=]

fmts          = VTable {}
fmts["co"]    = "\\T{<cot(o[1])>}"
fmts["und"]   = "\\und{<1>}{<2>}"
fmts["."]     = "<mapconcat(totex, o)>"
fmts["<>"]    = "\\NT{<o[1]>}"


--[[
** (find-angg "LUA/Show2.lua" "texbody")
** (find-code-show2 "~/LATEX/Show2.tex")
*       (code-show2 "~/LATEX/Show2.tex")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "ParseTree1.lua"

o = gr:cm0("Stmt", "if (x>9) { x=0; y=y+1;}")
o = gr:cm0("num", "42+3 + 200")
o = gr:cm0("sum", "42+3 + 200")
o = gr:cm0("sum", "42 + 3")
= o
= o.b
= o.e
= otype(o)
= isterminal(o)
= isterminal(o[1])
= NTify(o[1])
= NTify(o)
= NTify(o):show {em=1}
= totex(NTify(o))

= Show.log
= Show.bigstr
* (etv)


2gT6

--]]















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