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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top