将Haskell Parsec语法翻译成Scala?

9

我正在尝试使用Scala的解析器组合器将使用Parsec编写的Haskell语法转换为Scala。

实际匹配表达式的翻译非常简单,至少在我看来,在Scala中甚至更容易。但是,让我完全不清楚的是如何处理Parsec使用单子传递的状态。

Scala解析器读取输入并产生ParseResult[T]。

相比之下,Haskell中的GenParser读取输入和状态,并生成另一个解析器。在Scala中传递该状态让我感到困惑。

有人能分享一下他们愿意分享的Scala中的有状态解析示例吗?


+1 哦哦,我实现了一个有状态的解析器,通过将(隐式、可变)参数传递给解析器。我真的想将其抽象为单子或类似的东西。 - ziggystar
当我看到Scarpia(https://github.com/runarorama/scarpia)时,我感到非常兴奋,但似乎这只是一个从未完成的移植的良好开端。 - Todd O'Bryan
我已经创建了一组解析器组合器,除了输入之外还有状态。在我对它们进行足够的测试并对设计进行了足够的调整后,才能确定它们是否有效并且我是否满意。一旦这个过程完成,我会将它们发布在GitHub或其他地方。 - Todd O'Bryan
1个回答

2
我所知道的处理Scala Parsers Combinators中状态的唯一方法是通过into方法,也称为>>flatMap(是的,你可以在for-comprehensions中使用它)。然而,它将状态(或更精确地说,解析结果)传递到解析器中,而不是沿着下一个解析器,这似乎是您所描述的内容。
不了解Haskell的Parsec,很难猜测如何将其用于翻译您的语法。
另请参见此问题。有一篇非常有趣的关于Scala parser combinators的论文,但我找不到它。在Scala Lang上挖掘可能会找到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接