Haskell词法布局规则的实现

我一直在研究一种带有Haskell语法的宠物语言。 Haskell做的其中一件我一直试图复制的东西是插入{,}和; 在解析步骤之前,基于代码布局的令牌。

我发现http://www.haskell.org/onlinereport/syntax-iso.html,其中包括如何实现布局程序的规范,并且已经制作了它的一个版本(当然修改了我的(更简单的) 语言)。

不幸的是,我得到了以下不正确的输出:

f (do xyz) ab

它应该产生令牌流ID ( DO { ID ID ID } ) ID ID ,但它会产生令牌流ID ( DO { ID ID ID ) ID ID }

我想这是由于我不满意的parse-error(t)parse-error(t) = false )的实现,但我不知道如何有效地实现parse-error(t)

像GHC等Haskell编译器如何处理这种情况? 有没有简单的方法来实现parse-error(t) ,以便它处理这种情况(并希望其他人,我还没有注意到)?


我最终实现了由JISON编译的解析器使用的解析算法的自定义版本,该解析器采用不可变状态对象和令牌,并在返回之前尽可能多地使用令牌执行工作。 然后,我可以使用此实现来检查令牌是否会产生分析错误,并轻松回滚到分析器的以前状态。

它工作得很好,虽然现在有些破解。 你可以在这里找到代码:https://github.com/mystor/myst/blob/cb9b7b7d83e5d00f45bef0f994e3a4ce71c11bee/compiler/layout.js

我试着做@augustss建议的东西,使用错误生产来伪造令牌的插入,但看起来好像JISON没有我需要的所有工具来获得可靠的实现,并重新实现了剥离 - 解析算法的低版本变得更容易,并且与原始文档更好地对齐。

链接地址: http://www.djcxy.com/p/43159.html

上一篇: Haskell lexical layout rule implementation

下一篇: case generic type parameters for primitives