解析Lua字符串,更具体地讲是换行符
2017-10-14 22:15:39
收藏:0
阅读:182
评论:1
我正在尝试解析Lua 5.3字符串。但是,我遇到了问题。例如,
$ lua
Lua 5.3.4 版权所有(C) 1994-2017 Lua.org, PUC-Rio
> print(load('return "\\z \n\r \n\r \r\n \n \n \\x"', "@test"))
nil test:6: 在"\x"附近需要十六进制数字
>
> print(load('return "\\z\n\r\n\r\r\n\n\n\\x"', "@test"))
nil test:6: 在"\x"附近需要十六进制数字
这两种情况都会在第6行出错,其背后的逻辑相当简单:吃掉换行符(\r或\n),如果它们与当前的不同(我认为这是Lua词法分析器的精确描述,但我可能是错误的)。
我有这段代码,应该能做到这一点:
local ln = 1
local skip = false
local mode = 0
local prev
for at, crlf in eaten:gmatch('()[\r\n]') do
local last = eaten:sub(at-1, at-1)
if skip and prev == last and last ~= crlf then
skip = false
else
skip = true
ln = ln + 1
end
prev = crlf
end
它根据前一个字符决定是否吃掉换行符。现在,从我能看到的情况来看,这应该可以工作,但是无论我做什么它似乎都不起作用。其他尝试使它报告5行,而这个使它报告9(!)。我在这里错过了什么?我在Lua 5.2.4上运行它。
这是解析\z的一部分:
local function parse52(s)
local startChar = string.sub(s,1,1)
if startChar~="'" and startChar~='"' then
error("not a string", 0)
end
local c = 0
local ln = 1
local t = {}
local nj = 1
local eos = #s
local pat = "^(.-)([\\" .. startChar .. "\r\n])"
local mkerr = function(emsg, ...)
error(string.format('[%s]:%d: ' .. emsg, s, ln, ...), 0)
end
local lnj
repeat
lnj = nj
local i, j, part, k = string.find(s, pat, nj + 1, false)
if i then
c = c + 1
t[c] = part
if simpleEscapes[v] then
--[[ 某些代码,某些elseif,更多代码 ]]
elseif v == "z" then
local eaten, np = s:match("^([\t\n\v\f\r ]*)%f[^\t\n\v\f\r ]()", nj+1)
local p=np
nj = p-1
--[[ 上面的换行计数例程 ]]
--[[ 其他某些elseif ]]
end
else
nj = nil
end
until not nj
if s:sub(-1, -1) ~= startChar then
mkerr("unfinished string near <eof>")
end
return table.concat(t)
end
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

紧凑的代码遍历 Lua 脚本中的行:
local text = "First\n\r\n\r\r\n\n\nSixth" local ln = 1 for line, newline in text:gmatch"([^\r\n]*)([\r\n]*)" do print(ln, line) ln = ln + #newline:gsub("\n+", "\0%0\0"):gsub(".%z.", "."):gsub("%z", "") end遍历 Lua 脚本行的高效代码:
local text = "First\n\r\n\r\r\n\n\nSixth" local sub = string.sub local ln = 1 for line, newline in text:gmatch'([^\r\n]*)([\r\n]*)' do print(ln, line) local pos, max_pos = 1, #newline while pos <= max_pos do local crlf = sub(newline, pos, pos + 1) if crlf == "\r\n" or crlf == "\n\r" then pos = pos + 2 else pos = pos + 1 end ln = ln + 1 end end