2

一連のレクサートークンで動作する再帰関数のセットであるパー​​サーがあります。

私が直面している問題は、再帰的な関数呼び出しでシーケンスが最初から再開されるように見えることです。次の関数のスケルトン定義が与えられた場合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はシーケンスの先頭に配置されてしまいます。

シーケンスを必要な場所に配置する方法についてのアイデアはありますか?

ティア

4

1 に答える 1

3

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

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

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

于 2009-03-02T22:29:33.100 に答える