diff options
Diffstat (limited to 'src/yuescript/yue_parser.cpp')
-rw-r--r-- | src/yuescript/yue_parser.cpp | 34 |
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 | |||
1188 | std::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 | ||
1181 | std::string ParseInfo::errorMessage(std::string_view msg, int errLine, int errCol, int lineOffset) const { | 1207 | std::string ParseInfo::errorMessage(std::string_view msg, int errLine, int errCol, int lineOffset) const { |