diff options
| author | Li Jin <dragon-fly@qq.com> | 2025-04-17 11:05:06 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2025-04-17 11:05:06 +0800 |
| commit | 0446b12d7be2ba4e8534987864fedfc586510291 (patch) | |
| tree | 3ed0b3efa0b6e4247cf7b4832704f3667fabd2ca /src | |
| parent | 1c47083a8e2fe8a08a9dcf7d4520b4de98134c5d (diff) | |
| download | yuescript-0446b12d7be2ba4e8534987864fedfc586510291.tar.gz yuescript-0446b12d7be2ba4e8534987864fedfc586510291.tar.bz2 yuescript-0446b12d7be2ba4e8534987864fedfc586510291.zip | |
Fixed issue #209.
Diffstat (limited to 'src')
| -rw-r--r-- | src/yuescript/yue_compiler.cpp | 31 | ||||
| -rw-r--r-- | src/yuescript/yue_parser.cpp | 28 | ||||
| -rw-r--r-- | src/yuescript/yue_parser.h | 1 |
3 files changed, 47 insertions, 13 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 68ce9b5..d5db8a1 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
| @@ -16,6 +16,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | |||
| 16 | #include <unordered_set> | 16 | #include <unordered_set> |
| 17 | #include <variant> | 17 | #include <variant> |
| 18 | #include <vector> | 18 | #include <vector> |
| 19 | #include <iomanip> | ||
| 20 | #include <ostream> | ||
| 19 | 21 | ||
| 20 | #include "yuescript/yue_compiler.h" | 22 | #include "yuescript/yue_compiler.h" |
| 21 | #include "yuescript/yue_parser.h" | 23 | #include "yuescript/yue_parser.h" |
| @@ -75,7 +77,7 @@ static std::unordered_set<std::string> Metamethods = { | |||
| 75 | "close"s // Lua 5.4 | 77 | "close"s // Lua 5.4 |
| 76 | }; | 78 | }; |
| 77 | 79 | ||
| 78 | const std::string_view version = "0.27.4"sv; | 80 | const std::string_view version = "0.27.5"sv; |
| 79 | const std::string_view extension = "yue"sv; | 81 | const std::string_view extension = "yue"sv; |
| 80 | 82 | ||
| 81 | class CompileError : public std::logic_error { | 83 | class CompileError : public std::logic_error { |
| @@ -7144,6 +7146,33 @@ private: | |||
| 7144 | void transformNum(Num_t* num, str_list& out) { | 7146 | void transformNum(Num_t* num, str_list& out) { |
| 7145 | std::string numStr = _parser.toString(num); | 7147 | std::string numStr = _parser.toString(num); |
| 7146 | numStr.erase(std::remove(numStr.begin(), numStr.end(), '_'), numStr.end()); | 7148 | numStr.erase(std::remove(numStr.begin(), numStr.end(), '_'), numStr.end()); |
| 7149 | if (numStr.size() > 2 && numStr[0] == '0') { | ||
| 7150 | if (numStr[1] == 'b' || numStr[1] == 'B') { | ||
| 7151 | std::string binaryPart = numStr.substr(2); | ||
| 7152 | try { | ||
| 7153 | unsigned long long value = std::stoull(binaryPart, nullptr, 2); | ||
| 7154 | numStr = std::to_string(value); | ||
| 7155 | } catch (const std::exception& e) { | ||
| 7156 | throw CompileError("invalid binary literal"sv, num); | ||
| 7157 | } | ||
| 7158 | } else if (getLuaTarget(num) < 502) { | ||
| 7159 | if (numStr[1] == 'x' || numStr[1] == 'X') { | ||
| 7160 | if (numStr.find_first_of(".-"sv) != std::string::npos) { | ||
| 7161 | std::stringstream ss(numStr); | ||
| 7162 | double v; | ||
| 7163 | ss >> std::hexfloat >> v; | ||
| 7164 | if (ss.fail() || !std::isfinite(v)) { | ||
| 7165 | throw CompileError("invalid hex‑float literal"sv, num); | ||
| 7166 | } | ||
| 7167 | std::ostringstream outSs; | ||
| 7168 | outSs << std::setprecision(17) << v; | ||
| 7169 | numStr = outSs.str(); | ||
| 7170 | } else { | ||
| 7171 | numStr.erase(std::remove(numStr.begin(), numStr.end(), '+'), numStr.end()); | ||
| 7172 | } | ||
| 7173 | } | ||
| 7174 | } | ||
| 7175 | } | ||
| 7147 | out.push_back(numStr); | 7176 | out.push_back(numStr); |
| 7148 | } | 7177 | } |
| 7149 | 7178 | ||
diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp index ceb1f7c..77c5901 100644 --- a/src/yuescript/yue_parser.cpp +++ b/src/yuescript/yue_parser.cpp | |||
| @@ -67,24 +67,28 @@ YueParser::YueParser() { | |||
| 67 | num_char = range('0', '9') >> *(range('0', '9') | '_' >> and_(range('0', '9'))); | 67 | num_char = range('0', '9') >> *(range('0', '9') | '_' >> and_(range('0', '9'))); |
| 68 | num_char_hex = range('0', '9') | range('a', 'f') | range('A', 'F'); | 68 | num_char_hex = range('0', '9') | range('a', 'f') | range('A', 'F'); |
| 69 | num_lit = num_char_hex >> *(num_char_hex | '_' >> and_(num_char_hex)); | 69 | num_lit = num_char_hex >> *(num_char_hex | '_' >> and_(num_char_hex)); |
| 70 | num_bin_lit = set("01") >> *(set("01") | '_' >> and_(set("01"))); | ||
| 70 | Num = | 71 | Num = |
| 71 | "0x" >> ( | 72 | '0' >> ( |
| 72 | +num_lit >> ( | 73 | set("xX") >> ( |
| 73 | '.' >> +num_lit >> -num_expo_hex | | 74 | num_lit >> ( |
| 74 | num_expo_hex | | 75 | '.' >> num_lit >> -num_expo_hex | |
| 75 | lj_num | | 76 | num_expo_hex | |
| 76 | true_() | 77 | lj_num | |
| 77 | ) | ( | 78 | true_() |
| 78 | '.' >> +num_lit >> -num_expo_hex | 79 | ) | ( |
| 79 | ) | 80 | '.' >> num_lit >> -num_expo_hex |
| 81 | ) | ||
| 82 | ) | | ||
| 83 | set("bB") >> num_bin_lit | ||
| 80 | ) | | 84 | ) | |
| 81 | +num_char >> ( | 85 | num_char >> ( |
| 82 | '.' >> +num_char >> -num_expo | | 86 | '.' >> num_char >> -num_expo | |
| 83 | num_expo | | 87 | num_expo | |
| 84 | lj_num | | 88 | lj_num | |
| 85 | true_() | 89 | true_() |
| 86 | ) | | 90 | ) | |
| 87 | '.' >> +num_char >> -num_expo; | 91 | '.' >> num_char >> -num_expo; |
| 88 | 92 | ||
| 89 | cut = false_(); | 93 | cut = false_(); |
| 90 | Seperator = true_(); | 94 | Seperator = true_(); |
diff --git a/src/yuescript/yue_parser.h b/src/yuescript/yue_parser.h index 02292e1..7281ec3 100644 --- a/src/yuescript/yue_parser.h +++ b/src/yuescript/yue_parser.h | |||
| @@ -164,6 +164,7 @@ private: | |||
| 164 | NONE_AST_RULE(num_char); | 164 | NONE_AST_RULE(num_char); |
| 165 | NONE_AST_RULE(num_char_hex); | 165 | NONE_AST_RULE(num_char_hex); |
| 166 | NONE_AST_RULE(num_lit); | 166 | NONE_AST_RULE(num_lit); |
| 167 | NONE_AST_RULE(num_bin_lit); | ||
| 167 | NONE_AST_RULE(num_expo); | 168 | NONE_AST_RULE(num_expo); |
| 168 | NONE_AST_RULE(num_expo_hex); | 169 | NONE_AST_RULE(num_expo_hex); |
| 169 | NONE_AST_RULE(lj_num); | 170 | NONE_AST_RULE(lj_num); |
