diff options
author | Li Jin <dragon-fly@qq.com> | 2024-08-09 15:46:26 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2024-08-09 15:46:26 +0800 |
commit | e0d7551897dea8de214cc9d1fe24e51e74fc0e0b (patch) | |
tree | e8944e979bbdee7ff3c5f18525b961f31f198e6f | |
parent | f2b63cb849ea2f7ef571b82e7927cd4abef4414b (diff) | |
download | yuescript-e0d7551897dea8de214cc9d1fe24e51e74fc0e0b.tar.gz yuescript-e0d7551897dea8de214cc9d1fe24e51e74fc0e0b.tar.bz2 yuescript-e0d7551897dea8de214cc9d1fe24e51e74fc0e0b.zip |
add builtin macro $to_ast().
-rw-r--r-- | src/yuescript/yue_compiler.cpp | 24 |
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 | } |