scala – 解析器组合器,分离语法和AST构建
我正在使用解析器组合器库在Scala中编写一个简单的函数式编程语言。
语法在此指定:https://github.com/hejfelix/Frase/blob/master/src/main/scala/it/vigtig/lambda/ParserLike.scala 有一件事我无法通过实现来解决:如何将语法定义从转换中分离为AST节点? 直接使用解析器来源,可以直观地使用人机可读的语法,尤其是考虑到我是项目自动提款机上唯一的程序员,可以作为文档。 如何分离语法和AST特定的代码? 解决方法
这是一个很好的问题,而且我在很长一段时间内遇到了一个很困难的问题,然后才提出了一个我觉得对我来说非常合适的解决方案。
当构建解析器时,我使用两种不同的语法树: >一个具体的语法树,或CST:这是文本的树形,并且与文本具有1:1的对应关系。文本中出现的所有内容也将显示在CST中。 因此,从输入文本到AST有两个步骤:第一步是将输入字符串解析成CST;第二步是将CST转换为AST,扔掉不必要的细节。 > String – > CST这是我使用解析器组合器的地方。在这个阶段我不会对树结构进行任何操纵。 CST的结构完全由所使用的组合器决定。每个组合器产生一个特定形状的子树,在这个阶段我从不改变。对组合器没有任何操作,因此语法定义是干净的,没有任何AST信息。 示例:这是一个使用此方法构建的JSON解析器: > the general parser combinators (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |