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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top