在下面的代码中,名为的函数json_parser
用于解析 JSON。我最初将这个函数保留为一个单独的模块,json.lua
并使用以下命令来调用它:
local json = require("json")
但出于某种原因,我想将其打包到一个文件中,并尝试用它创建一个函数。它工作正常,但在将其设为函数后,我收到错误。我在 latex 文件中使用此代码并使用 运行它lualatex
。
\begin{luacode}
local function json_parser()
local lpeg = assert(require("lpeg"))
local C, Cf, Cg, Ct, P, R, S, V =
lpeg.C, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.R, lpeg.S, lpeg.V
-- number parsing
local digit = R"09"
local dot = P"."
local eE = S"eE"
local sign = S"+-"^-1
local mantissa = digit^1 * dot * digit^0 + dot * digit^1 + digit^1
local exponent = (eE * sign * digit^1)^-1
local real = sign * mantissa * exponent / tonumber
-- optional whitespace
local ws = S" \t\n\r"^0
-- match a literal string surrounded by whitespace
local lit = function(str)
return ws * P(str) * ws
end
-- match a literal string and synthesize an attribute
local attr = function(str,attr)
return ws * P(str) / function() return attr end * ws
end
-- JSON grammar
local json = P{
"object",
value =
V"null_value" +
V"bool_value" +
V"string_value" +
V"real_value" +
V"array" +
V"object",
null_value =
attr("null", nil),
bool_value =
attr("true", true) + attr("false", false),
string_value =
ws * P'"' * C((P'\\"' + 1 - P'"')^0) * P'"' * ws,
real_value =
ws * real * ws,
array =
lit"[" * Ct((V"value" * lit","^-1)^0) * lit"]",
member_pair =
Cg(V"string_value" * lit":" * V"value") * lit","^-1,
object =
lit"{" * Cf(Ct"" * V"member_pair"^0, rawset) * lit"}"
}
return { parse = function(str) return assert(json:match(str)) end }
end
local socket = require("socket")
local json = json_parser()
local file = io.open("sample-true.json")
local start = socket.gettime()
tab = json.parse(file:read("*all"))
texio.write_nl("Time passed parsing JSON: " .. socket.gettime() - start .. " s\string\n")
file:close()
\end{luacode}
答案1
luacode 环境仍然执行 tex 命令,因此 \t 爆炸。使用 luacode* 环境:
\documentclass{article}
\usepackage{luacode}
% gives error:
\begin{luacode}
-- \t
\end{luacode}
% works:
\begin{luacode*}
-- \t
\end{luacode*}
\begin{document}
bkbkbk
\end{document}