Рассмотрим этот синтаксический анализатор, который преобразует цифровые строки в int
s:
let toInt (s:string) =
match Int32.TryParse(s) with
| (true, n) -> preturn n
| _ -> fail "Number must be below 2147483648"
let naturalNum = many1Chars digit >>= toInt <?> "natural number"
Когда я запускаю его на нечисловых строках, таких как "abc"
, он показывает правильное сообщение об ошибке:
Error in Ln: 1 Col: 1
abc
^
Expecting: natural number
Но когда я даю ему числовую строку, превышающую диапазон int
, это дает следующее непродуктивное сообщение:
Error in Ln: 1 Col: 17
9999999999999999
^
Note: The error occurred at the end of the input stream.
Expecting: decimal digit
Other error messages:
Number must be below 2147483648
Основное сообщение "Expecting: decimal digit"
не имеет смысла, потому что мы должныуже много цифр.
Есть ли способ избавиться от него и показать только "Number must be below 2147483648"
?
Полный пример:
open System
open FParsec
[<EntryPoint>]
let main argv =
let toInt (s:string) =
match Int32.TryParse(s) with
| (true, n) -> preturn n
| _ -> fail "Number must be below 2147483648"
let naturalNum = many1Chars digit >>= toInt <?> "natural number"
match run naturalNum "9999999999999999" with
| Failure (msg, _, _) -> printfn "%s" msg
| Success (a, _, _) -> printfn "%A" a
0