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