我正在尝试将使用Parsec在Haskell中编写的语法转换为Scala的语法分析器组合子。
实际匹配表达式的翻译非常简单,至少在我看来,在Scala中甚至更容易一些。我完全不清楚的是如何处理Parsec使用monad传递的有状态性。
Scala解析器读取Input并生成ParseResult[T]。
相反,Haskell中的GenParser读取输入和状态,并生成另一个解析器。在Scala中传递这种状态让我感到困惑。
有人愿意分享Scala中有状态解析的例子吗?
据我所知,在Scala Parsers Combinators中处理状态填充的唯一方法是通过into
方法,也称为>>
和flatMap
(是的,您可以在中使用它进行理解)。然而,它将状态(或者更准确地说,解析结果)传递到解析器中,而不是传递到下一个解析器中,这似乎就是您所描述的。
由于不知道Haskell的Parsec,我很难猜测如何使用它来翻译你的语法。
另请参阅此问题。有一篇关于Scala解析器组合子的非常有趣的论文,但我没能找到。