aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2025-07-18 11:51:39 +0800
committerLi Jin <dragon-fly@qq.com>2025-07-18 11:51:39 +0800
commit9d3d8ef2be15dfbf279de71241ff747a568e2c49 (patch)
tree53f88fa8a0e64dfa2262898312c9b4d988876fe8 /src
parent51a74726e6f68851bafccba0fe69900274a81d59 (diff)
downloadyuescript-9d3d8ef2be15dfbf279de71241ff747a568e2c49.tar.gz
yuescript-9d3d8ef2be15dfbf279de71241ff747a568e2c49.tar.bz2
yuescript-9d3d8ef2be15dfbf279de71241ff747a568e2c49.zip
Added specs, tests and docs.
Diffstat (limited to 'src')
-rw-r--r--src/yuescript/yue_compiler.cpp46
-rw-r--r--src/yuescript/yue_parser.cpp4
-rw-r--r--src/yuescript/yue_parser.h2
3 files changed, 29 insertions, 23 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp
index 3768fc9..a8d222d 100644
--- a/src/yuescript/yue_compiler.cpp
+++ b/src/yuescript/yue_compiler.cpp
@@ -5440,7 +5440,7 @@ private:
5440 if (def->defaultValue) { 5440 if (def->defaultValue) {
5441 defVal = _parser.toString(def->defaultValue); 5441 defVal = _parser.toString(def->defaultValue);
5442 Utils::trim(defVal); 5442 Utils::trim(defVal);
5443 defVal = '=' + Utils::toLuaString(defVal); 5443 defVal = '=' + Utils::toLuaDoubleString(defVal);
5444 } 5444 }
5445 newArgs.emplace_back(_parser.toString(def->name) + defVal); 5445 newArgs.emplace_back(_parser.toString(def->name) + defVal);
5446 } 5446 }
@@ -9185,15 +9185,34 @@ private:
9185 auto line = static_cast<YAMLLine_t*>(line_); 9185 auto line = static_cast<YAMLLine_t*>(line_);
9186 if (!line->segments.empty()) { 9186 if (!line->segments.empty()) {
9187 str_list segs; 9187 str_list segs;
9188 bool firstSeg = true;
9188 for (auto seg_ : line->segments.objects()) { 9189 for (auto seg_ : line->segments.objects()) {
9189 auto content = static_cast<YAMLLineContent_t*>(seg_)->content.get(); 9190 auto content = static_cast<YAMLLineContent_t*>(seg_)->content.get();
9190 switch (content->get_id()) { 9191 switch (content->get_id()) {
9191 case id<YAMLLineInner_t>(): { 9192 case id<YAMLLineInner_t>(): {
9192 auto str = _parser.toString(content); 9193 auto seg = _parser.toString(content);
9193 Utils::replace(str, "\r\n"sv, "\n"sv); 9194 if (!indent) {
9194 Utils::replace(str, "\n"sv, "\\n"sv); 9195 auto pos = seg.find_first_not_of("\t "sv);
9195 Utils::replace(str, "\\#"sv, "#"sv); 9196 if (pos == std::string::npos) {
9196 segs.push_back('\"' + str + '\"'); 9197 indent = seg;
9198 firstSeg = false;
9199 continue;
9200 } else {
9201 indent = std::string{seg.c_str(), pos};
9202 }
9203 }
9204 if (firstSeg) {
9205 firstSeg = false;
9206 if (std::string_view{seg}.substr(0, indent.value().size()) != indent.value()) {
9207 throw CompileError("inconsistent indent"sv, line);
9208 }
9209 auto seqStr = seg.substr(indent.value().size());
9210 if (!seqStr.empty()) {
9211 segs.push_back(Utils::toLuaDoubleString(seqStr));
9212 }
9213 } else {
9214 segs.push_back(Utils::toLuaDoubleString(seg));
9215 }
9197 break; 9216 break;
9198 } 9217 }
9199 case id<Exp_t>(): { 9218 case id<Exp_t>(): {
@@ -9204,20 +9223,7 @@ private:
9204 default: YUEE("AST node mismatch", content); break; 9223 default: YUEE("AST node mismatch", content); break;
9205 } 9224 }
9206 } 9225 }
9207 auto lineStr = join(segs, " .. "sv); 9226 temp.push_back(join(segs, " .. "sv));
9208 if (!indent) {
9209 auto pos = lineStr.find_first_not_of("\t "sv, 1);
9210 if (pos == std::string::npos) {
9211 throw CompileError("expecting first line indent"sv, line);
9212 }
9213 indent = std::string{lineStr.c_str(), pos};
9214 } else {
9215 if (std::string_view{lineStr}.substr(0, indent.value().size()) != indent.value()) {
9216 throw CompileError("inconsistent indent"sv, line);
9217 }
9218 }
9219 lineStr = '"' + lineStr.substr(indent.value().size());
9220 temp.push_back(lineStr);
9221 } 9227 }
9222 } 9228 }
9223 auto str = join(temp, " .. '\\n' .. "sv); 9229 auto str = join(temp, " .. '\\n' .. "sv);
diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp
index eebc676..2e21a52 100644
--- a/src/yuescript/yue_parser.cpp
+++ b/src/yuescript/yue_parser.cpp
@@ -645,7 +645,7 @@ YueParser::YueParser() {
645 YAMLLine = check_indent_match >> Seperator >> +YAMLLineContent | 645 YAMLLine = check_indent_match >> Seperator >> +YAMLLineContent |
646 advance_match >> Seperator >> ensure(+YAMLLineContent, pop_indent) | 646 advance_match >> Seperator >> ensure(+YAMLLineContent, pop_indent) |
647 Seperator >> *set(" \t") >> and_(line_break); 647 Seperator >> *set(" \t") >> and_(line_break);
648 YAMLMultiline = '|' >> Seperator >> +space_break >> advance_match >> ensure(YAMLLine >> *(*set(" \t") >> line_break >> YAMLLine), pop_indent); 648 YAMLMultiline = '|' >> space >> Seperator >> +(*set(" \t") >> line_break) >> advance_match >> ensure(YAMLLine >> *(*set(" \t") >> line_break >> YAMLLine), pop_indent);
649 649
650 String = DoubleString | SingleString | LuaString | YAMLMultiline; 650 String = DoubleString | SingleString | LuaString | YAMLMultiline;
651 651
@@ -1185,7 +1185,7 @@ void trim(std::string& str) {
1185 str.erase(str.find_last_not_of(" \t\r\n") + 1); 1185 str.erase(str.find_last_not_of(" \t\r\n") + 1);
1186} 1186}
1187 1187
1188std::string toLuaString(const std::string& input) { 1188std::string toLuaDoubleString(const std::string& input) {
1189 std::string luaStr = "\""; 1189 std::string luaStr = "\"";
1190 for (char c : input) { 1190 for (char c : input) {
1191 switch (c) { 1191 switch (c) {
diff --git a/src/yuescript/yue_parser.h b/src/yuescript/yue_parser.h
index 15f9277..f4e0ab1 100644
--- a/src/yuescript/yue_parser.h
+++ b/src/yuescript/yue_parser.h
@@ -457,7 +457,7 @@ private:
457namespace Utils { 457namespace Utils {
458void replace(std::string& str, std::string_view from, std::string_view to); 458void replace(std::string& str, std::string_view from, std::string_view to);
459void trim(std::string& str); 459void trim(std::string& str);
460std::string toLuaString(const std::string& input); 460std::string toLuaDoubleString(const std::string& input);
461} // namespace Utils 461} // namespace Utils
462 462
463} // namespace yue 463} // namespace yue