Informations sur la position dans fparsec
Question
Mes besoins du modèle AST aux informations de localisation de transport (nom de fichier, ligne, index). Y at-il construit de manière à accéder à cette information? A partir de la documentation de référence, le flux semble porter la position, mais je préférerais que je ne dois mettre en œuvre un analyseur factice juste pour enregistrer la position, et d'ajouter que partout.
Merci à l'avance
La solution
Parsers sont de type réellement abréviations pour les fonctions de flux de réponses:
Parser<_,_> is just CharStream<_> -> Reply<_>
En gardant cela à l'esprit, vous pouvez facilement écrire un analyseur personnalisé pour les positions:
let position : CharStream<_> -> Reply<Position> = fun stream -> Reply(stream.Position)
(* OR *)
let position : Parser<_,_> = fun stream -> Reply stream.Position
et des informations de position Joignez une à chaque bit vous analysez en utilisant
position .>>. yourParser (*or tuple2 position yourParser*)
analyseur de position ne consomme aucune entrée et il est donc sûr de combiner cette façon.
peut garder le changement de code requis limité à une seule ligne et éviter la propagation de code incontrôlable:
type AST = Slash of int64
| Hash of int64
let slash : Parser<AST,_> = char '/' >>. pint64 |>> Slash
let hash : Parser<AST,_> = char '#' >>. pint64 |>> Hash
let ast : Parser<AST,_> = slash <|> hash
(*if this is the final parser used for parsing lists of your ASTs*)
let manyAst : Parser< AST list,_> = many (ast .>> spaces)
let manyAstP : Parser<(Position * AST) list,_> = many ((position .>>. ast) .>> spaces)
(*you can opt in to parse position information for every bit
you parse just by modifiying only the combined parser *)
Mise à jour : FParsec a un analyseur prédéfini pour des positions: http://www.quanttec.com/fparsec/reference/charparsers.html # members.getPosition