質問

私のASTモデルは、位置情報(Filename、Line、Index)を伝える必要があります。この情報にアクセスするための構築された方法はありますか?参照ドキュメントから、ストリームは位置を運ぶように見えますが、ポジションを保存するためだけにダミーパーサーを実装して、どこにでも追加する必要はないことを望みます。

前もって感謝します

役に立ちましたか?

解決

パーサーは、実際には、ストリームから返信までの関数のタイプの略語です。

Parser<_,_> is just CharStream<_> -> Reply<_>

それを念頭に置いて、ポジション用のカスタムパーサーを簡単に書き込むことができます。

let position : CharStream<_> -> Reply<Position> = fun stream -> Reply(stream.Position)
(* OR *)
let position : Parser<_,_> = fun stream -> Reply stream.Position

そして、あなたが使用して解析するすべてのビットにポジション情報をasttach

position .>>. yourParser (*or tuple2 position yourParser*)

Position Parserは入力を消費しないため、そのように組み合わせることは安全です。

君は できる 必要なコードの変更を単一の行に制限し、制御できないコードの広がりを避けます。

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     *)

アップデート: :FPARSECには、ポジション用の定義済みのパーサーがあります。http://www.quanttec.com/fparsec/reference/charparsers.html#members.getPosition

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top