|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LUA/Lisp3.lua.html
-- http://angg.twu.net/LUA/Lisp3.lua
-- (find-angg "LUA/Lisp3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- Parsing lisp with lpegrex, version 3.
-- Superseded by: (find-angg "LUA/Lisp4.lua")
--
-- (defun l2 () (interactive) (find-angg "LUA/Lisp2.lua"))
-- (defun l3 () (interactive) (find-angg "LUA/Lisp3.lua"))
-- (defun ll () (interactive) (find-2a '(l3) '(l2)))
-- (defun lq () (interactive) (find-lpegrexfile "README.md" "Quick References"))
-- (defun lr () (interactive) (find-es "lpeg" "lpegrex"))
-- (defun lt () (interactive) (find-es "lpeg" "lpegrex-tag"))
-- (defun l () (interactive) (find-es "lpeg" "lpeg-quickref"))
-- (defun j () (interactive) (find-es "lpeg" "lpegrex-json"))
-- (find-lpegrexgrep "grep --color=auto -nH --null -e options * */*")
-- (find-lpegrexgrep "grep --color=auto -nRH --null -e '%cn' * *")
-- (find-lpegrexfile "tests/lpegrex-test.lua" "__options={tag=")
require "Tree1" -- (find-anggfile "LUA/Tree1.lua")
require "lpeg" -- (find-es "lpeg" "lpeg-quickref")
loadlpegrex() -- (find-angg "LUA/lua50init.lua" "loadlpegrex")
-- Path.prepend("path", "~/usrc/lpeglabel/?.lua")
-- Path.prepend("cpath", "~/usrc/lpeglabel/?.so")
-- Path.prepend("path", "~/usrc/lpegrex/?.lua")
-- lpegrex = require 'lpegrex'
lpegrex_compilef = function (patstr, f)
return lpegrex.compile(patstr, {__options={tag=f}})
end
Tagged = Class {
type = "Tagged",
__tostring = function (tgd) return tgd:abody() end,
__index = {
body = function (tgd)
return subj:sub(tgd.pos, tgd.endpos-1)
end,
abody = function (tgd) return "<"..tgd:body()..">" end,
value = function (ast)
if ast[0] == "String" then return expr(ast:body()) end
if ast[0] == "Number" then return expr(ast:body()) end
-- if ast[0] == "Symbol" then return ast:body()[2] end
if ast[0] == "Symbol" then return ast:body() end
end,
asvideo = function (ast)
local id = ast[1]:value()
local A = {}
for i=2,#ast-1,2 do
local key,val = ast[i]:value(), ast[i+1]:value()
A[key] = val
end
return id,A
end,
asvideos = function (ast)
local B = {}
for i=1,#ast do
local id,A = ast[i]:asvideo()
B[id] = A
end
return B
end,
},
}
videos_to_expr = function (B)
local f,g,h,m,n
f = function (str) return format("[%q]", str) end
g = function (key,val) return format(" %-11s = %q,\n", f(key), val) end
h = function (A)
local fg = function (key) return g(key, A[key]) end
return mapconcat(fg, sorted(keys(A)), "")
end
m = function (id,A) return format(" %s = {\n%s },", f(id), h(A)) end
n = function (B)
local mk = function (key) return m(key, B[key]) end
return "{\n"..mapconcat(mk, sorted(keys(B)), "\n").."\n}"
end
return n(B)
end
sexp = lpegrex_compilef([[
top <-- skip Element
skip <-- hspace (hcomment? linebreak hspace)*
hspace <-- [ %ct]*
hcomment <-- ';' [^%cn]*
linebreak <-- %cn
Element <-- Quoted / Number / Symbol / String / List
Elements <-- skip (Element skip)*
List <== '(' Elements ')'
Number <== [0-9]+
Symbol <== symbolchar +
symbolchar <-- ![()"\] [!-~]
String <== '"' strchar* '"'
strchar <-- ('\'.) / (!'"' .)
Quoted <== "'" skip Element
]],
function (name, node)
node[0] = name
return Tagged(node)
end)
--[==[
* (eepitch-lua52)
* (eepitch-kill)
* (eepitch-lua52)
dofile "Lisp3.lua"
-- (find-eev "eev-videolinks.el" "more-info")
bigstr = ee_readfile "~/eev-current/eev-videolinks.el"
pos = bigstr:match "()%(defvar ee%-1stclassvideos%-info"
= pos
subj = bigstr
ast = sexp:match(subj, pos)
= ast
= ast[2]
= ast[3]
= ast[3][1]
= ast[3][1][1]
= ast[3][1][1]:asvideo()
= ast[3][1]:asvideos()
vs = ast[3][1]:asvideos()
= videos_to_expr(vs)
--]==]
-- Local Variables:
-- coding: utf-8-unix
-- End: