我有一个解析器,它实际上是一组在词法分析器令牌上运行的递归函数。
我遇到的问题是序列似乎从递归函数调用开始重新启动。给出函数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
答案 0 :(得分:2)
我认为您可能需要发布一个稍微大一点的片段,因为我不太关注您。
也就是说,一个序列(IEnumerable)只是 - 一个序列,每次你(foreach)或Seq.Whatever它,它将“重新迭代”序列。我不清楚你想做什么,以及你期望发生什么,但对于解析,将'标记'表示为序列可能是'错误的',因为你通常将标记分为消耗/提交区域和前瞻区域。
另请注意,您通常不希望“迭代序列”产生副作用。