2009-03-02 24 views
1

我有一个解析器,它实际上是一系列操作一系列词法分析令牌的递归函数。什么导致F#序列重新枚举?

我遇到的问题是,序列似乎从递归函数调用开始重新启动。鉴于以下骨架定义功能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结束位于序列的开始位置。

关于如何将序列定位在需要的位置的任何想法?

TIA

回答

2

我想你可能需要张贴稍大的片段,因为我不太跟随你。这就是说,一个序列(IEnumerable)就是这样 - 一个序列,每次你为(foreach)或者Seq。无论它在哪里,它都会'重新'迭代序列。我不清楚你想做什么,以及你期望发生什么,但是对于一个解析来说,代表'标记'作为一个序列可能是'错误的',因为你通常将标记分成一个消费/提交区域和一个前瞻区域。

还要注意,你通常不希望'迭代序列'有副作用。

+0

你很正确。我意识到在我发布这个问题之后,意识到问题所在。我试图建立一个共享IEnumerator的等价物,这是错误的方法。我最终将它建立在名单上,传递了未消耗的剩余。 – kolosy 2009-03-03 00:00:15