aboutsummaryrefslogtreecommitdiff
path: root/src/yuescript/yue_parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/yuescript/yue_parser.cpp')
-rw-r--r--src/yuescript/yue_parser.cpp34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp
index 1011a49..eebc676 100644
--- a/src/yuescript/yue_parser.cpp
+++ b/src/yuescript/yue_parser.cpp
@@ -639,7 +639,15 @@ YueParser::YueParser() {
639 DoubleStringInner = +(not_("#{") >> double_string_plain); 639 DoubleStringInner = +(not_("#{") >> double_string_plain);
640 DoubleStringContent = DoubleStringInner | interp; 640 DoubleStringContent = DoubleStringInner | interp;
641 DoubleString = '"' >> Seperator >> *DoubleStringContent >> '"'; 641 DoubleString = '"' >> Seperator >> *DoubleStringContent >> '"';
642 String = DoubleString | SingleString | LuaString; 642
643 YAMLLineInner = +('\\' >> set("\"\\#") | not_("#{" | stop) >> any_char);
644 YAMLLineContent = YAMLLineInner | interp;
645 YAMLLine = check_indent_match >> Seperator >> +YAMLLineContent |
646 advance_match >> Seperator >> ensure(+YAMLLineContent, pop_indent) |
647 Seperator >> *set(" \t") >> and_(line_break);
648 YAMLMultiline = '|' >> Seperator >> +space_break >> advance_match >> ensure(YAMLLine >> *(*set(" \t") >> line_break >> YAMLLine), pop_indent);
649
650 String = DoubleString | SingleString | LuaString | YAMLMultiline;
643 651
644 lua_string_open = '[' >> *expr('=') >> '['; 652 lua_string_open = '[' >> *expr('=') >> '[';
645 lua_string_close = ']' >> *expr('=') >> ']'; 653 lua_string_close = ']' >> *expr('=') >> ']';
@@ -883,11 +891,11 @@ YueParser::YueParser() {
883 891
884 fn_arg_def_lit_lines = fn_arg_def_lit_line >> *(-(space >> ',') >> space_break >> fn_arg_def_lit_line); 892 fn_arg_def_lit_lines = fn_arg_def_lit_line >> *(-(space >> ',') >> space_break >> fn_arg_def_lit_line);
885 893
886 FnArgDef = (Variable | SelfItem >> -ExistentialOp) >> -(space >> '=' >> space >> Exp); 894 FnArgDef = (Variable | SelfItem >> -ExistentialOp) >> -(space >> '`' >> space >> Name) >> -(space >> '=' >> space >> Exp);
887 895
888 FnArgDefList = Seperator >> ( 896 FnArgDefList = Seperator >> (
889 fn_arg_def_lit_lines >> -(-(space >> ',') >> white >> VarArg) | 897 fn_arg_def_lit_lines >> -(-(space >> ',') >> white >> VarArg >> -(space >> '`' >> space >> Name)) |
890 white >> VarArg 898 white >> VarArg >> -(space >> '`' >> space >> Name)
891 ); 899 );
892 900
893 OuterVarShadow = key("using") >> space >> (NameList | key("nil")); 901 OuterVarShadow = key("using") >> space >> (NameList | key("nil"));
@@ -1176,6 +1184,24 @@ void trim(std::string& str) {
1176 str.erase(0, str.find_first_not_of(" \t\r\n")); 1184 str.erase(0, str.find_first_not_of(" \t\r\n"));
1177 str.erase(str.find_last_not_of(" \t\r\n") + 1); 1185 str.erase(str.find_last_not_of(" \t\r\n") + 1);
1178} 1186}
1187
1188std::string toLuaString(const std::string& input) {
1189 std::string luaStr = "\"";
1190 for (char c : input) {
1191 switch (c) {
1192 case '\"': luaStr += "\\\""; break;
1193 case '\\': luaStr += "\\\\"; break;
1194 case '\n': luaStr += "\\n"; break;
1195 case '\r': luaStr += "\\r"; break;
1196 case '\t': luaStr += "\\t"; break;
1197 default:
1198 luaStr += c;
1199 break;
1200 }
1201 }
1202 luaStr += "\"";
1203 return luaStr;
1204}
1179} // namespace Utils 1205} // namespace Utils
1180 1206
1181std::string ParseInfo::errorMessage(std::string_view msg, int errLine, int errCol, int lineOffset) const { 1207std::string ParseInfo::errorMessage(std::string_view msg, int errLine, int errCol, int lineOffset) const {