summaryrefslogtreecommitdiff
path: root/vala
diff options
context:
space:
mode:
authorwszqkzqk <wszqkzqk@qq.com>2022-12-09 20:07:59 +0800
committerRico Tzschichholz <ricotz@ubuntu.com>2023-01-30 15:04:26 +0100
commit54ca3c304d252eda7fe7ee50014ca28a3b68dd19 (patch)
treed0d1e349b70e1228a66c984c5a1e9d2b72e35fc6 /vala
parent760e1041346593bec39897b21eb965f8d1f7dbd2 (diff)
downloadvala-54ca3c304d252eda7fe7ee50014ca28a3b68dd19.tar.gz
vala: Add support for Hexadecimal floating point literals
https://gcc.gnu.org/onlinedocs/gcc/Hex-Floats.html#Hex-Floats
Diffstat (limited to 'vala')
-rw-r--r--vala/valarealliteral.vala27
-rw-r--r--vala/valascanner.vala24
2 files changed, 46 insertions, 5 deletions
diff --git a/vala/valarealliteral.vala b/vala/valarealliteral.vala
index 86e7cf5c1..07d28dbe8 100644
--- a/vala/valarealliteral.vala
+++ b/vala/valarealliteral.vala
@@ -65,15 +65,34 @@ public class Vala.RealLiteral : Literal {
checked = true;
string type_name;
- if (value.has_suffix ("f") || value.has_suffix ("F")) {
- type_name ="float";
- } else {
+ int suf_len = 0;
+
+ switch (value[value.length - 1]) {
+ case 'f':
+ case 'F':
+ suf_len = 1;
+ type_name = "float";
+ break;
+ case 'd':
+ case 'D':
+ suf_len = 1;
type_name = "double";
+ break;
+ default:
+ type_name = "double";
+ break;
}
- if (value.has_suffix ("e") || value.has_suffix ("E") || value.has_suffix ("+") || value.has_suffix ("-")) {
+ switch (value[value.length - suf_len - 1]) {
+ case 'e':
+ case 'E':
+ case 'p':
+ case 'P':
+ case '+':
+ case '-':
Report.error (source_reference, "exponent has no digits");
error = true;
+ break;
}
var st = (Struct) context.root.scope.lookup (type_name);
diff --git a/vala/valascanner.vala b/vala/valascanner.vala
index f6f4cd7bf..a198ed72a 100644
--- a/vala/valascanner.vala
+++ b/vala/valascanner.vala
@@ -611,11 +611,33 @@ public class Vala.Scanner {
switch (current[1]) {
case 'x':
case 'X':
- // hexadecimal integer literal
+ // hexadecimal literal
current += 2;
while (current < end && current[0].isxdigit ()) {
current++;
}
+ // fractional part
+ // hexadecimal fractional part
+ if (current < end - 1 && current[0] == '.' && current[1].isxdigit ()) {
+ type = TokenType.REAL_LITERAL;
+ current++;
+ while (current < end && current[0].isxdigit ()) {
+ current++;
+ }
+ }
+ // hexadecimal exponent part
+ if (current < end && current[0].tolower () == 'p') {
+ type = TokenType.REAL_LITERAL;
+ current++;
+ if (current < end && (current[0] == '+' || current[0] == '-')) {
+ current++;
+ }
+ while (current < end && current[0].isdigit ()) {
+ current++;
+ }
+ } else if (type == TokenType.REAL_LITERAL) {
+ Report.error (get_source_reference (1), "hexadecimal floating constants require an exponent");
+ }
break;
case 'b':
case 'B':