aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2024-08-09 15:46:26 +0800
committerLi Jin <dragon-fly@qq.com>2024-08-09 15:46:26 +0800
commite0d7551897dea8de214cc9d1fe24e51e74fc0e0b (patch)
treee8944e979bbdee7ff3c5f18525b961f31f198e6f
parentf2b63cb849ea2f7ef571b82e7927cd4abef4414b (diff)
downloadyuescript-e0d7551897dea8de214cc9d1fe24e51e74fc0e0b.tar.gz
yuescript-e0d7551897dea8de214cc9d1fe24e51e74fc0e0b.tar.bz2
yuescript-e0d7551897dea8de214cc9d1fe24e51e74fc0e0b.zip
add builtin macro $to_ast().
-rw-r--r--src/yuescript/yue_compiler.cpp24
1 files changed, 24 insertions, 0 deletions
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:
6300 auto res = "yue.is_ast("s + join(argStrs, ","sv) + ')'; 6300 auto res = "yue.is_ast("s + join(argStrs, ","sv) + ')';
6301 lua_pushlstring(L, res.c_str(), res.size()); // cur res 6301 lua_pushlstring(L, res.c_str(), res.size()); // cur res
6302 return std::nullopt; 6302 return std::nullopt;
6303 } else if (macroName == "to_ast"sv) {
6304 if (!argStrs.empty() && args && !args->empty()) {
6305 if (!_parser.hasAST(argStrs.front())) {
6306 throw CompileError("invalid AST name"sv, args->front());
6307 } else {
6308 argStrs.front() = '"' + argStrs.front() + '"';
6309 if (argStrs.size() >= 2) {
6310 // name, code, level -> code, level, name
6311 auto name = argStrs.front();
6312 argStrs.pop_front();
6313 auto code = argStrs.front();
6314 argStrs.pop_front();
6315 if (argStrs.empty()) {
6316 argStrs.push_back("0"s);
6317 }
6318 argStrs.push_front(code);
6319 argStrs.push_back(name);
6320 }
6321 }
6322 }
6323 lua_pop(L, 1); // cur
6324 auto res = "yue.to_ast("s + join(argStrs, ","sv) + ')';
6325 lua_pushlstring(L, res.c_str(), res.size()); // cur res
6326 return std::nullopt;
6303 } else { 6327 } else {
6304 throw CompileError("can not resolve macro"sv, x); 6328 throw CompileError("can not resolve macro"sv, x);
6305 } 6329 }