|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://anggtwu.net/LUA/Ast3.lua.html
-- http://anggtwu.net/LUA/Ast3.lua
-- (find-angg "LUA/Ast3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun a () (interactive) (find-angg "LUA/Ast3.lua"))
-- (defun a1 () (interactive) (find-angg "LUA/Ast1.lua"))
-- (defun a2 () (interactive) (find-angg "LUA/Ast2.lua"))
-- (defun a3 () (interactive) (find-angg "LUA/Ast3.lua"))
-- (defun c3 () (interactive) (find-angg "LUA/Caepro3.lua"))
-- (defun c4 () (interactive) (find-angg "LUA/Caepro4.lua"))
-- (defun g2 () (interactive) (find-angg "LUA/Gram2.lua"))
-- (defun g3 () (interactive) (find-angg "LUA/Gram3.lua"))
-- «.AST» (to "AST")
-- «.E» (to "E")
-- «.ToText» (to "ToText")
-- «.totex» (to "totex")
-- «.AST-tests» (to "AST-tests")
-- «.E-tests» (to "E-tests")
-- «.ToText-tests» (to "ToText-tests")
require "Show1" -- (find-angg "LUA/Show1.lua")
require "Gram2" -- (find-angg "LUA/Gram2.lua")
lpeg.ptmatch = function (pat, str) PP(pat:Ct():match(str)) end
L = Code.L
-- _ ____ _____
-- / \ / ___|_ _|
-- / _ \ \___ \ | |
-- / ___ \ ___) || |
-- /_/ \_\____/ |_|
--
-- «AST» (to ".AST")
-- Based on: (find-angg "LUA/Gram2.lua" "AST")
-- See: (find-angg "LUA/Show1.lua" "string.show-tests")
--
AST = Class {
type = "AST",
alttags = {}, -- Override this!
ify = function (o) -- "o" needs to be a (scratch) table.
if o[0] and AST.alttags[o[0]] -- In some cases
then o[0] = AST.alttags[o[0]] -- we change o[0],
end -- and in all cases
return AST(o) -- we change the metatable of o.
end,
__tostring = function (o) return tostring(SynTree.from(o)) end,
__index = {
totex0 = function (o) return totex0(o) end, -- returns a tt
totex = function (o) return totex(o) end, -- returns linear text
show = function (o, ...) return totex(o):show(...) end
},
}
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Ast3.lua"
= AST {2, 3, 4}
= AST {[0]="mul", 2, 3, 4}
= AST {[0]="mul", 2, 3, AST {4,5,6}}
= AST.ify {[0]="mul", 2, 3, AST {4,5,6}}
AST.alttags = {mul="*"}
= AST {[0]="mul", 2, 3, AST {4,5,6}}
= AST.ify {[0]="mul", 2, 3, AST {4,5,6}} -- changes the "mul" to "*"
--]]
-- _____
-- | ____|
-- | _|
-- | |___
-- |_____|
--
-- «E» (to ".E")
entries = {}
E = setmetatable({}, {
__call = function (_,name) return entries[name] end,
__index = function (_,name) return entries[name] end,
__newindex = function (_,name,o) entries[name] = o end,
})
-- _____ _____ _
-- |_ _|_|_ _|____ _| |_
-- | |/ _ \| |/ _ \ \/ / __|
-- | | (_) | | __/> <| |_
-- |_|\___/|_|\___/_/\_\\__|
--
-- Conventions:
-- "a tt0" means an object of the class ToText0
-- "a tt" means an object of the class ToText
-- "an o" means an AST or a string or a number
-- "tex" means linear text (usually LaTeX code)
--
-- A tt0 contains static instructions for converting an o to tex.
-- A tt contains a tt0 plus an o.
-- totex (o) converts o to tex.
-- totex0(o) converts o to a tt.
-- totex00 is a global variable that holds a tt0.
--
-- The suffix "0" always means "lower level".
--
-- «ToText» (to ".ToText")
ToText0 = Class {
type = "ToText0",
__tostring = function (tt0) return mytostringv(tt0) end,
__index = {
with = function (tt0,o) return ToText {tt0=tt0, o=o} end,
},
}
ToText = Class {
type = "ToText",
__tostring = function (tt) return tostring(tt.o) end,
__index = {
from = function (tt, o) return ToText {tt0=tt.tt0, o=o} end,
atn = function (tt, n) return tt:from(tt.o[n+0]) end,
tag = function (tt) return tt.o[0] end,
fmt = function (tt) return tt.tt0.fmts[tt:tag()] end,
--
eval = function (tt,fmt,a,b,c)
return L("tt,tt0,o,a,b,c => "..fmt)(tt, tt.tt0, tt.o, a, b, c)
end,
subst = function (tt, fmt)
local f = function (s)
if s:match"^[0-9]+$" then return tt:atn(s):totext() end
return tt:eval(s)
end
return (fmt:gsub("<(.-)>", f))
end,
totext = function (tt)
if type(tt.o) == "string" then return tt.o end
if type(tt.o) == "number" then return tostring(tt.o) end
if not tt:tag() then return "[No tag]" end
if not tt:fmt() then return "[No fmt: "..tt:tag().."]" end
return tt:asttotext(tt.o)
end,
asttotext = function (tt) return tt:subst(tt:fmt()) end,
},
}
-- «totex» (to ".totex")
totex00 = ToText0 {fmts={}} -- Override this!
totex0 = function (o) return totex00:with(o) end -- returns a tt
totex = function (o) return totex00:with(o):totext() end -- returns text
-- «E-tests» (to ".E-tests")
-- «totex-tests» (to ".totex-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Ast3.lua"
mkast = function (op, ...) return AST.ify {[0]=op, ...} end
E["sin"] = mkast("fun", "sin")
E[ "x"] = mkast("var", "x")
E["sin x"] = mkast("ap", E"sin", E"x")
= E["sin x"]
= E["sin x"][1]
= E["sin x"]:totex()
fmts = VTable {}
funs = VTable {}
totex00 = ToText0 {fmts=fmts, funs=funs}
fmts.ap = "<1> <2>"
fmts.fun = "<1>"
fmts.var = "<1>"
funs.sin = "\\sin "
= E["sin x"]:totex()
fmts.fun = "<tt0.funs[o[1]] or o[1]>"
= E["sin x"]:totex()
= E["sin x"]:totex0()
= E["sin x"]:totex0().o
= E["sin x"]:totex0().tt0
= E["sin x"]:totex0().tt0.fmts
= E["sin x"]:totex0().tt0.fmts.ap
= E["sin x"]:totex0():eval("2+3")
= E["sin x"]:totex0():eval("tt0")
= E["sin x"]:totex0():eval("tt0.funs")
= E["sin x"]:totex0():eval("o")
= E["sin x"]:totex0():eval("tt")
= E["sin x"]:totex0():eval("otype(o)")
= E["sin x"]:totex0():eval("otype(tt)")
= E["sin x"]:totex0():eval("tt:tag()")
= E["sin x"]:totex0():eval("tt:fmt()")
= E["sin x"]:totex0():eval("tt:atn(1)")
= E["sin x"]:totex0():eval("tt:atn(1):totext()")
= E["sin x"]:totex0():eval("tt:atn(1):tag()")
= E["sin x"]:totex0():eval("tt:atn(1):fmt()")
= E["sin x"]:totex0():subst("<1>")
= E["sin x"]:totex0():subst("<2>")
= E["sin x"]:totex0():subst("<2+3>")
= E["sin x"]:totex0():subst("<tostring(tt)>")
= E["sin x"]:totex0():subst("<tostring(o)>")
= E["sin x"]:totex0():subst("<tostring(o[1])>")
= E["sin x"]:totex0():subst("<totex(o[1])>")
--]==]
-- Local Variables:
-- coding: utf-8-unix
-- End: