From 44069ba29baf423d73e0d2752f0abc7df46fbbb6 Mon Sep 17 00:00:00 2001
From: Harrison <53527582+HTV04@users.noreply.github.com>
Date: Thu, 1 Dec 2022 20:11:13 -0500
Subject: Improve number literal support (#118)

---
 src/yuescript/yue_parser.cpp | 16 ++++++++++++----
 src/yuescript/yue_parser.h   |  1 +
 2 files changed, 13 insertions(+), 4 deletions(-)

(limited to 'src')

diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp
index 1ff772b..63c9162 100644
--- a/src/yuescript/yue_parser.cpp
+++ b/src/yuescript/yue_parser.cpp
@@ -50,13 +50,23 @@ YueParser::YueParser() {
 	EmptyLine = SpaceBreak;
 	AlphaNum = range('a', 'z') | range('A', 'Z') | range('0', '9') | '_';
 	Name = (range('a', 'z') | range('A', 'Z') | '_') >> *AlphaNum;
-	num_expo = set("eE") >> -expr('-') >> num_char;
+	num_expo = set("eE") >> -set("+-") >> num_char;
+	num_expo_hex = set("pP") >> -set("+-") >> num_char;
 	lj_num = -set("uU") >> set("lL") >> set("lL");
 	num_char = range('0', '9') >> *(range('0', '9') | expr('_') >> and_(range('0', '9')));
 	num_char_hex = range('0', '9') | range('a', 'f') | range('A', 'F');
 	num_lit = num_char_hex >> *(num_char_hex | expr('_') >> and_(num_char_hex));
 	Num = (
-		"0x" >> +num_lit >> -lj_num
+		"0x." >> +num_lit >> -num_expo_hex
+	) | (
+		"0x" >> +num_lit >> (
+			'.' >> +num_lit >> -num_expo_hex |
+			num_expo_hex |
+			lj_num |
+			true_()
+		)
+	) | (
+		'.' >> +num_char >> -num_expo
 	) | (
 		+num_char >> (
 			'.' >> +num_char >> -num_expo |
@@ -64,8 +74,6 @@ YueParser::YueParser() {
 			lj_num |
 			true_()
 		)
-	) | (
-		'.' >> +num_char >> -num_expo
 	);
 
 	Cut = false_();
diff --git a/src/yuescript/yue_parser.h b/src/yuescript/yue_parser.h
index a4ecafd..c37894c 100644
--- a/src/yuescript/yue_parser.h
+++ b/src/yuescript/yue_parser.h
@@ -123,6 +123,7 @@ private:
 	rule num_char_hex;
 	rule num_lit;
 	rule num_expo;
+	rule num_expo_hex;
 	rule lj_num;
 	rule plain_space;
 	rule Break;
-- 
cgit v1.2.3-55-g6feb