Positionsinformationen in FPARSEC
Frage
Mein AST -Modell muss Standortinformationen (Dateiname, Zeile, Index) tragen. Gibt es eingebaute Möglichkeiten, um auf diese Informationen zuzugreifen? Aus den Referenzdokumenten scheint der Stream die Position zu übertragen, aber ich würde es vorziehen, dass ich keinen Dummy -Parser implementieren muss, um die Position zu retten, und dies überall hinzufügen.
Danke im Voraus
Lösung
Parser sind tatsächlich Abkürzungen für Funktionen von Streams bis zu Antworten:
Parser<_,_> is just CharStream<_> -> Reply<_>
Beachten Sie dies, können Sie problemlos einen benutzerdefinierten Parser für Positionen schreiben:
let position : CharStream<_> -> Reply<Position> = fun stream -> Reply(stream.Position)
(* OR *)
let position : Parser<_,_> = fun stream -> Reply stream.Position
und Atttach -Positionsinformationen zu jedem Bit, den Sie verwenden, verwenden
position .>>. yourParser (*or tuple2 position yourParser*)
Position Parser konsumiert keine Eingabe und es ist daher sicher, sich auf diese Weise zu kombinieren.
Du kann Halten Sie die erforderliche Codeänderung auf eine einzelne Zeile beschränkt und vermeiden Sie unkontrollierbare Codespread:
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 *)
Aktualisieren: FPARSEC hat einen vordefinierten Parser für Positionen:http://www.quanttec.com/fparsec/reference/charparsers.html#members.getposition