7 votes

Détecter si FParsec n'a pas analysé toutes les données d'entrée

Comment détecter qu'un analyseur FParsec s'est arrêté sans avoir analysé toutes les entrées ?

Par exemple, l'analyseur syntaxique suivant p s'arrête lorsqu'il trouve le caractère inattendu d et ne continue pas à analyser le reste de l'entrée.

let test p str =
    match run p str with
    | Success(result, _, _)   -> printfn "Success: %A" result
    | Failure(errorMsg, s, _) -> printfn "Failure: %s %A" errorMsg s 

let str s = pstring s

let a = str "a" .>> spaces
let b = str "b" .>> spaces
let p = many (a <|> b)

test p "ab a  d bba  " // Success: ["a"; "b"; "a"]

6voto

FuleSnabel Points 2769

Il existe un analyseur spécial eof qui correspond à $ dans les expressions rationnelles.

Essayez ceci :

let p = many (a <|> b) .>> eof

Cela garantit que l'analyseur syntaxique ne réussit que si l'entrée a été entièrement consommée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X