Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   https://anggtwu.net/LUA/Pratt3.lua.html
--   https://anggtwu.net/LUA/Pratt3.lua
--           (find-angg "LUA/Pratt3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2026apr03
--
-- (defun e () (interactive) (find-angg "LUA/Pratt3.lua"))
--
-- Supersedes:
--   (find-angg "LUA/Pratt1.lua")
--   (find-angg "LUA/Pratt2.lua")
--
-- https://louis.co.nz/2026/03/26/pratt-parsing.html
-- https://news.ycombinator.com/item?id=47573450 Intuiting Pratt Parsing (louis.co.nz)
-- (find-princeurl-links   "https://louis.co.nz/2026/03/26/pratt-parsing.html")
-- (code-pdf-page "pratt" "$S/https/louis.co.nz/2026/03/26/pratt-parsing.pdf")
-- (code-pdf-text "pratt" "$S/https/louis.co.nz/2026/03/26/pratt-parsing.pdf")
-- (find-prattpage)
-- (find-pratttext)

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

Pratt = Class {
  type = "Pratt",
  new = function ()
      local tr = {}
      local s = Stack.new():push(tr)
      return Pratt {tr=tr, s=s}
    end,
  __tostring = function (p) return p:tostring() end,
  __index = {
    torectL  = function (p) return SynTree.torect(p.tr[1] or ".") end,
    torect   = function (p) return p:torectL().."  #s="..#(p.s) end,
    tostring = function (p) return tostring(p:torect()) end,
    --
    push    = function (p,o)  p.s:push(o); return p end,
    pop     = function (p,o)  return p.s:pop() end,
    top     = function (p)    return p.s:pick(0) end,
    append  = function (p,o)  table.insert(p:top(),o); return p end,
    --
    t       = function (p)    return p:top() end,
    n       = function (p)    return #(p:t()) end,
    tn      = function (p)    return p:t()[p:n()] end,
    tnset   = function (p,o)  p:t()[p:n()] = o; return p end,
    treepre = function (p,op) return SynTree {[0]=op} end,
    treetn  = function (p,op) return SynTree {[0]=op, p:tn()} end,
    --
    down    = function (p)    p.s:push(p:tn()); return p end,
    up      = function (p)    p.s:pop(); return p end,
    prefix  = function (p,op) p:append(p:treepre(op)); p:down(); return p end,
    postfix = function (p,op) p:tnset(p:treetn(op)); return p end,
    infix   = function (p,op) p:postfix(op); p:down(); return p end,
    nary    = function (p,op) p:infix(op); return p end,
    addarg  = function (p,o)  table.insert(p:t(),o); return p end,
  },
}



--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pratt3.lua"
p = Pratt.new()

= SynTree.from(nil)
= SynTree.from(42)
= SynTree.from(print)
= SynTree.from({[0]=10, 2,3})

= p
= p:addarg(2)
= p:infix("+")
= p:addarg(3)
= p:infix("*")
= p:prefix("(")
= p:addarg(4)
= p:infix("+")
= p:addarg(5)
= p:postfix("!")
= p:addarg(6)
= p:up()
= p:up()
= p:addarg(7)
= p:up()
= p:addarg(8)

--]]






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