質問

事実上、一連のレクサートークンを操作する一連の再帰関数であるパー​​サーがあります。

私が遭遇している問題は、再帰的な関数呼び出しでシーケンスが最初から再開されるように見えることです。次の関数のスケルトン定義があるとします。 Parse

    let restricted = Seq.take_while token_search tokens
    let compiled_nodes = Seq.fold (fun list (next: Lexer.Token) -> list @ parse_token this restricted next) [] restricted

関数 parse_token に電話がかかる可能性があります Parse.

ただし、その場合、パラメータは tokens 最終的にはシーケンスの先頭に配置されます。

シーケンスを必要な位置に配置し続ける方法について何かアイデアはありますか?

ティア

役に立ちましたか?

解決

私はあなたをあまりフォローしていないので、もう少し大きなスニペットを投稿する必要があるかもしれません。

とはいえ、シーケンス (IEnumerable) は単なるシーケンスであり、for (foreach) または Seq.Whatever を実行するたびに、シーケンスが「再反復」されます。あなたが何をしたいのか、何が起こると予想しているのかは不明ですが、通常、トークンを消費/コミットされた領域と先読み領域に分割するため、解析の場合、シーケンスとして「トークン」を表すことは「間違っている」可能性があります。

また、通常、「シーケンスの反復」に副作用が生じることは望ましくないことにも注意してください。

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