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 回答