From e0d7551897dea8de214cc9d1fe24e51e74fc0e0b Mon Sep 17 00:00:00 2001 From: Li Jin Date: Fri, 9 Aug 2024 15:46:26 +0800 Subject: add builtin macro $to_ast(). --- src/yuescript/yue_compiler.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src') diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 533a666..a5b6666 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -6300,6 +6300,30 @@ private: auto res = "yue.is_ast("s + join(argStrs, ","sv) + ')'; lua_pushlstring(L, res.c_str(), res.size()); // cur res return std::nullopt; + } else if (macroName == "to_ast"sv) { + if (!argStrs.empty() && args && !args->empty()) { + if (!_parser.hasAST(argStrs.front())) { + throw CompileError("invalid AST name"sv, args->front()); + } else { + argStrs.front() = '"' + argStrs.front() + '"'; + if (argStrs.size() >= 2) { + // name, code, level -> code, level, name + auto name = argStrs.front(); + argStrs.pop_front(); + auto code = argStrs.front(); + argStrs.pop_front(); + if (argStrs.empty()) { + argStrs.push_back("0"s); + } + argStrs.push_front(code); + argStrs.push_back(name); + } + } + } + lua_pop(L, 1); // cur + auto res = "yue.to_ast("s + join(argStrs, ","sv) + ')'; + lua_pushlstring(L, res.c_str(), res.size()); // cur res + return std::nullopt; } else { throw CompileError("can not resolve macro"sv, x); } -- cgit v1.2.3-55-g6feb