From 812a601548e65ada85406be7a9f0f1ad86d3c378 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Fri, 23 May 2014 15:43:12 +0100 Subject: [PATCH] elua: extend the xgettext parser a bit --- src/bin/elua/modules/xgettext/lexer.lua | 6 ++- src/bin/elua/modules/xgettext/parser.lua | 55 ++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/bin/elua/modules/xgettext/lexer.lua b/src/bin/elua/modules/xgettext/lexer.lua index 5af0f34221..d379e1dec0 100644 --- a/src/bin/elua/modules/xgettext/lexer.lua +++ b/src/bin/elua/modules/xgettext/lexer.lua @@ -28,6 +28,10 @@ local lex_error = function(ls, msg, tok) error(msg, 0) end +local syntax_error = function(ls, msg) + lex_error(ls, msg, ls.token.value or ls.token.name) +end + local next_char = function(ls) local c = ls.reader() ls.current = c @@ -282,4 +286,4 @@ return { init = function(chunkname, input) ls.coro = coro coro(ls) return coro -end } \ No newline at end of file +end, syntax_error = syntax_error } \ No newline at end of file diff --git a/src/bin/elua/modules/xgettext/parser.lua b/src/bin/elua/modules/xgettext/parser.lua index 6474a3ce59..69f9e59aa5 100644 --- a/src/bin/elua/modules/xgettext/parser.lua +++ b/src/bin/elua/modules/xgettext/parser.lua @@ -2,10 +2,62 @@ local lexer = require("xgettext.lexer") +local syntax_error = lexer.syntax_error + local yield = coroutine.yield local saved_comments = {} +local check_match = function(ls, a, b, line) + if ls.token.name ~= a then + if line == ls.line_number then + syntax_error(ls, "'" .. a .. "' expected") + else + syntax_error(ls, "'" .. a .. "' expected (to close '" .. b + .. "' at line " .. line .. ")") + end + end +end + +local parse_arg = function(ls) + local plevel = 0 +end + +local parse_arglist = function(ls) + local tok = ls.token + local rets = {} + while true do + rets[#rets + 1] = parse_arg(ls) + if tok.name == "," then + ls:get() + else + break + end + end +end + +local parse_call = function(ls) + local tok = ls.token + if tok.name == "(" then + local line = ls.line_number + ls:get() + if tok.name == ")" then + ls:get() + return {} + end + local al = parse_arglist(ls) + check_match(ls, ")", "(", line) + ls:get() + return al + elseif tok.name == "" then + local v = tok.value + ls:get() + return { v } + else + return nil + end +end + local parse = function(ls, keywords) yield() local tok = ls.token @@ -14,6 +66,9 @@ local parse = function(ls, keywords) saved_comments[#saved_comments + 1] = tok.value ls:get() elseif tok.name == "" and keywords[tok.value] then + local kw = keywords[tok.value] + ls:get() + local cmt = saved_comments[#saved_comments] saved_comments = {} else