加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 解析器组合器,分离语法和AST构建

发布时间:2020-12-16 09:42:05 所属栏目:安全 来源:网络整理
导读:我正在使用解析器组合器库在Scala中编写一个简单的函数式编程语言。 语法在此指定:https://github.com/hejfelix/Frase/blob/master/src/main/scala/it/vigtig/lambda/ParserLike.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:这不一定与文本1对应,因为不必要的文本细节(如大括号,标点符号等)已被删除,不会出现在AST中。

因此,从输入文本到AST有两个步骤:第一步是将输入字符串解析成CST;第二步是将CST转换为AST,扔掉不必要的细节。

> String – > CST这是我使用解析器组合器的地方。在这个阶段我不会对树结构进行任何操纵。 CST的结构完全由所使用的组合器决定。每个组合器产生一个特定形状的子树,在这个阶段我从不改变。对组合器没有任何操作,因此语法定义是干净的,没有任何AST信息。
> CST – > AST这是我按摩解析树的地方,提取重要的东西,忽略其余的。这也是我经常执行上下文相关检查(例如:检查函数定义没有重复的参数名称),将这些细节保留在实际的解析阶段之外。

示例:这是一个使用此方法构建的JSON解析器:

> the general parser combinators
> the combinator for building CST nodes
> the actual JSON parser that builds a CST

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读