|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- parse.lua: functions to parse words keeping track of the column.
-- These functions are used to parse tree segments (in "%:" lines)
-- and 2D grids (in both "%D 2Dx" and "%D 2D" lines).
-- This file:
-- http://angg.twu.net/dednat6/dednat6/parse.lua.html
-- http://angg.twu.net/dednat6/dednat6/parse.lua
-- (find-angg "dednat6/dednat6/parse.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2021jan24
-- License: GPL3
--
-- Based on:
-- http://angg.twu.net/miniforth-article.html
-- http://angg.twu.net/miniforth/miniforth-article.pdf
-- «.getword» (to "getword")
-- «.getword-with-errmsgs» (to "getword-with-errmsgs")
setsubj = function (subj_, pos_)
subj = subj_
pos = pos_ or 3
startcol, endcol = 1, pos
end
-- «getword» (to ".getword")
-- (find-dn5file "parse.lua" "getword =")
-- (find-dn5 "dednat6.lua" "utf8")
getword = function ()
local spaces, word_, newpos = subj:match("( *)([^ ]+)()", pos)
if spaces then
startcol = endcol + #spaces
endcol = endcol + #spaces + word_:len8() -- UTF-8
word = word_
pos = newpos
return word
end
end
getwordasluaexpr = function ()
local expr = getword()
local code = "return "..expr
return assert(loadstring(code))()
end
getrestofline = function ()
local spaces, word_, newpos = subj:match("( *)(.*)()", pos)
if spaces then
startcol = endcol + #spaces
endcol = endcol + #spaces + #word_ -- change for UTF-8
word = word_
pos = newpos
return word
end
end
--[[
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "parse.lua"
run = function (str)
setsubj(str)
while getword() do PP(startcol, endcol, pos, word) end
end
run "%Dfoo bar plic"
--]]
-- «getword-with-errmsgs» (to ".getword-with-errmsgs")
-- These are higher-level variants of getword() and getwordasluaexpr()
-- that accept error messages. Mnemonic: they have "_"s in their
-- names, and "getword_lua" is more readable than "getwordlua".
getword_1 = function (funname, errmsg)
errmsg = errmsg or "argument"
return getword() or error(format("In '%s': missing %s", funname, errmsg))
end
getword_2 = function (funname, errmsg1, errmsg2)
local a = getword_1(funname, errmsg1 or "first argument")
local b = getword_1(funname, errmsg2 or "second argument")
return a,b
end
getword_lua = function (funname, errmsg)
return expr(getword_1(funname, errmsg))
end
getword_lualua = function (funname, errmsg1, errmsg2)
local a, b = getword_2(funname, errmsg1, errmsg2)
return expr(a), expr(b)
end
-- Local Variables:
-- coding: utf-8-unix
-- End: