elua: initial xgettext call parsing

This commit is contained in:
Daniel Kolesa 2014-06-04 15:08:07 +01:00
parent 890660d485
commit 822c517f93
1 changed files with 49 additions and 29 deletions

View File

@ -147,7 +147,7 @@ local parse_arglist = function(ls)
return rets
end
local parse_call = function(ls)
local parse_kwcall = function(ls)
local tok = ls.token
if tok.name == "(" then
local line = ls.line_number
@ -169,22 +169,12 @@ local parse_call = function(ls)
end
end
local parse = function(ls, keywords)
yield()
local parse_kw = function(ls, keywords)
local tok = ls.token
while tok.name ~= "<eof>" do
if tok.name == "<comment>" then
saved_comments[#saved_comments + 1] = tok.value
ls:get()
elseif tok.name == "<flagcomment>" then
saved_flagcomments[#saved_flagcomments + 1] = tok.value
ls:get()
elseif tok.name == "<name>" and keywords[tok.value] then
local line = ls.line_number
local kw = keywords[tok.value]
ls:get()
local status, args = pcall(parse_call, ls)
if status then
local args = parse_kwcall(ls)
local n1, n2, cx, an = kw[1], kw[2], kw.context, kw.argnum
local n1arg, n2arg, cxarg = args[n1], args[n2], args[cx]
local n1argt, n2argt, cxargt = n1arg and (n1arg[2] ~= "<name>"),
@ -203,8 +193,37 @@ local parse = function(ls, keywords)
sc = tconc(sc, "\n")
local fsc = saved_flagcomments
saved_flagcomments = {}
String(n1arg[1], n2 and n2arg[1] or nil, cx and cxarg[1] or nil,
sc, kw.xcomment, fsc, line):generate()
return String(n1arg[1], n2 and n2arg[1] or nil, cx and cxarg[1] or nil,
sc, kw.xcomment, fsc, line)
end
local parse_fg = function(ls, flags, keywords)
error("NYI")
end
local parse = function(ls, keywords, flags)
yield()
local tok = ls.token
while tok.name ~= "<eof>" do
if tok.name == "<comment>" then
saved_comments[#saved_comments + 1] = tok.value
ls:get()
elseif tok.name == "<flagcomment>" then
saved_flagcomments[#saved_flagcomments + 1] = tok.value
ls:get()
elseif tok.name == "<name>" then
if keywords[tok.value] then
local status, str = pcall(parse_kw, keywords)
if status then
str:generate()
end
elseif flags[tok.value] then
local status, call = pcall(parse_fg, flags, keywords)
if status then
call:generate()
end
else
ls:get()
end
else
ls:get()
@ -242,7 +261,8 @@ end
return { init = function (chunkname, input, keywords, flags, opts)
local ls = lexer.init(chunkname, input, flags, opts)
ls:get()
local coro = coroutine.wrap(opts["a"] and parse_all or parse, ls, keywords)
local coro = coroutine.wrap(opts["a"] and parse_all or parse, ls,
keywords, flags)
coro(ls, keywords)
return coro
end }