我一直在研究一种宠物语言,它具有类似Haskell的语法.Haskell做的一件很好的事情,我一直试图复制,是它插入{,}和; 在解析步骤之前,基于代码布局的标记.
我找到了http://www.haskell.org/onlinereport/syntax-iso.html,其中包含了如何实现布局程序的规范,并制作了它的一个版本(当然,为我修改了(更简单) ) 语言).
不幸的是,我输出的输出不正确:
f (do x y z) a b
它应该是生成令牌流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 没有获得可靠实现所需的所有工具,并重新实现了剥离的-解析算法的向下版本被证明更容易,并且与原始文档更加一致。