mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-18 10:53:40 +00:00
Improve diagnostics for malformed number literals.
library/mercury_term_lexer.m:
Make the diagnostics for malformed numbers more detailed, and thus
more easily understandable.
tests/hard_coded/parse_number_from_string.exp:
tests/invalid_nodepend/invalid_binary_literal.err_exp:
tests/invalid_nodepend/invalid_decimal_literal.err_exp:
tests/invalid_nodepend/invalid_float_literal.err_exp:
tests/invalid_nodepend/invalid_hex_literal.err_exp:
tests/invalid_nodepend/invalid_octal_literal.err_exp:
Update the expected error messages.
This commit is contained in:
@@ -3329,7 +3329,7 @@ get_binary(Stream, Token, !IO) :-
|
||||
Token = io_error(Error)
|
||||
;
|
||||
Result = eof,
|
||||
Token = error("unterminated binary literal")
|
||||
Token = report_zero_base_no_digits(base_2)
|
||||
;
|
||||
Result = ok,
|
||||
( if char.is_binary_digit(Char) then
|
||||
@@ -3339,7 +3339,7 @@ get_binary(Stream, Token, !IO) :-
|
||||
get_binary(Stream, Token, !IO)
|
||||
else
|
||||
io.putback_char(Stream, Char, !IO),
|
||||
Token = error("unterminated binary literal")
|
||||
Token = report_zero_base_no_digits(base_2)
|
||||
)
|
||||
).
|
||||
|
||||
@@ -3357,11 +3357,11 @@ string_get_binary(String, Len, Posn0, Token, Context, !Posn) :-
|
||||
string_get_binary(String, Len, LastPosn, Token, Context, !Posn)
|
||||
else
|
||||
!:Posn = LastPosn,
|
||||
Token = error("unterminated binary literal"),
|
||||
Token = report_zero_base_no_digits(base_2),
|
||||
string_get_context(Posn0, Context)
|
||||
)
|
||||
else
|
||||
Token = error("unterminated binary literal"),
|
||||
Token = report_zero_base_no_digits(base_2),
|
||||
string_get_context(Posn0, Context)
|
||||
).
|
||||
|
||||
@@ -3385,11 +3385,11 @@ linestr_get_binary(String, Len, LineContext0, Token, Context,
|
||||
else
|
||||
!:LineContext = LastLineContext,
|
||||
!:LinePosn = LastLinePosn,
|
||||
Token = error("unterminated binary literal"),
|
||||
Token = report_zero_base_no_digits(base_2),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
)
|
||||
else
|
||||
Token = error("unterminated binary literal"),
|
||||
Token = report_zero_base_no_digits(base_2),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
).
|
||||
|
||||
@@ -3409,7 +3409,7 @@ get_binary_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated binary literal")
|
||||
Token = report_int_ends_in_underscore(base_2)
|
||||
)
|
||||
;
|
||||
Result = ok,
|
||||
@@ -3434,7 +3434,7 @@ get_binary_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated binary literal")
|
||||
Token = report_int_ends_in_underscore(base_2)
|
||||
)
|
||||
)
|
||||
).
|
||||
@@ -3481,7 +3481,7 @@ string_get_binary_2(String, Len, !.LastDigit, Posn1, Token, Context, !Posn) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated binary literal")
|
||||
Token = report_int_ends_in_underscore(base_2)
|
||||
),
|
||||
string_get_context(Posn1, Context)
|
||||
)
|
||||
@@ -3493,7 +3493,7 @@ string_get_binary_2(String, Len, !.LastDigit, Posn1, Token, Context, !Posn) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated binary literal")
|
||||
Token = report_int_ends_in_underscore(base_2)
|
||||
),
|
||||
string_get_context(Posn1, Context)
|
||||
).
|
||||
@@ -3549,7 +3549,7 @@ linestr_get_binary_2(String, Len, !.LastDigit, LineContext1, LinePosn1,
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated binary literal")
|
||||
Token = report_int_ends_in_underscore(base_2)
|
||||
),
|
||||
linestr_get_context(LineContext1, Context)
|
||||
)
|
||||
@@ -3561,7 +3561,7 @@ linestr_get_binary_2(String, Len, !.LastDigit, LineContext1, LinePosn1,
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated binary literal")
|
||||
Token = report_int_ends_in_underscore(base_2)
|
||||
),
|
||||
linestr_get_context(LineContext1, Context)
|
||||
).
|
||||
@@ -3575,7 +3575,7 @@ get_octal(Stream, Token, !IO) :-
|
||||
Token = io_error(Error)
|
||||
;
|
||||
Result = eof,
|
||||
Token = error("unterminated octal literal")
|
||||
Token = report_zero_base_no_digits(base_8)
|
||||
;
|
||||
Result = ok,
|
||||
( if char.is_octal_digit(Char) then
|
||||
@@ -3585,7 +3585,7 @@ get_octal(Stream, Token, !IO) :-
|
||||
get_octal(Stream, Token, !IO)
|
||||
else
|
||||
io.putback_char(Stream, Char, !IO),
|
||||
Token = error("unterminated octal literal")
|
||||
Token = report_zero_base_no_digits(base_8)
|
||||
)
|
||||
).
|
||||
|
||||
@@ -3605,11 +3605,11 @@ string_get_octal(String, Len, Posn0, Token, Context, !Posn) :-
|
||||
)
|
||||
else
|
||||
!:Posn = LastPosn,
|
||||
Token = error("unterminated octal literal"),
|
||||
Token = report_zero_base_no_digits(base_8),
|
||||
string_get_context(Posn0, Context)
|
||||
)
|
||||
else
|
||||
Token = error("unterminated octal literal"),
|
||||
Token = report_zero_base_no_digits(base_8),
|
||||
string_get_context(Posn0, Context)
|
||||
).
|
||||
|
||||
@@ -3635,11 +3635,11 @@ linestr_get_octal(String, Len, LineContext0, LinePosn0, Token, Context,
|
||||
else
|
||||
!:LineContext = LastLineContext,
|
||||
!:LinePosn = LastLinePosn,
|
||||
Token = error("unterminated octal literal"),
|
||||
Token = report_zero_base_no_digits(base_8),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
)
|
||||
else
|
||||
Token = error("unterminated octal literal"),
|
||||
Token = report_zero_base_no_digits(base_8),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
).
|
||||
|
||||
@@ -3659,7 +3659,7 @@ get_octal_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated octal literal")
|
||||
Token = report_int_ends_in_underscore(base_8)
|
||||
)
|
||||
;
|
||||
Result = ok,
|
||||
@@ -3684,7 +3684,7 @@ get_octal_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated octal literal")
|
||||
Token = report_int_ends_in_underscore(base_8)
|
||||
)
|
||||
)
|
||||
).
|
||||
@@ -3720,12 +3720,12 @@ string_get_octal_2(String, Len, !.LastDigit, Posn1, Token, Context, !Posn) :-
|
||||
!:Posn = LastDigitPosn,
|
||||
(
|
||||
!.LastDigit = last_digit_is_not_underscore,
|
||||
grab_string(String, Posn1, !.Posn, BinaryString),
|
||||
conv_string_to_int(BinaryString, base_8, signed, size_word,
|
||||
grab_string(String, Posn1, !.Posn, OctalString),
|
||||
conv_string_to_int(OctalString, base_8, signed, size_word,
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated octal literal")
|
||||
Token = report_int_ends_in_underscore(base_8)
|
||||
),
|
||||
string_get_context(Posn1, Context)
|
||||
)
|
||||
@@ -3736,7 +3736,7 @@ string_get_octal_2(String, Len, !.LastDigit, Posn1, Token, Context, !Posn) :-
|
||||
conv_string_to_int(BinaryString, base_8, signed, size_word, Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated octal literal")
|
||||
Token = report_int_ends_in_underscore(base_8)
|
||||
),
|
||||
string_get_context(Posn1, Context)
|
||||
).
|
||||
@@ -3781,23 +3781,23 @@ linestr_get_octal_2(String, Len, !.LastDigit, LineContext1, LinePosn1,
|
||||
(
|
||||
!.LastDigit = last_digit_is_not_underscore,
|
||||
linestr_grab_string(String, LinePosn1, !.LinePosn,
|
||||
BinaryString),
|
||||
conv_string_to_int(BinaryString, base_8, signed, size_word,
|
||||
OctalString),
|
||||
conv_string_to_int(OctalString, base_8, signed, size_word,
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated octal literal")
|
||||
Token = report_int_ends_in_underscore(base_8)
|
||||
),
|
||||
linestr_get_context(LineContext1, Context)
|
||||
)
|
||||
else
|
||||
(
|
||||
!.LastDigit = last_digit_is_not_underscore,
|
||||
linestr_grab_string(String, LinePosn1, !.LinePosn, BinaryString),
|
||||
conv_string_to_int(BinaryString, base_8, signed, size_word, Token)
|
||||
linestr_grab_string(String, LinePosn1, !.LinePosn, OctalString),
|
||||
conv_string_to_int(OctalString, base_8, signed, size_word, Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated octal literal")
|
||||
Token = report_int_ends_in_underscore(base_8)
|
||||
),
|
||||
linestr_get_context(LineContext1, Context)
|
||||
).
|
||||
@@ -3811,7 +3811,7 @@ get_hex(Stream, Token, !IO) :-
|
||||
Token = io_error(Error)
|
||||
;
|
||||
Result = eof,
|
||||
Token = error("unterminated hexadecimal literal")
|
||||
Token = report_zero_base_no_digits(base_16)
|
||||
;
|
||||
Result = ok,
|
||||
( if char.is_hex_digit(Char) then
|
||||
@@ -3821,7 +3821,7 @@ get_hex(Stream, Token, !IO) :-
|
||||
get_hex(Stream, Token, !IO)
|
||||
else
|
||||
io.putback_char(Stream, Char, !IO),
|
||||
Token = error("unterminated hexadecimal literal")
|
||||
Token = report_zero_base_no_digits(base_16)
|
||||
)
|
||||
).
|
||||
|
||||
@@ -3843,11 +3843,11 @@ string_get_hex(String, Len, Posn0, Token, Context, !Posn) :-
|
||||
)
|
||||
else
|
||||
!:Posn = LastPosn,
|
||||
Token = error("unterminated hexadecimal literal"),
|
||||
Token = report_zero_base_no_digits(base_16),
|
||||
string_get_context(Posn0, Context)
|
||||
)
|
||||
else
|
||||
Token = error("unterminated hexadecimal literal"),
|
||||
Token = report_zero_base_no_digits(base_16),
|
||||
string_get_context(Posn0, Context)
|
||||
).
|
||||
|
||||
@@ -3875,11 +3875,11 @@ linestr_get_hex(String, Len, LineContext0, LinePosn0, Token, Context,
|
||||
else
|
||||
!:LineContext = LastLineContext,
|
||||
!:LinePosn = LastLinePosn,
|
||||
Token = error("unterminated hexadecimal literal"),
|
||||
Token = report_zero_base_no_digits(base_16),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
)
|
||||
else
|
||||
Token = error("unterminated hexadecimal literal"),
|
||||
Token = report_zero_base_no_digits(base_16),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
).
|
||||
|
||||
@@ -3899,7 +3899,7 @@ get_hex_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated hexadecimal literal")
|
||||
Token = report_int_ends_in_underscore(base_16)
|
||||
)
|
||||
;
|
||||
Result = ok,
|
||||
@@ -3926,7 +3926,7 @@ get_hex_2(Stream, !.LastDigit, !.RevChars, Token, !IO) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated hexadecimal literal")
|
||||
Token = report_int_ends_in_underscore(base_16)
|
||||
)
|
||||
)
|
||||
).
|
||||
@@ -3962,24 +3962,23 @@ string_get_hex_2(String, Len, !.LastDigit, Posn1, Token, Context, !Posn) :-
|
||||
!:Posn = LastDigitPosn,
|
||||
(
|
||||
!.LastDigit = last_digit_is_not_underscore,
|
||||
grab_string(String, Posn1, !.Posn, BinaryString),
|
||||
conv_string_to_int(BinaryString, base_16, signed, size_word,
|
||||
grab_string(String, Posn1, !.Posn, HexString),
|
||||
conv_string_to_int(HexString, base_16, signed, size_word,
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated hexadecimal literal")
|
||||
Token = report_int_ends_in_underscore(base_16)
|
||||
),
|
||||
string_get_context(Posn1, Context)
|
||||
)
|
||||
else
|
||||
(
|
||||
!.LastDigit = last_digit_is_not_underscore,
|
||||
grab_string(String, Posn1, !.Posn, BinaryString),
|
||||
conv_string_to_int(BinaryString, base_16, signed, size_word,
|
||||
Token)
|
||||
grab_string(String, Posn1, !.Posn, HexString),
|
||||
conv_string_to_int(HexString, base_16, signed, size_word, Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated hexadecimal literal")
|
||||
Token = report_int_ends_in_underscore(base_16)
|
||||
),
|
||||
string_get_context(Posn1, Context)
|
||||
).
|
||||
@@ -4024,24 +4023,23 @@ linestr_get_hex_2(String, Len, !.LastDigit, LineContext1, LinePosn1,
|
||||
(
|
||||
!.LastDigit = last_digit_is_not_underscore,
|
||||
linestr_grab_string(String, LinePosn1, !.LinePosn,
|
||||
BinaryString),
|
||||
conv_string_to_int(BinaryString, base_16, signed, size_word,
|
||||
HexString),
|
||||
conv_string_to_int(HexString, base_16, signed, size_word,
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated hexadecimal literal")
|
||||
Token = report_int_ends_in_underscore(base_16)
|
||||
),
|
||||
linestr_get_context(LineContext1, Context)
|
||||
)
|
||||
else
|
||||
(
|
||||
!.LastDigit = last_digit_is_not_underscore,
|
||||
linestr_grab_string(String, LinePosn1, !.LinePosn, BinaryString),
|
||||
conv_string_to_int(BinaryString, base_16, signed, size_word,
|
||||
Token)
|
||||
linestr_grab_string(String, LinePosn1, !.LinePosn, HexString),
|
||||
conv_string_to_int(HexString, base_16, signed, size_word, Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated hexadecimal literal")
|
||||
Token = report_int_ends_in_underscore(base_16)
|
||||
),
|
||||
linestr_get_context(LineContext1, Context)
|
||||
).
|
||||
@@ -4062,7 +4060,7 @@ get_number(Stream, !.LastDigit, !.RevChars, Token, !IO) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated decimal literal")
|
||||
Token = report_int_ends_in_underscore(base_10)
|
||||
)
|
||||
;
|
||||
Result = ok,
|
||||
@@ -4079,7 +4077,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 literal")
|
||||
Token = report_underscore_before_decimal_point
|
||||
)
|
||||
else if Char = 'u' then
|
||||
get_integer_size_suffix(Stream, !.RevChars, base_10, unsigned,
|
||||
@@ -4094,7 +4092,7 @@ get_number(Stream, !.LastDigit, !.RevChars, Token, !IO) :-
|
||||
get_float_exponent(Stream, !.RevChars, Token, !IO)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("underscore before exponent")
|
||||
Token = report_underscore_before_exponent
|
||||
)
|
||||
else
|
||||
io.putback_char(Stream, Char, !IO),
|
||||
@@ -4104,7 +4102,7 @@ get_number(Stream, !.LastDigit, !.RevChars, Token, !IO) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated decimal literal")
|
||||
Token = report_int_ends_in_underscore(base_10)
|
||||
)
|
||||
)
|
||||
).
|
||||
@@ -4141,7 +4139,7 @@ string_get_number(String, Len, !.LastDigit, Posn0, Token, Context, !Posn) :-
|
||||
LastPosn, TokenPrime, ContextPrime, !Posn)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
TokenPrime = error("unterminated decimal literal"),
|
||||
TokenPrime = report_underscore_before_decimal_point,
|
||||
string_get_context(Posn0, ContextPrime)
|
||||
)
|
||||
;
|
||||
@@ -4164,7 +4162,7 @@ string_get_number(String, Len, !.LastDigit, Posn0, Token, Context, !Posn) :-
|
||||
TokenPrime, ContextPrime, !Posn)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
TokenPrime = error("underscore before exponent"),
|
||||
TokenPrime = report_underscore_before_exponent,
|
||||
string_get_context(Posn0, ContextPrime)
|
||||
)
|
||||
)
|
||||
@@ -4180,7 +4178,7 @@ string_get_number(String, Len, !.LastDigit, Posn0, Token, Context, !Posn) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated decimal literal")
|
||||
Token = report_int_ends_in_underscore(base_10)
|
||||
),
|
||||
string_get_context(Posn0, Context)
|
||||
)
|
||||
@@ -4192,7 +4190,7 @@ string_get_number(String, Len, !.LastDigit, Posn0, Token, Context, !Posn) :-
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated decimal literal")
|
||||
Token = report_int_ends_in_underscore(base_10)
|
||||
),
|
||||
string_get_context(Posn0, Context)
|
||||
).
|
||||
@@ -4235,7 +4233,7 @@ linestr_get_number(String, Len, !.LastDigit, LineContext0, LinePosn0,
|
||||
TokenPrime, ContextPrime, !LineContext, !LinePosn)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
TokenPrime = error("unterminated decimal literal"),
|
||||
TokenPrime = report_underscore_before_decimal_point,
|
||||
linestr_get_context(LineContext0, ContextPrime)
|
||||
)
|
||||
;
|
||||
@@ -4261,7 +4259,7 @@ linestr_get_number(String, Len, !.LastDigit, LineContext0, LinePosn0,
|
||||
TokenPrime, ContextPrime, !LineContext, !LinePosn)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
TokenPrime = error("underscore before exponent"),
|
||||
TokenPrime = report_underscore_before_exponent,
|
||||
linestr_get_context(LineContext0, ContextPrime)
|
||||
)
|
||||
)
|
||||
@@ -4279,7 +4277,7 @@ linestr_get_number(String, Len, !.LastDigit, LineContext0, LinePosn0,
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated decimal literal")
|
||||
Token = report_int_ends_in_underscore(base_10)
|
||||
),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
)
|
||||
@@ -4291,7 +4289,7 @@ linestr_get_number(String, Len, !.LastDigit, LineContext0, LinePosn0,
|
||||
Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated decimal literal")
|
||||
Token = report_int_ends_in_underscore(base_10)
|
||||
),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
).
|
||||
@@ -5029,7 +5027,7 @@ linestr_get_float_exponent_3(String, Len, !.LastDigit, LineContext0, LinePosn0,
|
||||
conv_to_float(FloatString, Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated exponent in float literal")
|
||||
Token = report_exponent_ends_in_underscore
|
||||
),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
)
|
||||
@@ -5040,7 +5038,7 @@ linestr_get_float_exponent_3(String, Len, !.LastDigit, LineContext0, LinePosn0,
|
||||
conv_to_float(FloatString, Token)
|
||||
;
|
||||
!.LastDigit = last_digit_is_underscore,
|
||||
Token = error("unterminated exponent in float literal")
|
||||
Token = report_exponent_ends_in_underscore
|
||||
),
|
||||
linestr_get_context(LineContext0, Context)
|
||||
).
|
||||
@@ -5107,6 +5105,46 @@ rev_char_list_to_string(RevChars, String) :-
|
||||
null_character_error =
|
||||
error("null character is illegal in strings and names").
|
||||
|
||||
:- func report_zero_base_no_digits(integer_base) = token.
|
||||
|
||||
report_zero_base_no_digits(base_2) =
|
||||
error("0b is not followed by binary digits").
|
||||
report_zero_base_no_digits(base_8) =
|
||||
error("0o is not followed by octal digits").
|
||||
report_zero_base_no_digits(base_10) = _ :-
|
||||
% Decimal integers have no prefix.
|
||||
unexpected($pred, "base 10").
|
||||
report_zero_base_no_digits(base_16) =
|
||||
error("0x is not followed by hexadecimal digits").
|
||||
|
||||
:- func report_int_ends_in_underscore(integer_base) = token.
|
||||
|
||||
report_int_ends_in_underscore(base_2) =
|
||||
error("a binary literal cannot end with an underscore").
|
||||
report_int_ends_in_underscore(base_8) =
|
||||
error("an octal literal cannot end with an underscore").
|
||||
report_int_ends_in_underscore(base_10) =
|
||||
error("a decimal literal cannot end with an underscore").
|
||||
report_int_ends_in_underscore(base_16) =
|
||||
error("a hexadecimal literal cannot end with an underscore").
|
||||
|
||||
:- func report_exponent_ends_in_underscore = token.
|
||||
|
||||
report_exponent_ends_in_underscore =
|
||||
error("the exponent cannot end with an underscore").
|
||||
|
||||
:- func report_underscore_before_decimal_point = token.
|
||||
|
||||
report_underscore_before_decimal_point =
|
||||
error("an underscore should separate two digits; " ++
|
||||
"it should not appear just before a decimal point").
|
||||
|
||||
:- func report_underscore_before_exponent = token.
|
||||
|
||||
report_underscore_before_exponent =
|
||||
error("an underscore should separate two digits; " ++
|
||||
"it should not appear just before an exponent").
|
||||
|
||||
%---------------------------------------------------------------------------%
|
||||
|
||||
token_to_string(Token, String) :-
|
||||
|
||||
@@ -13,8 +13,8 @@ read_term("1_000_000_000_000_000_000_000.") = functor(integer(base_10, i(5, [138
|
||||
read_term("-1_000_000_000_000_000_000_000.") = functor(integer(base_10, i(-5, [-13877, -12907, -7261, -14976, 0]), signed, size_word), [], context("", 1))
|
||||
|
||||
Invalid decimal literals:
|
||||
read_term("123_.") = Syntax error: unterminated decimal literal
|
||||
read_term("-123_.") = Syntax error: unterminated decimal literal
|
||||
read_term("123_.") = Syntax error: an underscore should separate two digits; it should not appear just before a decimal point
|
||||
read_term("-123_.") = Syntax error: an underscore should separate two digits; it should not appear just before a decimal point
|
||||
read_term("-_123") = Syntax error: operator or `.' expected
|
||||
|
||||
Valid binary literals:
|
||||
@@ -26,12 +26,12 @@ read_term("0b_1000_100.") = functor(integer(base_2, i(1, [68]), signed, size_wor
|
||||
read_term("-0b_1000_100.") = functor(integer(base_2, i(-1, [-68]), signed, size_word), [], context("", 1))
|
||||
|
||||
Invalid binary literals:
|
||||
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
|
||||
read_term("0b.") = Syntax error: 0b is not followed by binary digits
|
||||
read_term("-0b.") = Syntax error: 0b is not followed by binary digits
|
||||
read_term("0b_.") = Syntax error: 0b is not followed by binary digits
|
||||
read_term("-0b_.") = Syntax error: 0b is not followed by binary digits
|
||||
read_term("0b11_.") = Syntax error: a binary literal cannot end with an underscore
|
||||
read_term("-0b11_.") = Syntax error: a binary literal cannot end with an underscore
|
||||
|
||||
Valid octal literals:
|
||||
read_term("0o77.") = functor(integer(base_8, i(1, [63]), signed, size_word), [], context("", 1))
|
||||
@@ -44,12 +44,12 @@ read_term("0o_7__7___7.") = functor(integer(base_8, i(1, [511]), signed, size_wo
|
||||
read_term("-0o_7__7___7.") = functor(integer(base_8, i(-1, [-511]), signed, size_word), [], context("", 1))
|
||||
|
||||
Invalid octal literals:
|
||||
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
|
||||
read_term("0o.") = Syntax error: 0o is not followed by octal digits
|
||||
read_term("-0o") = Syntax error: 0o is not followed by octal digits
|
||||
read_term("0o_.") = Syntax error: 0o is not followed by octal digits
|
||||
read_term("-0o_.") = Syntax error: 0o is not followed by octal digits
|
||||
read_term("0o77_.") = Syntax error: an octal literal cannot end with an underscore
|
||||
read_term("-0o77_.") = Syntax error: an octal literal cannot end with an underscore
|
||||
|
||||
Valid hexadecimal literals:
|
||||
read_term("0xff.") = functor(integer(base_16, i(1, [255]), signed, size_word), [], context("", 1))
|
||||
@@ -64,12 +64,12 @@ read_term("0xfffffffffffffffffffffffff.") = functor(integer(base_16, i(8, [3, 16
|
||||
read_term("-0xfffffffffffffffffffffffff.") = functor(integer(base_16, i(-8, [-3, -16383, -16383, -16383, -16383, -16383, -16383, -16383]), signed, size_word), [], context("", 1))
|
||||
|
||||
Invalid hexadecimal literals:
|
||||
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
|
||||
read_term("0x.") = Syntax error: 0x is not followed by hexadecimal digits
|
||||
read_term("-0x.") = Syntax error: 0x is not followed by hexadecimal digits
|
||||
read_term("0x_.") = Syntax error: 0x is not followed by hexadecimal digits
|
||||
read_term("-0x_.") = Syntax error: 0x is not followed by hexadecimal digits
|
||||
read_term("0xff_.") = Syntax error: a hexadecimal literal cannot end with an underscore
|
||||
read_term("-0xff_.") = Syntax error: a hexadecimal literal cannot end with an underscore
|
||||
|
||||
Valid float literals:
|
||||
read_term("0.123.") = functor(float(0.123), [], context("", 1))
|
||||
@@ -96,17 +96,17 @@ read_term("0_1.0.") = functor(float(1.0), [], 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 literal
|
||||
read_term("123_._123.") = Syntax error: unterminated decimal literal
|
||||
read_term("123_._123.") = Syntax error: an underscore should separate two digits; it should not appear just before a decimal point
|
||||
read_term("123._123.") = Syntax error: underscore following decimal point
|
||||
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("123_.123.") = Syntax error: an underscore should separate two digits; it should not appear just before a decimal point
|
||||
read_term("123_e12.") = Syntax error: an underscore should separate two digits; it should not appear just before an exponent
|
||||
read_term("123_E12.") = Syntax error: an underscore should separate two digits; it should not appear just before an exponent
|
||||
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("12_e11.") = Syntax error: an underscore should separate two digits; it should not appear just before an exponent
|
||||
read_term("12_E11.") = Syntax error: an underscore should separate two digits; it should not appear just before an exponent
|
||||
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
|
||||
|
||||
@@ -8,24 +8,32 @@ invalid_binary_literal.m:018: Error: no clauses for function `foo7'/0.
|
||||
invalid_binary_literal.m:019: Error: no clauses for function `foo8'/0.
|
||||
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 literal.
|
||||
invalid_binary_literal.m:023: Syntax error: 0b is not followed by binary
|
||||
invalid_binary_literal.m:023: digits.
|
||||
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 literal.
|
||||
invalid_binary_literal.m:025: Syntax error: 0b is not followed by binary
|
||||
invalid_binary_literal.m:025: digits.
|
||||
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 literal.
|
||||
invalid_binary_literal.m:027: Syntax error: 0b is not followed by binary
|
||||
invalid_binary_literal.m:027: digits.
|
||||
invalid_binary_literal.m:029: Syntax error at token `. ': unexpected token at
|
||||
invalid_binary_literal.m:029: start of (sub)term.
|
||||
invalid_binary_literal.m:029: Syntax error: unterminated binary literal.
|
||||
invalid_binary_literal.m:029: Syntax error: 0b is not followed by binary
|
||||
invalid_binary_literal.m:029: digits.
|
||||
invalid_binary_literal.m:031: Syntax error at token `. ': unexpected token at
|
||||
invalid_binary_literal.m:031: start of (sub)term.
|
||||
invalid_binary_literal.m:031: Syntax error: unterminated binary literal.
|
||||
invalid_binary_literal.m:031: Syntax error: a binary literal cannot end with an
|
||||
invalid_binary_literal.m:031: underscore.
|
||||
invalid_binary_literal.m:033: Syntax error at token `. ': unexpected token at
|
||||
invalid_binary_literal.m:033: start of (sub)term.
|
||||
invalid_binary_literal.m:033: Syntax error: unterminated binary literal.
|
||||
invalid_binary_literal.m:033: Syntax error: a binary literal cannot end with an
|
||||
invalid_binary_literal.m:033: underscore.
|
||||
invalid_binary_literal.m:035: Error: clause for predicate `b11'/0
|
||||
invalid_binary_literal.m:035: without corresponding `:- pred' declaration.
|
||||
invalid_binary_literal.m:035: Inferred :- pred b11.
|
||||
invalid_binary_literal.m:035: Syntax error: unterminated decimal literal.
|
||||
invalid_binary_literal.m:037: Syntax error: unterminated decimal literal.
|
||||
invalid_binary_literal.m:035: Syntax error: a decimal literal cannot end with
|
||||
invalid_binary_literal.m:035: an underscore.
|
||||
invalid_binary_literal.m:037: Syntax error: a decimal literal cannot end with
|
||||
invalid_binary_literal.m:037: an underscore.
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
invalid_decimal_literal.m:012: Error: no clauses for function `foo1'/0.
|
||||
invalid_decimal_literal.m:013: Error: no clauses for function `foo2'/0.
|
||||
invalid_decimal_literal.m:017: Syntax error: unterminated decimal literal.
|
||||
invalid_decimal_literal.m:019: Syntax error: unterminated decimal literal.
|
||||
invalid_decimal_literal.m:017: Syntax error: an underscore should separate two
|
||||
invalid_decimal_literal.m:017: digits; it should not appear just before a
|
||||
invalid_decimal_literal.m:017: decimal point.
|
||||
invalid_decimal_literal.m:019: Syntax error: an underscore should separate two
|
||||
invalid_decimal_literal.m:019: digits; it should not appear just before a
|
||||
invalid_decimal_literal.m:019: decimal point.
|
||||
|
||||
@@ -16,24 +16,30 @@ invalid_float_literal.m:027: Syntax error: fractional part of float terminated
|
||||
invalid_float_literal.m:027: by underscore.
|
||||
invalid_float_literal.m:029: Syntax error at token `. ': unexpected token at
|
||||
invalid_float_literal.m:029: start of (sub)term.
|
||||
invalid_float_literal.m:029: Syntax error: unterminated exponent in float
|
||||
invalid_float_literal.m:029: literal.
|
||||
invalid_float_literal.m:029: Syntax error: the exponent cannot end with an
|
||||
invalid_float_literal.m:029: underscore.
|
||||
invalid_float_literal.m:031: In clause head:
|
||||
invalid_float_literal.m:031: error: expected a symbol name, got `12'.
|
||||
invalid_float_literal.m:031: Syntax error: underscore before exponent.
|
||||
invalid_float_literal.m:031: Syntax error: an underscore should separate two
|
||||
invalid_float_literal.m:031: digits; it should not appear just before an
|
||||
invalid_float_literal.m:031: exponent.
|
||||
invalid_float_literal.m:033: In clause head:
|
||||
invalid_float_literal.m:033: error: expected a symbol name, got `_12'.
|
||||
invalid_float_literal.m:033: Syntax error: unterminated exponent in float
|
||||
invalid_float_literal.m:033: literal.
|
||||
invalid_float_literal.m:035: In clause head:
|
||||
invalid_float_literal.m:035: error: expected a symbol name, got `_123'.
|
||||
invalid_float_literal.m:035: Syntax error: unterminated decimal literal.
|
||||
invalid_float_literal.m:035: Syntax error: an underscore should separate two
|
||||
invalid_float_literal.m:035: digits; it should not appear just before a
|
||||
invalid_float_literal.m:035: decimal point.
|
||||
invalid_float_literal.m:037: In clause head:
|
||||
invalid_float_literal.m:037: error: expected a symbol name, got `123'.
|
||||
invalid_float_literal.m:037: Syntax error: underscore following decimal point.
|
||||
invalid_float_literal.m:039: In clause head:
|
||||
invalid_float_literal.m:039: error: expected a symbol name, got `123'.
|
||||
invalid_float_literal.m:039: Syntax error: unterminated decimal literal.
|
||||
invalid_float_literal.m:039: Syntax error: an underscore should separate two
|
||||
invalid_float_literal.m:039: digits; it should not appear just before a
|
||||
invalid_float_literal.m:039: decimal point.
|
||||
invalid_float_literal.m:041: Error: clause for predicate `-'/2
|
||||
invalid_float_literal.m:041: without corresponding `:- pred' declaration.
|
||||
invalid_float_literal.m:041: Inferred :- pred -(T1, int).
|
||||
@@ -46,7 +52,9 @@ invalid_float_literal.m:043: Syntax error: unterminated exponent in float
|
||||
invalid_float_literal.m:043: literal.
|
||||
invalid_float_literal.m:045: In clause head:
|
||||
invalid_float_literal.m:045: error: expected a symbol name, got `12'.
|
||||
invalid_float_literal.m:045: Syntax error: underscore before exponent.
|
||||
invalid_float_literal.m:045: Syntax error: an underscore should separate two
|
||||
invalid_float_literal.m:045: digits; it should not appear just before an
|
||||
invalid_float_literal.m:045: exponent.
|
||||
invalid_float_literal.m:047: In clause head:
|
||||
invalid_float_literal.m:047: error: expected a symbol name, got `_12'.
|
||||
invalid_float_literal.m:047: Syntax error: unterminated exponent in float
|
||||
|
||||
@@ -8,24 +8,32 @@ invalid_hex_literal.m:018: Error: no clauses for function `foo7'/0.
|
||||
invalid_hex_literal.m:019: Error: no clauses for function `foo8'/0.
|
||||
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 hexadecimal literal.
|
||||
invalid_hex_literal.m:023: Syntax error: 0x is not followed by hexadecimal
|
||||
invalid_hex_literal.m:023: digits.
|
||||
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 hexadecimal literal.
|
||||
invalid_hex_literal.m:025: Syntax error: 0x is not followed by hexadecimal
|
||||
invalid_hex_literal.m:025: digits.
|
||||
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 hexadecimal literal.
|
||||
invalid_hex_literal.m:027: Syntax error: 0x is not followed by hexadecimal
|
||||
invalid_hex_literal.m:027: digits.
|
||||
invalid_hex_literal.m:029: Syntax error at token `. ': unexpected token at
|
||||
invalid_hex_literal.m:029: start of (sub)term.
|
||||
invalid_hex_literal.m:029: Syntax error: unterminated hexadecimal literal.
|
||||
invalid_hex_literal.m:029: Syntax error: 0x is not followed by hexadecimal
|
||||
invalid_hex_literal.m:029: digits.
|
||||
invalid_hex_literal.m:031: Syntax error at token `. ': unexpected token at
|
||||
invalid_hex_literal.m:031: start of (sub)term.
|
||||
invalid_hex_literal.m:031: Syntax error: unterminated hexadecimal literal.
|
||||
invalid_hex_literal.m:031: Syntax error: a hexadecimal literal cannot end with
|
||||
invalid_hex_literal.m:031: an underscore.
|
||||
invalid_hex_literal.m:033: Syntax error at token `. ': unexpected token at
|
||||
invalid_hex_literal.m:033: start of (sub)term.
|
||||
invalid_hex_literal.m:033: Syntax error: unterminated hexadecimal literal.
|
||||
invalid_hex_literal.m:033: Syntax error: a hexadecimal literal cannot end with
|
||||
invalid_hex_literal.m:033: an underscore.
|
||||
invalid_hex_literal.m:035: Error: clause for predicate `xff'/0
|
||||
invalid_hex_literal.m:035: without corresponding `:- pred' declaration.
|
||||
invalid_hex_literal.m:035: Inferred :- pred xff.
|
||||
invalid_hex_literal.m:035: Syntax error: unterminated decimal literal.
|
||||
invalid_hex_literal.m:037: Syntax error: unterminated decimal literal.
|
||||
invalid_hex_literal.m:035: Syntax error: a decimal literal cannot end with an
|
||||
invalid_hex_literal.m:035: underscore.
|
||||
invalid_hex_literal.m:037: Syntax error: a decimal literal cannot end with an
|
||||
invalid_hex_literal.m:037: underscore.
|
||||
|
||||
@@ -8,24 +8,28 @@ invalid_octal_literal.m:018: Error: no clauses for function `foo7'/0.
|
||||
invalid_octal_literal.m:019: Error: no clauses for function `foo8'/0.
|
||||
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 literal.
|
||||
invalid_octal_literal.m:023: Syntax error: 0o is not followed by octal digits.
|
||||
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 literal.
|
||||
invalid_octal_literal.m:025: Syntax error: 0o is not followed by octal digits.
|
||||
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 literal.
|
||||
invalid_octal_literal.m:027: Syntax error: 0o is not followed by octal digits.
|
||||
invalid_octal_literal.m:029: Syntax error at token `. ': unexpected token at
|
||||
invalid_octal_literal.m:029: start of (sub)term.
|
||||
invalid_octal_literal.m:029: Syntax error: unterminated octal literal.
|
||||
invalid_octal_literal.m:029: Syntax error: 0o is not followed by octal digits.
|
||||
invalid_octal_literal.m:031: Syntax error at token `. ': unexpected token at
|
||||
invalid_octal_literal.m:031: start of (sub)term.
|
||||
invalid_octal_literal.m:031: Syntax error: unterminated octal literal.
|
||||
invalid_octal_literal.m:031: Syntax error: an octal literal cannot end with an
|
||||
invalid_octal_literal.m:031: underscore.
|
||||
invalid_octal_literal.m:033: Syntax error at token `. ': unexpected token at
|
||||
invalid_octal_literal.m:033: start of (sub)term.
|
||||
invalid_octal_literal.m:033: Syntax error: unterminated octal literal.
|
||||
invalid_octal_literal.m:033: Syntax error: an octal literal cannot end with an
|
||||
invalid_octal_literal.m:033: underscore.
|
||||
invalid_octal_literal.m:035: Error: clause for predicate `o77'/0
|
||||
invalid_octal_literal.m:035: without corresponding `:- pred' declaration.
|
||||
invalid_octal_literal.m:035: Inferred :- pred o77.
|
||||
invalid_octal_literal.m:035: Syntax error: unterminated decimal literal.
|
||||
invalid_octal_literal.m:037: Syntax error: unterminated decimal literal.
|
||||
invalid_octal_literal.m:035: Syntax error: a decimal literal cannot end with an
|
||||
invalid_octal_literal.m:035: underscore.
|
||||
invalid_octal_literal.m:037: Syntax error: a decimal literal cannot end with an
|
||||
invalid_octal_literal.m:037: underscore.
|
||||
|
||||
Reference in New Issue
Block a user