|
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: