diff options
author | wszqkzqk <wszqkzqk@qq.com> | 2022-12-09 20:07:59 +0800 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2023-01-30 15:04:26 +0100 |
commit | 54ca3c304d252eda7fe7ee50014ca28a3b68dd19 (patch) | |
tree | d0d1e349b70e1228a66c984c5a1e9d2b72e35fc6 /vala | |
parent | 760e1041346593bec39897b21eb965f8d1f7dbd2 (diff) | |
download | vala-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.vala | 27 | ||||
-rw-r--r-- | vala/valascanner.vala | 24 |
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': |