From d8f0d402fe8dcbe1dcbf8b3b1b32610d68178f58 Mon Sep 17 00:00:00 2001 From: Julien Fischer Date: Mon, 16 Jan 2017 16:24:34 +1100 Subject: [PATCH] Document underscores in numeric literals. Standardize terminology in error messages about ill-formed numeric literals. doc/reference_manual.texi: Document underscores in numeric literals. Add a TODO comment about a future piece of work. NEWS: Announce the addition of support for underscores in numeric literals. library/lexer.m: Use the term "literal" instead of "constant" or "token" when referring to numeric literals in error messages. s/hex/hexadecimal/ in those same error messages. tests/hard_coded/parse_number_from_string.exp*: tests/invalid/invalid_{binary,decimal,hex,octal}_literal.err_exp: Conform to the above change in error messages from the lexer. --- NEWS | 3 + doc/reference_manual.texi | 26 +++++- library/lexer.m | 92 +++++++++---------- tests/hard_coded/parse_number_from_string.exp | 62 ++++++------- .../hard_coded/parse_number_from_string.exp2 | 62 ++++++------- .../hard_coded/parse_number_from_string.exp3 | 62 ++++++------- tests/invalid/invalid_binary_literal.err_exp | 12 +-- tests/invalid/invalid_decimal_literal.err_exp | 4 +- tests/invalid/invalid_float_literal.err_exp | 16 ++-- tests/invalid/invalid_hex_literal.err_exp | 12 +-- tests/invalid/invalid_octal_literal.err_exp | 12 +-- 11 files changed, 191 insertions(+), 172 deletions(-) diff --git a/NEWS b/NEWS index a5b3e9f97..8bdd8b2be 100644 --- a/NEWS +++ b/NEWS @@ -141,6 +141,9 @@ Changes to the Mercury language: * The Java backend now supports defining foreign types as primitive Java types. +* Digits in numeric literals may now be separated by underscores in order + to improve readability. + Changes to the Mercury standard library: * We have added variants of the process_options predicates to the getopt diff --git a/doc/reference_manual.texi b/doc/reference_manual.texi index 024be43e8..e198f3fb1 100644 --- a/doc/reference_manual.texi +++ b/doc/reference_manual.texi @@ -310,15 +310,31 @@ A hexadecimal literal is @samp{0x} followed by any sequence of hexadecimal digits. A character-code literal is @samp{0'} followed by any single character. +For decimal, binary, octal and hexadecimal literals, an arbitrary number of +underscores (@samp{_}) may be inserted between the digits. An arbitrary number +of underscores may also be inserted between the radix prefix (i.e. @samp{0b}, +@samp{0o} and @samp{0x}) and the initial digit. +The purpose of the underscores is to improve readability and they do not affect +the numeric value of the literal. + +@c TODO: we should support hexadecimal float literals too. @item float -A floating point literal consists of a sequence of decimal digits, -a decimal point and a sequence of digits (the fraction part), and -the letter @samp{E} (or @samp{e}), an optional sign (@samp{+} or @samp{-}), -and then another sequence of decimal digits (the exponent). +A floating point literal consists of a sequence of decimal digits, a decimal +point (@samp{.}) and a sequence of digits (the fraction part), and the letter +@samp{E} (or @samp{e}), an optional sign (@samp{+} or @samp{-}), and then +another sequence of decimal digits (the exponent). The fraction part or the exponent (but not both) may be omitted. +An arbitrary number of underscores (@samp{_}) may be inserted between the +digits in a floating point literal. +Underscores may @emph{not} occur adjacent to any non-digit characters (i.e. +@samp{.}, @samp{e}, @samp{E}, @samp{+} or @samp{-}) in a floating point +literal. +The purpose of the underscores is to improve readability and they do not affect +the numeric value of the literal. + @item implementation_defined_literal -An implementation-defined literal consists of a dollar sign (@code{$}) +An implementation-defined literal consists of a dollar sign (@samp{$}) followed by an unquoted name. @item open_ct diff --git a/library/lexer.m b/library/lexer.m index 897c38550..0e8966843 100644 --- a/library/lexer.m +++ b/library/lexer.m @@ -2035,7 +2035,7 @@ get_char_code(Stream, Token, !IO) :- Token = io_error(Error) ; Result = eof, - Token = error("unterminated char code constant") + Token = error("unterminated char code literal") ; Result = ok, char.to_int(Char, CharCode), @@ -2051,7 +2051,7 @@ string_get_char_code(String, Len, Posn0, Token, Context, !Posn) :- Token = integer(CharCode), string_get_context(Posn0, Context, !Posn) else - Token = error("unterminated char code constant"), + Token = error("unterminated char code literal"), string_get_context(Posn0, Context, !Posn) ). @@ -2064,7 +2064,7 @@ get_binary(Stream, Token, !IO) :- Token = io_error(Error) ; Result = eof, - Token = error("unterminated binary constant") + Token = error("unterminated binary literal") ; Result = ok, ( if char.is_binary_digit(Char) then @@ -2074,7 +2074,7 @@ get_binary(Stream, Token, !IO) :- get_binary(Stream, Token, !IO) else io.putback_char(Stream, Char, !IO), - Token = error("unterminated binary constant") + Token = error("unterminated binary literal") ) ). @@ -2092,11 +2092,11 @@ string_get_binary(String, Len, Posn0, Token, Context, !Posn) :- string_get_binary(String, Len, Posn1, Token, Context, !Posn) else string_ungetchar(String, !Posn), - Token = error("unterminated binary constant"), + Token = error("unterminated binary literal"), string_get_context(Posn0, Context, !Posn) ) else - Token = error("unterminated binary constant"), + Token = error("unterminated binary literal"), string_get_context(Posn0, Context, !Posn) ). @@ -2115,7 +2115,7 @@ get_binary_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_int(!.RevChars, base_2, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated binary constant") + Token = error("unterminated binary literal") ) ; Result = ok, @@ -2133,7 +2133,7 @@ get_binary_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_int(!.RevChars, base_2, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated binary constant") + Token = error("unterminated binary literal") ) ) ). @@ -2160,7 +2160,7 @@ string_get_binary_2(String, !.LastDigit, Len, Posn1, Token, Context, !Posn) :- conv_string_to_int(BinaryString, base_2, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated binary constant") + Token = error("unterminated binary literal") ), string_get_context(Posn1, Context, !Posn) ) @@ -2171,7 +2171,7 @@ string_get_binary_2(String, !.LastDigit, Len, Posn1, Token, Context, !Posn) :- conv_string_to_int(BinaryString, base_2, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated binary constant") + Token = error("unterminated binary literal") ), string_get_context(Posn1, Context, !Posn) ). @@ -2185,7 +2185,7 @@ get_octal(Stream, Token, !IO) :- Token = io_error(Error) ; Result = eof, - Token = error("unterminated octal constant") + Token = error("unterminated octal literal") ; Result = ok, ( if char.is_octal_digit(Char) then @@ -2195,7 +2195,7 @@ get_octal(Stream, Token, !IO) :- get_octal(Stream, Token, !IO) else io.putback_char(Stream, Char, !IO), - Token = error("unterminated octal constant") + Token = error("unterminated octal literal") ) ). @@ -2213,11 +2213,11 @@ string_get_octal(String, Len, Posn0, Token, Context, !Posn) :- string_get_octal(String, Len, Posn0, Token, Context, !Posn) else string_ungetchar(String, !Posn), - Token = error("unterminated octal constant"), + Token = error("unterminated octal literal"), string_get_context(Posn0, Context, !Posn) ) else - Token = error("unterminated octal constant"), + Token = error("unterminated octal literal"), string_get_context(Posn0, Context, !Posn) ). @@ -2236,7 +2236,7 @@ get_octal_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_int(!.RevChars, base_8, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated octal constant") + Token = error("unterminated octal literal") ) ; Result = ok, @@ -2254,7 +2254,7 @@ get_octal_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_int(!.RevChars, base_8, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated octal constant") + Token = error("unterminated octal literal") ) ) ). @@ -2281,7 +2281,7 @@ string_get_octal_2(String, !.LastDigit, Len, Posn1, Token, Context, !Posn) :- conv_string_to_int(BinaryString, base_8, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated octal constant") + Token = error("unterminated octal literal") ), string_get_context(Posn1, Context, !Posn) ) @@ -2292,7 +2292,7 @@ string_get_octal_2(String, !.LastDigit, Len, Posn1, Token, Context, !Posn) :- conv_string_to_int(BinaryString, base_8, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated octal constant") + Token = error("unterminated octal literal") ), string_get_context(Posn1, Context, !Posn) ). @@ -2306,7 +2306,7 @@ get_hex(Stream, Token, !IO) :- Token = io_error(Error) ; Result = eof, - Token = error("unterminated hex constant") + Token = error("unterminated hexadecimal literal") ; Result = ok, ( if char.is_hex_digit(Char) then @@ -2316,7 +2316,7 @@ get_hex(Stream, Token, !IO) :- get_hex(Stream, Token, !IO) else io.putback_char(Stream, Char, !IO), - Token = error("unterminated hex constant") + Token = error("unterminated hexadecimal literal") ) ). @@ -2334,11 +2334,11 @@ string_get_hex(String, Len, Posn0, Token, Context, !Posn) :- string_get_hex(String, Len, Posn0, Token, Context, !Posn) else string_ungetchar(String, !Posn), - Token = error("unterminated hex constant"), + Token = error("unterminated hexadecimal literal"), string_get_context(Posn0, Context, !Posn) ) else - Token = error("unterminated hex constant"), + Token = error("unterminated hexadecimal literal"), string_get_context(Posn0, Context, !Posn) ). @@ -2357,7 +2357,7 @@ get_hex_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_int(!.RevChars, base_16, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated hex constant") + Token = error("unterminated hexadecimal literal") ) ; Result = ok, @@ -2375,7 +2375,7 @@ get_hex_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_int(!.RevChars, base_16, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated hex constant") + Token = error("unterminated hexadecimal literal") ) ) ). @@ -2402,7 +2402,7 @@ string_get_hex_2(String, !.LastDigit, Len, Posn1, Token, Context, !Posn) :- conv_string_to_int(BinaryString, base_16, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated hex constant") + Token = error("unterminated hexadecimal literal") ), string_get_context(Posn1, Context, !Posn) ) @@ -2413,7 +2413,7 @@ string_get_hex_2(String, !.LastDigit, Len, Posn1, Token, Context, !Posn) :- conv_string_to_int(BinaryString, base_16, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated hex constant") + Token = error("unterminated hexadecimal literal") ), string_get_context(Posn1, Context, !Posn) ). @@ -2433,7 +2433,7 @@ get_number(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_int(!.RevChars, base_10, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant") + Token = error("unterminated decimal literal") ) ; Result = ok, @@ -2450,7 +2450,7 @@ get_number(Stream, !.LastDigit, !.RevChars, Token, !IO) :- get_int_dot(Stream, !.LastDigit, !.RevChars, Token, !IO) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant") + Token = error("unterminated decimal literal") ) else if ( Char = 'e' ; Char = 'E' ) then ( @@ -2468,7 +2468,7 @@ get_number(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_int(!.RevChars, base_10, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant") + Token = error("unterminated decimal literal") ) ) ). @@ -2494,7 +2494,7 @@ string_get_number(String, !.LastDigit, Len, Posn0, Token, Context, !Posn) :- Context, !Posn) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant"), + Token = error("unterminated decimal literal"), string_get_context(Posn0, Context, !Posn) ) else if ( Char = 'e' ; Char = 'E' ) then @@ -2515,7 +2515,7 @@ string_get_number(String, !.LastDigit, Len, Posn0, Token, Context, !Posn) :- conv_string_to_int(NumberString, base_10, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant") + Token = error("unterminated decimal literal") ), string_get_context(Posn0, Context, !Posn) ) @@ -2526,7 +2526,7 @@ string_get_number(String, !.LastDigit, Len, Posn0, Token, Context, !Posn) :- conv_string_to_int(NumberString, base_10, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant") + Token = error("unterminated decimal literal") ), string_get_context(Posn0, Context, !Posn) ). @@ -2548,7 +2548,7 @@ get_int_dot(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_int(!.RevChars, base_10, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant") + Token = error("unterminated decimal literal") ) ; Result = ok, @@ -2574,7 +2574,7 @@ get_int_dot(Stream, !.LastDigit, !.RevChars, Token, !IO) :- ) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant") + Token = error("unterminated decimal literal") ) ) ). @@ -2601,7 +2601,7 @@ string_get_int_dot(String, !.LastDigit, Len, Posn0, Token, Context, !Posn) :- conv_string_to_int(NumberString, base_10, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant") + Token = error("unterminated decimal literal") ), string_get_context(Posn0, Context, !Posn) ) @@ -2613,7 +2613,7 @@ string_get_int_dot(String, !.LastDigit, Len, Posn0, Token, Context, !Posn) :- conv_string_to_int(NumberString, base_10, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated decimal constant") + Token = error("unterminated decimal literal") ), string_get_context(Posn0, Context, !Posn) ). @@ -2727,7 +2727,7 @@ get_float_exponent(Stream, !.RevChars, Token, !IO) :- get_float_exponent_3(Stream, LastDigit, !.RevChars, Token, !IO) else io.putback_char(Stream, Char, !IO), - Token = error("unterminated exponent in float token") + Token = error("unterminated exponent in float literal") ) ). @@ -2745,7 +2745,7 @@ string_get_float_exponent(String, Len, Posn0, Token, Context, !Posn) :- Context, !Posn) else string_ungetchar(String, !Posn), - Token = error("unterminated exponent in float token"), + Token = error("unterminated exponent in float literal"), string_get_context(Posn0, Context, !Posn) ) else @@ -2768,7 +2768,7 @@ get_float_exponent_2(Stream, !.RevChars, Token, !IO) :- Token = io_error(Error) ; Result = eof, - Token = error("unterminated exponent in float token") + Token = error("unterminated exponent in float literal") ; Result = ok, ( if char.is_digit(Char) then @@ -2777,7 +2777,7 @@ get_float_exponent_2(Stream, !.RevChars, Token, !IO) :- get_float_exponent_3(Stream, LastDigit, !.RevChars, Token, !IO) else io.putback_char(Stream, Char, !IO), - Token = error("unterminated exponent in float token") + Token = error("unterminated exponent in float literal") ) ). @@ -2796,11 +2796,11 @@ string_get_float_exponent_2(String, Len, Posn0, Token, Context, !Posn) :- Context, !Posn) else string_ungetchar(String, !Posn), - Token = error("unterminated exponent in float token"), + Token = error("unterminated exponent in float literal"), string_get_context(Posn0, Context, !Posn) ) else - Token = error("unterminated exponent in float token"), + Token = error("unterminated exponent in float literal"), string_get_context(Posn0, Context, !Posn) ). @@ -2822,7 +2822,7 @@ get_float_exponent_3(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_float(!.RevChars, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated exponent in float token") + Token = error("unterminated exponent in float literal") ) ; Result = ok, @@ -2840,7 +2840,7 @@ get_float_exponent_3(Stream, !.LastDigit, !.RevChars, Token, !IO) :- rev_char_list_to_float(!.RevChars, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated exponent in float token") + Token = error("unterminated exponent in float literal") ) ) ). @@ -2868,7 +2868,7 @@ string_get_float_exponent_3(String, !.LastDigit, Len, Posn0, Token, Context, conv_to_float(FloatString, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated exponent in float token") + Token = error("unterminated exponent in float literal") ), string_get_context(Posn0, Context, !Posn) ) @@ -2879,7 +2879,7 @@ string_get_float_exponent_3(String, !.LastDigit, Len, Posn0, Token, Context, conv_to_float(FloatString, Token) ; !.LastDigit = last_digit_is_underscore, - Token = error("unterminated exponent in float token") + Token = error("unterminated exponent in float literal") ), string_get_context(Posn0, Context, !Posn) ). diff --git a/tests/hard_coded/parse_number_from_string.exp b/tests/hard_coded/parse_number_from_string.exp index aab148d92..dc8623f99 100644 --- a/tests/hard_coded/parse_number_from_string.exp +++ b/tests/hard_coded/parse_number_from_string.exp @@ -9,8 +9,8 @@ read_term("1_000_000_000_000_000_000_000.") = functor(big_integer(base_10, i(5, read_term("-1_000_000_000_000_000_000_000.") = functor(atom("-"), [functor(big_integer(base_10, i(5, [13877, 12907, 7261, 14976, 0])), [], context("", 1))], context("", 1)) Invalid decimal literals: -read_term("123_.") = Syntax error: unterminated decimal constant -read_term("-123_.") = Syntax error: unterminated decimal constant +read_term("123_.") = Syntax error: unterminated decimal literal +read_term("-123_.") = Syntax error: unterminated decimal literal read_term("-_123") = Syntax error: operator or `.' expected Valid binary literals: @@ -22,12 +22,12 @@ read_term("0b_1000_100.") = functor(integer(68), [], context("", 1)) read_term("-0b_1000_100.") = functor(integer(-68), [], context("", 1)) Invalid binary literals: -read_term("0b.") = Syntax error: unterminated binary constant -read_term("-0b.") = Syntax error: unterminated binary constant -read_term("0b_.") = Syntax error: unterminated binary constant -read_term("-0b_.") = Syntax error: unterminated binary constant -read_term("0b11_.") = Syntax error: unterminated binary constant -read_term("-0b11_.") = Syntax error: unterminated binary constant +read_term("0b.") = Syntax error: unterminated binary literal +read_term("-0b.") = Syntax error: unterminated binary literal +read_term("0b_.") = Syntax error: unterminated binary literal +read_term("-0b_.") = Syntax error: unterminated binary literal +read_term("0b11_.") = Syntax error: unterminated binary literal +read_term("-0b11_.") = Syntax error: unterminated binary literal Valid octal literals: read_term("0o77.") = functor(integer(63), [], context("", 1)) @@ -40,12 +40,12 @@ read_term("0o_7__7___7.") = functor(integer(511), [], context("", 1)) read_term("-0o_7__7___7.") = functor(integer(-511), [], context("", 1)) Invalid octal literals: -read_term("0o.") = Syntax error: unterminated octal constant -read_term("-0o") = Syntax error: unterminated octal constant -read_term("0o_.") = Syntax error: unterminated octal constant -read_term("-0o_.") = Syntax error: unterminated octal constant -read_term("0o77_.") = Syntax error: unterminated octal constant -read_term("-0o77_.") = Syntax error: unterminated octal constant +read_term("0o.") = Syntax error: unterminated octal literal +read_term("-0o") = Syntax error: unterminated octal literal +read_term("0o_.") = Syntax error: unterminated octal literal +read_term("-0o_.") = Syntax error: unterminated octal literal +read_term("0o77_.") = Syntax error: unterminated octal literal +read_term("-0o77_.") = Syntax error: unterminated octal literal Valid hexadecimal literals: read_term("0xff.") = functor(integer(255), [], context("", 1)) @@ -60,12 +60,12 @@ read_term("0xfffffffffffffffffffffffff.") = functor(big_integer(base_16, i(8, [3 read_term("-0xfffffffffffffffffffffffff.") = functor(atom("-"), [functor(big_integer(base_16, i(8, [3, 16383, 16383, 16383, 16383, 16383, 16383, 16383])), [], context("", 1))], context("", 1)) Invalid hexadecimal literals: -read_term("0x.") = Syntax error: unterminated hex constant -read_term("-0x.") = Syntax error: unterminated hex constant -read_term("0x_.") = Syntax error: unterminated hex constant -read_term("-0x_.") = Syntax error: unterminated hex constant -read_term("0xff_.") = Syntax error: unterminated hex constant -read_term("-0xff_.") = Syntax error: unterminated hex constant +read_term("0x.") = Syntax error: unterminated hexadecimal literal +read_term("-0x.") = Syntax error: unterminated hexadecimal literal +read_term("0x_.") = Syntax error: unterminated hexadecimal literal +read_term("-0x_.") = Syntax error: unterminated hexadecimal literal +read_term("0xff_.") = Syntax error: unterminated hexadecimal literal +read_term("-0xff_.") = Syntax error: unterminated hexadecimal literal Valid float literals: read_term("0.123.") = functor(float(0.123), [], context("", 1)) @@ -87,19 +87,19 @@ read_term("1_2E-1_1.") = functor(float(1.2e-10), [], context("", 1)) Invalid float literals: read_term("1_2_3.1_2_3_.") = Syntax error: fractional part of float terminated by underscore -read_term("1_2_3e1_2_3_.") = Syntax error: unterminated exponent in float token -read_term("123_._123.") = Syntax error: unterminated decimal constant +read_term("1_2_3e1_2_3_.") = Syntax error: unterminated exponent in float literal +read_term("123_._123.") = Syntax error: unterminated decimal literal read_term("123._123.") = Syntax error: underscore following decimal point -read_term("123_.123.") = Syntax error: unterminated decimal constant +read_term("123_.123.") = Syntax error: unterminated decimal literal read_term("123_e12.") = Syntax error: underscore before exponent read_term("123_E12.") = Syntax error: underscore before exponent -read_term("123e_12.") = Syntax error: unterminated exponent in float token -read_term("123E_12.") = Syntax error: unterminated exponent in float token -read_term("123e12_.") = Syntax error: unterminated exponent in float token -read_term("123E12_.") = Syntax error: unterminated exponent in float token +read_term("123e_12.") = Syntax error: unterminated exponent in float literal +read_term("123E_12.") = Syntax error: unterminated exponent in float literal +read_term("123e12_.") = Syntax error: unterminated exponent in float literal +read_term("123E12_.") = Syntax error: unterminated exponent in float literal read_term("12_e11.") = Syntax error: underscore before exponent read_term("12_E11.") = Syntax error: underscore before exponent -read_term("123.12e-_12.") = Syntax error: unterminated exponent in float token -read_term("123.12e+_12.") = Syntax error: unterminated exponent in float token -read_term("123.12e12_.") = Syntax error: unterminated exponent in float token -read_term("123.12E12_.") = Syntax error: unterminated exponent in float token +read_term("123.12e-_12.") = Syntax error: unterminated exponent in float literal +read_term("123.12e+_12.") = Syntax error: unterminated exponent in float literal +read_term("123.12e12_.") = Syntax error: unterminated exponent in float literal +read_term("123.12E12_.") = Syntax error: unterminated exponent in float literal diff --git a/tests/hard_coded/parse_number_from_string.exp2 b/tests/hard_coded/parse_number_from_string.exp2 index b539f9f9a..68f1c63e6 100644 --- a/tests/hard_coded/parse_number_from_string.exp2 +++ b/tests/hard_coded/parse_number_from_string.exp2 @@ -9,8 +9,8 @@ read_term("1_000_000_000_000_000_000_000.") = functor(big_integer(base_10, i(5, read_term("-1_000_000_000_000_000_000_000.") = functor(atom("-"), [functor(big_integer(base_10, i(5, [13877, 12907, 7261, 14976, 0])), [], context("", 1))], context("", 1)) Invalid decimal literals: -read_term("123_.") = Syntax error: unterminated decimal constant -read_term("-123_.") = Syntax error: unterminated decimal constant +read_term("123_.") = Syntax error: unterminated decimal literal +read_term("-123_.") = Syntax error: unterminated decimal literal read_term("-_123") = Syntax error: operator or `.' expected Valid binary literals: @@ -22,12 +22,12 @@ read_term("0b_1000_100.") = functor(integer(68), [], context("", 1)) read_term("-0b_1000_100.") = functor(integer(-68), [], context("", 1)) Invalid binary literals: -read_term("0b.") = Syntax error: unterminated binary constant -read_term("-0b.") = Syntax error: unterminated binary constant -read_term("0b_.") = Syntax error: unterminated binary constant -read_term("-0b_.") = Syntax error: unterminated binary constant -read_term("0b11_.") = Syntax error: unterminated binary constant -read_term("-0b11_.") = Syntax error: unterminated binary constant +read_term("0b.") = Syntax error: unterminated binary literal +read_term("-0b.") = Syntax error: unterminated binary literal +read_term("0b_.") = Syntax error: unterminated binary literal +read_term("-0b_.") = Syntax error: unterminated binary literal +read_term("0b11_.") = Syntax error: unterminated binary literal +read_term("-0b11_.") = Syntax error: unterminated binary literal Valid octal literals: read_term("0o77.") = functor(integer(63), [], context("", 1)) @@ -40,12 +40,12 @@ read_term("0o_7__7___7.") = functor(integer(511), [], context("", 1)) read_term("-0o_7__7___7.") = functor(integer(-511), [], context("", 1)) Invalid octal literals: -read_term("0o.") = Syntax error: unterminated octal constant -read_term("-0o") = Syntax error: unterminated octal constant -read_term("0o_.") = Syntax error: unterminated octal constant -read_term("-0o_.") = Syntax error: unterminated octal constant -read_term("0o77_.") = Syntax error: unterminated octal constant -read_term("-0o77_.") = Syntax error: unterminated octal constant +read_term("0o.") = Syntax error: unterminated octal literal +read_term("-0o") = Syntax error: unterminated octal literal +read_term("0o_.") = Syntax error: unterminated octal literal +read_term("-0o_.") = Syntax error: unterminated octal literal +read_term("0o77_.") = Syntax error: unterminated octal literal +read_term("-0o77_.") = Syntax error: unterminated octal literal Valid hexadecimal literals: read_term("0xff.") = functor(integer(255), [], context("", 1)) @@ -60,12 +60,12 @@ read_term("0xfffffffffffffffffffffffff.") = functor(big_integer(base_16, i(8, [3 read_term("-0xfffffffffffffffffffffffff.") = functor(atom("-"), [functor(big_integer(base_16, i(8, [3, 16383, 16383, 16383, 16383, 16383, 16383, 16383])), [], context("", 1))], context("", 1)) Invalid hexadecimal literals: -read_term("0x.") = Syntax error: unterminated hex constant -read_term("-0x.") = Syntax error: unterminated hex constant -read_term("0x_.") = Syntax error: unterminated hex constant -read_term("-0x_.") = Syntax error: unterminated hex constant -read_term("0xff_.") = Syntax error: unterminated hex constant -read_term("-0xff_.") = Syntax error: unterminated hex constant +read_term("0x.") = Syntax error: unterminated hexadecimal literal +read_term("-0x.") = Syntax error: unterminated hexadecimal literal +read_term("0x_.") = Syntax error: unterminated hexadecimal literal +read_term("-0x_.") = Syntax error: unterminated hexadecimal literal +read_term("0xff_.") = Syntax error: unterminated hexadecimal literal +read_term("-0xff_.") = Syntax error: unterminated hexadecimal literal Valid float literals: read_term("0.123.") = functor(float(0.123), [], context("", 1)) @@ -87,19 +87,19 @@ read_term("1_2E-1_1.") = functor(float(1.2E-10), [], context("", 1)) Invalid float literals: read_term("1_2_3.1_2_3_.") = Syntax error: fractional part of float terminated by underscore -read_term("1_2_3e1_2_3_.") = Syntax error: unterminated exponent in float token -read_term("123_._123.") = Syntax error: unterminated decimal constant +read_term("1_2_3e1_2_3_.") = Syntax error: unterminated exponent in float literal +read_term("123_._123.") = Syntax error: unterminated decimal literal read_term("123._123.") = Syntax error: underscore following decimal point -read_term("123_.123.") = Syntax error: unterminated decimal constant +read_term("123_.123.") = Syntax error: unterminated decimal literal read_term("123_e12.") = Syntax error: underscore before exponent read_term("123_E12.") = Syntax error: underscore before exponent -read_term("123e_12.") = Syntax error: unterminated exponent in float token -read_term("123E_12.") = Syntax error: unterminated exponent in float token -read_term("123e12_.") = Syntax error: unterminated exponent in float token -read_term("123E12_.") = Syntax error: unterminated exponent in float token +read_term("123e_12.") = Syntax error: unterminated exponent in float literal +read_term("123E_12.") = Syntax error: unterminated exponent in float literal +read_term("123e12_.") = Syntax error: unterminated exponent in float literal +read_term("123E12_.") = Syntax error: unterminated exponent in float literal read_term("12_e11.") = Syntax error: underscore before exponent read_term("12_E11.") = Syntax error: underscore before exponent -read_term("123.12e-_12.") = Syntax error: unterminated exponent in float token -read_term("123.12e+_12.") = Syntax error: unterminated exponent in float token -read_term("123.12e12_.") = Syntax error: unterminated exponent in float token -read_term("123.12E12_.") = Syntax error: unterminated exponent in float token +read_term("123.12e-_12.") = Syntax error: unterminated exponent in float literal +read_term("123.12e+_12.") = Syntax error: unterminated exponent in float literal +read_term("123.12e12_.") = Syntax error: unterminated exponent in float literal +read_term("123.12E12_.") = Syntax error: unterminated exponent in float literal diff --git a/tests/hard_coded/parse_number_from_string.exp3 b/tests/hard_coded/parse_number_from_string.exp3 index 82e80bec1..258a76f9a 100644 --- a/tests/hard_coded/parse_number_from_string.exp3 +++ b/tests/hard_coded/parse_number_from_string.exp3 @@ -9,8 +9,8 @@ read_term("1_000_000_000_000_000_000_000.") = functor(big_integer(base_10, i(5, read_term("-1_000_000_000_000_000_000_000.") = functor(atom("-"), [functor(big_integer(base_10, i(5, [13877, 12907, 7261, 14976, 0])), [], context("", 1))], context("", 1)) Invalid decimal literals: -read_term("123_.") = Syntax error: unterminated decimal constant -read_term("-123_.") = Syntax error: unterminated decimal constant +read_term("123_.") = Syntax error: unterminated decimal literal +read_term("-123_.") = Syntax error: unterminated decimal literal read_term("-_123") = Syntax error: operator or `.' expected Valid binary literals: @@ -22,12 +22,12 @@ read_term("0b_1000_100.") = functor(integer(68), [], context("", 1)) read_term("-0b_1000_100.") = functor(integer(-68), [], context("", 1)) Invalid binary literals: -read_term("0b.") = Syntax error: unterminated binary constant -read_term("-0b.") = Syntax error: unterminated binary constant -read_term("0b_.") = Syntax error: unterminated binary constant -read_term("-0b_.") = Syntax error: unterminated binary constant -read_term("0b11_.") = Syntax error: unterminated binary constant -read_term("-0b11_.") = Syntax error: unterminated binary constant +read_term("0b.") = Syntax error: unterminated binary literal +read_term("-0b.") = Syntax error: unterminated binary literal +read_term("0b_.") = Syntax error: unterminated binary literal +read_term("-0b_.") = Syntax error: unterminated binary literal +read_term("0b11_.") = Syntax error: unterminated binary literal +read_term("-0b11_.") = Syntax error: unterminated binary literal Valid octal literals: read_term("0o77.") = functor(integer(63), [], context("", 1)) @@ -40,12 +40,12 @@ read_term("0o_7__7___7.") = functor(integer(511), [], context("", 1)) read_term("-0o_7__7___7.") = functor(integer(-511), [], context("", 1)) Invalid octal literals: -read_term("0o.") = Syntax error: unterminated octal constant -read_term("-0o") = Syntax error: unterminated octal constant -read_term("0o_.") = Syntax error: unterminated octal constant -read_term("-0o_.") = Syntax error: unterminated octal constant -read_term("0o77_.") = Syntax error: unterminated octal constant -read_term("-0o77_.") = Syntax error: unterminated octal constant +read_term("0o.") = Syntax error: unterminated octal literal +read_term("-0o") = Syntax error: unterminated octal literal +read_term("0o_.") = Syntax error: unterminated octal literal +read_term("-0o_.") = Syntax error: unterminated octal literal +read_term("0o77_.") = Syntax error: unterminated octal literal +read_term("-0o77_.") = Syntax error: unterminated octal literal Valid hexadecimal literals: read_term("0xff.") = functor(integer(255), [], context("", 1)) @@ -60,12 +60,12 @@ read_term("0xfffffffffffffffffffffffff.") = functor(big_integer(base_16, i(8, [3 read_term("-0xfffffffffffffffffffffffff.") = functor(atom("-"), [functor(big_integer(base_16, i(8, [3, 16383, 16383, 16383, 16383, 16383, 16383, 16383])), [], context("", 1))], context("", 1)) Invalid hexadecimal literals: -read_term("0x.") = Syntax error: unterminated hex constant -read_term("-0x.") = Syntax error: unterminated hex constant -read_term("0x_.") = Syntax error: unterminated hex constant -read_term("-0x_.") = Syntax error: unterminated hex constant -read_term("0xff_.") = Syntax error: unterminated hex constant -read_term("-0xff_.") = Syntax error: unterminated hex constant +read_term("0x.") = Syntax error: unterminated hexadecimal literal +read_term("-0x.") = Syntax error: unterminated hexadecimal literal +read_term("0x_.") = Syntax error: unterminated hexadecimal literal +read_term("-0x_.") = Syntax error: unterminated hexadecimal literal +read_term("0xff_.") = Syntax error: unterminated hexadecimal literal +read_term("-0xff_.") = Syntax error: unterminated hexadecimal literal Valid float literals: read_term("0.123.") = functor(float(0.123), [], context("", 1)) @@ -87,19 +87,19 @@ read_term("1_2E-1_1.") = functor(float(1.2E-10), [], context("", 1)) Invalid float literals: read_term("1_2_3.1_2_3_.") = Syntax error: fractional part of float terminated by underscore -read_term("1_2_3e1_2_3_.") = Syntax error: unterminated exponent in float token -read_term("123_._123.") = Syntax error: unterminated decimal constant +read_term("1_2_3e1_2_3_.") = Syntax error: unterminated exponent in float literal +read_term("123_._123.") = Syntax error: unterminated decimal literal read_term("123._123.") = Syntax error: underscore following decimal point -read_term("123_.123.") = Syntax error: unterminated decimal constant +read_term("123_.123.") = Syntax error: unterminated decimal literal read_term("123_e12.") = Syntax error: underscore before exponent read_term("123_E12.") = Syntax error: underscore before exponent -read_term("123e_12.") = Syntax error: unterminated exponent in float token -read_term("123E_12.") = Syntax error: unterminated exponent in float token -read_term("123e12_.") = Syntax error: unterminated exponent in float token -read_term("123E12_.") = Syntax error: unterminated exponent in float token +read_term("123e_12.") = Syntax error: unterminated exponent in float literal +read_term("123E_12.") = Syntax error: unterminated exponent in float literal +read_term("123e12_.") = Syntax error: unterminated exponent in float literal +read_term("123E12_.") = Syntax error: unterminated exponent in float literal read_term("12_e11.") = Syntax error: underscore before exponent read_term("12_E11.") = Syntax error: underscore before exponent -read_term("123.12e-_12.") = Syntax error: unterminated exponent in float token -read_term("123.12e+_12.") = Syntax error: unterminated exponent in float token -read_term("123.12e12_.") = Syntax error: unterminated exponent in float token -read_term("123.12E12_.") = Syntax error: unterminated exponent in float token +read_term("123.12e-_12.") = Syntax error: unterminated exponent in float literal +read_term("123.12e+_12.") = Syntax error: unterminated exponent in float literal +read_term("123.12e12_.") = Syntax error: unterminated exponent in float literal +read_term("123.12E12_.") = Syntax error: unterminated exponent in float literal diff --git a/tests/invalid/invalid_binary_literal.err_exp b/tests/invalid/invalid_binary_literal.err_exp index c6b677088..216d69507 100644 --- a/tests/invalid/invalid_binary_literal.err_exp +++ b/tests/invalid/invalid_binary_literal.err_exp @@ -8,22 +8,22 @@ invalid_binary_literal.m:012: Error: no clauses for function `foo7'/0. invalid_binary_literal.m:013: Error: no clauses for function `foo8'/0. invalid_binary_literal.m:017: Syntax error at token `. ': unexpected token at invalid_binary_literal.m:017: start of (sub)term. -invalid_binary_literal.m:017: Syntax error: unterminated binary constant. +invalid_binary_literal.m:017: Syntax error: unterminated binary literal. invalid_binary_literal.m:019: Syntax error at token `. ': unexpected token at invalid_binary_literal.m:019: start of (sub)term. -invalid_binary_literal.m:019: Syntax error: unterminated binary constant. +invalid_binary_literal.m:019: Syntax error: unterminated binary literal. invalid_binary_literal.m:021: Syntax error at token `. ': unexpected token at invalid_binary_literal.m:021: start of (sub)term. -invalid_binary_literal.m:021: Syntax error: unterminated binary constant. +invalid_binary_literal.m:021: Syntax error: unterminated binary literal. invalid_binary_literal.m:023: Syntax error at token `. ': unexpected token at invalid_binary_literal.m:023: start of (sub)term. -invalid_binary_literal.m:023: Syntax error: unterminated binary constant. +invalid_binary_literal.m:023: Syntax error: unterminated binary literal. invalid_binary_literal.m:025: Syntax error at token `. ': unexpected token at invalid_binary_literal.m:025: start of (sub)term. -invalid_binary_literal.m:025: Syntax error: unterminated binary constant. +invalid_binary_literal.m:025: Syntax error: unterminated binary literal. invalid_binary_literal.m:027: Syntax error at token `. ': unexpected token at invalid_binary_literal.m:027: start of (sub)term. -invalid_binary_literal.m:027: Syntax error: unterminated binary constant. +invalid_binary_literal.m:027: Syntax error: unterminated binary literal. invalid_binary_literal.m:029: Syntax error at variable `_b11': operator or `.' invalid_binary_literal.m:029: expected. invalid_binary_literal.m:031: Syntax error at variable `_b11': operator or `.' diff --git a/tests/invalid/invalid_decimal_literal.err_exp b/tests/invalid/invalid_decimal_literal.err_exp index 1ab2c1060..c9b770473 100644 --- a/tests/invalid/invalid_decimal_literal.err_exp +++ b/tests/invalid/invalid_decimal_literal.err_exp @@ -1,4 +1,4 @@ invalid_decimal_literal.m:006: Error: no clauses for function `foo1'/0. invalid_decimal_literal.m:007: Error: no clauses for function `foo2'/0. -invalid_decimal_literal.m:011: Syntax error: unterminated decimal constant. -invalid_decimal_literal.m:013: Syntax error: unterminated decimal constant. +invalid_decimal_literal.m:011: Syntax error: unterminated decimal literal. +invalid_decimal_literal.m:013: Syntax error: unterminated decimal literal. diff --git a/tests/invalid/invalid_float_literal.err_exp b/tests/invalid/invalid_float_literal.err_exp index 85e27cc2e..e6b463ee3 100644 --- a/tests/invalid/invalid_float_literal.err_exp +++ b/tests/invalid/invalid_float_literal.err_exp @@ -17,26 +17,26 @@ invalid_float_literal.m:021: by underscore. invalid_float_literal.m:023: Syntax error at token `. ': unexpected token at invalid_float_literal.m:023: start of (sub)term. invalid_float_literal.m:023: Syntax error: unterminated exponent in float -invalid_float_literal.m:023: token. +invalid_float_literal.m:023: literal. invalid_float_literal.m:025: In clause head: error: atom expected at 12. invalid_float_literal.m:025: Syntax error: underscore before exponent. invalid_float_literal.m:027: In clause head: error: atom expected at _12. invalid_float_literal.m:027: Syntax error: unterminated exponent in float -invalid_float_literal.m:027: token. +invalid_float_literal.m:027: literal. invalid_float_literal.m:029: In clause head: error: atom expected at _123. -invalid_float_literal.m:029: Syntax error: unterminated decimal constant. +invalid_float_literal.m:029: Syntax error: unterminated decimal literal. invalid_float_literal.m:031: In clause head: error: atom expected at 123. invalid_float_literal.m:031: Syntax error: underscore following decimal point. invalid_float_literal.m:033: In clause head: error: atom expected at 123. -invalid_float_literal.m:033: Syntax error: unterminated decimal constant. +invalid_float_literal.m:033: Syntax error: unterminated decimal literal. invalid_float_literal.m:035: Syntax error: unterminated exponent in float -invalid_float_literal.m:035: token. +invalid_float_literal.m:035: literal. invalid_float_literal.m:035: Error: clause for predicate invalid_float_literal.m:035: `invalid_float_literal.-'/2 invalid_float_literal.m:035: without corresponding `:- pred' declaration. invalid_float_literal.m:035: Inferred :- pred -(T1, int). invalid_float_literal.m:037: Syntax error: unterminated exponent in float -invalid_float_literal.m:037: token. +invalid_float_literal.m:037: literal. invalid_float_literal.m:037: Error: clause for predicate invalid_float_literal.m:037: `invalid_float_literal.+'/2 invalid_float_literal.m:037: without corresponding `:- pred' declaration. @@ -45,7 +45,7 @@ invalid_float_literal.m:039: In clause head: error: atom expected at 12. invalid_float_literal.m:039: Syntax error: underscore before exponent. invalid_float_literal.m:041: In clause head: error: atom expected at _12. invalid_float_literal.m:041: Syntax error: unterminated exponent in float -invalid_float_literal.m:041: token. +invalid_float_literal.m:041: literal. invalid_float_literal.m:043: In clause head: error: atom expected at _12. invalid_float_literal.m:043: Syntax error: unterminated exponent in float -invalid_float_literal.m:043: token. +invalid_float_literal.m:043: literal. diff --git a/tests/invalid/invalid_hex_literal.err_exp b/tests/invalid/invalid_hex_literal.err_exp index cd402e3e3..b2127ca38 100644 --- a/tests/invalid/invalid_hex_literal.err_exp +++ b/tests/invalid/invalid_hex_literal.err_exp @@ -8,22 +8,22 @@ invalid_hex_literal.m:012: Error: no clauses for function `foo7'/0. invalid_hex_literal.m:013: Error: no clauses for function `foo8'/0. invalid_hex_literal.m:017: Syntax error at token `. ': unexpected token at invalid_hex_literal.m:017: start of (sub)term. -invalid_hex_literal.m:017: Syntax error: unterminated hex constant. +invalid_hex_literal.m:017: Syntax error: unterminated hexadecimal literal. invalid_hex_literal.m:019: Syntax error at token `. ': unexpected token at invalid_hex_literal.m:019: start of (sub)term. -invalid_hex_literal.m:019: Syntax error: unterminated hex constant. +invalid_hex_literal.m:019: Syntax error: unterminated hexadecimal literal. invalid_hex_literal.m:021: Syntax error at token `. ': unexpected token at invalid_hex_literal.m:021: start of (sub)term. -invalid_hex_literal.m:021: Syntax error: unterminated hex constant. +invalid_hex_literal.m:021: Syntax error: unterminated hexadecimal literal. invalid_hex_literal.m:023: Syntax error at token `. ': unexpected token at invalid_hex_literal.m:023: start of (sub)term. -invalid_hex_literal.m:023: Syntax error: unterminated hex constant. +invalid_hex_literal.m:023: Syntax error: unterminated hexadecimal literal. invalid_hex_literal.m:025: Syntax error at token `. ': unexpected token at invalid_hex_literal.m:025: start of (sub)term. -invalid_hex_literal.m:025: Syntax error: unterminated hex constant. +invalid_hex_literal.m:025: Syntax error: unterminated hexadecimal literal. invalid_hex_literal.m:027: Syntax error at token `. ': unexpected token at invalid_hex_literal.m:027: start of (sub)term. -invalid_hex_literal.m:027: Syntax error: unterminated hex constant. +invalid_hex_literal.m:027: Syntax error: unterminated hexadecimal literal. invalid_hex_literal.m:029: Syntax error at variable `_xff': operator or `.' invalid_hex_literal.m:029: expected. invalid_hex_literal.m:031: Syntax error at variable `_xff': operator or `.' diff --git a/tests/invalid/invalid_octal_literal.err_exp b/tests/invalid/invalid_octal_literal.err_exp index d84cd8f1d..6c4ecd8a2 100644 --- a/tests/invalid/invalid_octal_literal.err_exp +++ b/tests/invalid/invalid_octal_literal.err_exp @@ -8,22 +8,22 @@ invalid_octal_literal.m:012: Error: no clauses for function `foo7'/0. invalid_octal_literal.m:013: Error: no clauses for function `foo8'/0. invalid_octal_literal.m:017: Syntax error at token `. ': unexpected token at invalid_octal_literal.m:017: start of (sub)term. -invalid_octal_literal.m:017: Syntax error: unterminated octal constant. +invalid_octal_literal.m:017: Syntax error: unterminated octal literal. invalid_octal_literal.m:019: Syntax error at token `. ': unexpected token at invalid_octal_literal.m:019: start of (sub)term. -invalid_octal_literal.m:019: Syntax error: unterminated octal constant. +invalid_octal_literal.m:019: Syntax error: unterminated octal literal. invalid_octal_literal.m:021: Syntax error at token `. ': unexpected token at invalid_octal_literal.m:021: start of (sub)term. -invalid_octal_literal.m:021: Syntax error: unterminated octal constant. +invalid_octal_literal.m:021: Syntax error: unterminated octal literal. invalid_octal_literal.m:023: Syntax error at token `. ': unexpected token at invalid_octal_literal.m:023: start of (sub)term. -invalid_octal_literal.m:023: Syntax error: unterminated octal constant. +invalid_octal_literal.m:023: Syntax error: unterminated octal literal. invalid_octal_literal.m:025: Syntax error at token `. ': unexpected token at invalid_octal_literal.m:025: start of (sub)term. -invalid_octal_literal.m:025: Syntax error: unterminated octal constant. +invalid_octal_literal.m:025: Syntax error: unterminated octal literal. invalid_octal_literal.m:027: Syntax error at token `. ': unexpected token at invalid_octal_literal.m:027: start of (sub)term. -invalid_octal_literal.m:027: Syntax error: unterminated octal constant. +invalid_octal_literal.m:027: Syntax error: unterminated octal literal. invalid_octal_literal.m:029: Syntax error at variable `_o77': operator or `.' invalid_octal_literal.m:029: expected. invalid_octal_literal.m:031: Syntax error at variable `_o77': operator or `.'