aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--makefile2
-rw-r--r--spec/inputs/literals.yue9
-rw-r--r--spec/outputs/5.1/literals.lua44
-rw-r--r--spec/outputs/literals.lua8
-rw-r--r--src/yuescript/yue_compiler.cpp31
-rw-r--r--src/yuescript/yue_parser.cpp28
-rw-r--r--src/yuescript/yue_parser.h1
7 files changed, 110 insertions, 13 deletions
diff --git a/makefile b/makefile
index d7e85d3..d1b074a 100644
--- a/makefile
+++ b/makefile
@@ -391,6 +391,7 @@ test: debug
391 @./$(BIN_NAME) $(TEST_INPUT)/try_catch.yue -o $(TEST_OUTPUT)/5.1/try_catch.lua --target=5.1 391 @./$(BIN_NAME) $(TEST_INPUT)/try_catch.yue -o $(TEST_OUTPUT)/5.1/try_catch.lua --target=5.1
392 @./$(BIN_NAME) $(TEST_INPUT)/attrib.yue -o $(TEST_OUTPUT)/5.1/attrib.lua --target=5.1 392 @./$(BIN_NAME) $(TEST_INPUT)/attrib.yue -o $(TEST_OUTPUT)/5.1/attrib.lua --target=5.1
393 @./$(BIN_NAME) $(TEST_INPUT)/test/loops_spec.yue -o $(TEST_OUTPUT)/5.1/test/loops_spec.lua --target=5.1 393 @./$(BIN_NAME) $(TEST_INPUT)/test/loops_spec.yue -o $(TEST_OUTPUT)/5.1/test/loops_spec.lua --target=5.1
394 @./$(BIN_NAME) $(TEST_INPUT)/literals.yue -o $(TEST_OUTPUT)/5.1/literals.lua --target=5.1
394 @./$(BIN_NAME) -e spec/inputs/compile_doc.yue $(TEST_OUTPUT) 395 @./$(BIN_NAME) -e spec/inputs/compile_doc.yue $(TEST_OUTPUT)
395 @echo -en "Compile time: " 396 @echo -en "Compile time: "
396 @$(END_TIME) 397 @$(END_TIME)
@@ -409,6 +410,7 @@ gen: release
409 @./$(BIN_NAME) $(TEST_INPUT)/loops.yue -o $(GEN_OUTPUT)/5.1/loops.lua --target=5.1 410 @./$(BIN_NAME) $(TEST_INPUT)/loops.yue -o $(GEN_OUTPUT)/5.1/loops.lua --target=5.1
410 @./$(BIN_NAME) $(TEST_INPUT)/try_catch.yue -o $(GEN_OUTPUT)/5.1/try_catch.lua --target=5.1 411 @./$(BIN_NAME) $(TEST_INPUT)/try_catch.yue -o $(GEN_OUTPUT)/5.1/try_catch.lua --target=5.1
411 @./$(BIN_NAME) $(TEST_INPUT)/attrib.yue -o $(GEN_OUTPUT)/5.1/attrib.lua --target=5.1 412 @./$(BIN_NAME) $(TEST_INPUT)/attrib.yue -o $(GEN_OUTPUT)/5.1/attrib.lua --target=5.1
413 @./$(BIN_NAME) $(TEST_INPUT)/literals.yue -o $(GEN_OUTPUT)/5.1/literals.lua --target=5.1
412 @./$(BIN_NAME) $(TEST_INPUT)/test/loops_spec.yue -o $(GEN_OUTPUT)/5.1/test/loops_spec.lua --target=5.1 414 @./$(BIN_NAME) $(TEST_INPUT)/test/loops_spec.yue -o $(GEN_OUTPUT)/5.1/test/loops_spec.lua --target=5.1
413 @./$(BIN_NAME) -e spec/inputs/compile_doc.yue $(GEN_OUTPUT) 415 @./$(BIN_NAME) -e spec/inputs/compile_doc.yue $(GEN_OUTPUT)
414 @echo -en "Compile time: " 416 @echo -en "Compile time: "
diff --git a/spec/inputs/literals.yue b/spec/inputs/literals.yue
index 6b666f0..32cf7e7 100644
--- a/spec/inputs/literals.yue
+++ b/spec/inputs/literals.yue
@@ -10,10 +10,19 @@ _ = {
10 0xfF2323 10 0xfF2323
11 0xabcdef 11 0xabcdef
12 0xABCDEF 12 0xABCDEF
13 0XFB_C4_00
13 0x123p-123 14 0x123p-123
14 0xABCP+321 15 0xABCP+321
15 0x.1p-111 16 0x.1p-111
16 0xA_B_CP-3_2_1 17 0xA_B_CP-3_2_1
18 0x0.1E
19 0xA23p-4
20 0X1.921FB54442D18P+1
21
22 0b01
23 0b00_00_10_00
24 0B1111
25 0B00_11_00_10_01
17 26
18 .2323 27 .2323
19 .2323e-1 28 .2323e-1
diff --git a/spec/outputs/5.1/literals.lua b/spec/outputs/5.1/literals.lua
new file mode 100644
index 0000000..36c705a
--- /dev/null
+++ b/spec/outputs/5.1/literals.lua
@@ -0,0 +1,44 @@
1local _ = {
2 121,
3 121.2323,
4 121.2323e-1,
5 121.2323e13434,
6 2323E34,
7 0x12323,
8 0xfF2323,
9 0xabcdef,
10 0xABCDEF,
11 0XFBC400,
12 2.7365508487142853e-35,
13 0xABCP321,
14 2.4074124304840448e-35,
15 6.4326233113470805e-94,
16 0.1171875,
17 162.1875,
18 3.1415926535897931,
19 1,
20 8,
21 15,
22 201,
23 .2323,
24 .2323e-1,
25 .2323e13434,
26 1LL,
27 1ULL,
28 9332LL,
29 9332,
30 0x2aLL,
31 0x2aULL,
32 1000000.0000001,
33 1234e5678,
34 1234E-5678,
35 0xDEADBEEF,
36 [[ hello world ]],
37 [=[ hello world ]=],
38 [====[ hello world ]====],
39 "another world",
40 'what world',
41 "\n hello world\n ",
42 'yeah\n what is going on\n here is something cool'
43}
44return nil
diff --git a/spec/outputs/literals.lua b/spec/outputs/literals.lua
index a578d58..6de5411 100644
--- a/spec/outputs/literals.lua
+++ b/spec/outputs/literals.lua
@@ -8,10 +8,18 @@ local _ = {
8 0xfF2323, 8 0xfF2323,
9 0xabcdef, 9 0xabcdef,
10 0xABCDEF, 10 0xABCDEF,
11 0XFBC400,
11 0x123p-123, 12 0x123p-123,
12 0xABCP+321, 13 0xABCP+321,
13 0x.1p-111, 14 0x.1p-111,
14 0xABCP-321, 15 0xABCP-321,
16 0x0.1E,
17 0xA23p-4,
18 0X1.921FB54442D18P+1,
19 1,
20 8,
21 15,
22 201,
15 .2323, 23 .2323,
16 .2323e-1, 24 .2323e-1,
17 .2323e13434, 25 .2323e13434,
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
78const std::string_view version = "0.27.4"sv; 80const std::string_view version = "0.27.5"sv;
79const std::string_view extension = "yue"sv; 81const std::string_view extension = "yue"sv;
80 82
81class CompileError : public std::logic_error { 83class 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);