LL 自顶向下解析器,从 CST 到 AST

2024-02-05

我目前正在学习语法分析,尤其是自上而下的解析。

我知道术语以及与自下而上的 LR 解析器的区别,并且由于自上而下的 LL 解析器更容易手动实现,所以我期待着制作自己的解析器。

我见过两种方法:

  • 递归下降使用一组递归函数。
  • 基于堆栈和表驱动的自动机为在维基百科上显示 https://en.wikipedia.org/wiki/LL_parser#Parser_implementation_in_C++.

我对后者更感兴趣,因为它的强大功能以及它消除了调用堆栈递归。但是,我不明白如何从隐式解析树构建 AST。

这段代码示例 https://gist.github.com/DmitrySoshnikov/29f7a9425cdab69ea68f基于堆栈的有限自动机显示解析器分析输入缓冲区,仅在语法被接受时给出是/否答案。

我听说过使用堆栈注释来构建 AST,但我不知道如何实现它们。有人可以提供这种技术的实际实现吗?


“自上而下”和“自下而上”是对两种解析策略的极好描述,因为它们精确地描述了语法树如果被构造的话将如何构造。 (您也可以将其视为隐式解析树的遍历顺序,但这里我们实际上对真正的解析树感兴趣。)

显然,自下而上的树构建有一个优势。当需要向树中添加节点时,您已经知道它的子节点是什么。您可以通过一个(功能性)操作构建完整的节点。所有子节点信息都在那里等着您,因此您可以根据子节点的语义信息向节点添加语义信息,甚至可以按照从左到右以外的顺序使用子节点。

相比之下,自上而下的解析器构造没有任何子节点的节点,然后需要将每个子节点依次添加到已经构造的节点中。这当然是可能的,但有点难看。此外,节点构造函数的增量性质意味着附加到节点的语义信息也需要增量计算,或者推迟到节点完全构造完成为止。

在许多方面,这类似于计算用逆波兰表示法 (RPN) 编写的表达式与用(正向)波兰表示法编写的表达式之间的差异 [注 1]。 RPN 的发明正是为了简化评估,这可以通过简单的值堆栈实现。显然,正向波兰表达式可以求值:最简单的方法是使用递归求值器,但在不能依赖调用堆栈的环境中,可以使用运算符堆栈来实现,这可以有效地将表达式转换为 RPN飞。

因此,这也可能是从自顶向下解析器构建语法树的选择机制。我们在每个右侧的末尾添加一个“减少”标记。由于标记位于右侧末端,因此它被先推入。

我们还需要一个值堆栈,来记录正在构造的 AST 节点(或语义值)。

在基本算法中,我们现在还有一种情况。我们首先弹出解析器堆栈的顶部,然后检查该对象:

  • 解析器堆栈的顶部是一个终端。如果当前输入符号是相同的终端,我们从输入中删除输入符号,并将其(或其语义值)压入值堆栈。

  • 解析器堆栈的顶部是一个标记。关联的归约操作被触发,该操作将通过从值堆栈中弹出适当数量的值并将它们组合成一个新的 AST 节点来创建新的 AST 节点,然后将该新的 AST 节点推送到值堆栈上。 (作为一种特殊情况,增强开始符号的独特制作的标记动作S' -> S $导致解析被接受,返回值堆栈中的(唯一)值作为 AST。)

  • 解析器堆栈的顶部是非终端。然后,我们使用当前输入符号识别适当的右侧,并将该右侧(从右到左)推送到解析器堆栈上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LL 自顶向下解析器,从 CST 到 AST 的相关文章

  • python 3 argparse 调用函数

    我想在 python3 中创建一个类似命令行 类似 shell 的界面 Argparse 似乎负责解析和显示帮助 错误消息 根据argparse 的 python3 文档 https docs python org 3 5 library
  • Magento - 将特定父类别的子类别列为链接

    我是 php 的初学者 并且一直试图将一个父类别的子类别作为链接调用 我得到了这个 它调出了 getName 但 getUrl 根本没有返回任何 URL 输出代码只是 li a href name of sub a li
  • Swift 3 中的 JSON 解析

    有没有人能够找到一种在 Swift 3 中解析 JSON 文件的方法 我已经能够返回数据 但在将数据分解为特定字段时我没有成功 我会发布示例代码 但我已经尝试了很多不同的方法但没有成功 并且没有保存任何代码 我想要解析的基本格式是这样的 提
  • SQL Server OPENJSON读取嵌套json

    我有一些想要在 SQL Server 2016 中解析的 json 有一个项目 gt 结构 gt 属性的层次结构 我想编写一个解析整个层次结构的查询 但我不想通过索引号指定任何元素 即我不想做这样的事情 openjson json 0 or
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 自动将 JSON 对象映射到 Ruby 中的实例变量

    我希望能够自动将 JSON 对象解析为实例变量 例如 使用此 JSON require httparty json HTTParty get http api dribbble com players simplebits gt shots
  • _实际_ Twitter 主题标签格式?不是你的正则表达式,也不是他的代码——真正的代码?

    更新 如果可以的话 请使用 Twitter 的实体 他们为您以及其他项目找到了解决方案 我的情况是 我只有没有实体的推文和所有额外的元数据 我花了我认为不合理的时间试图找到actual主题标签的格式 据我搜索得知 Twitter 尚未发布任
  • 用于解析差异的 PHP 类

    我正在编写一个 PHP 脚本 需要解释 Git 创建的 Diff 文件 如果我想解析 Diff 文件并基本上以完全不同的格式打印它 我应该如何进行 我遇到过Text DiffPEAR 库 但该库仅创建 Diff 本身 或者更确切地说 它只需
  • MongoDB 中有内置的 JSON.parse 吗?

    是否有任何 Mongo 命令行 函 数可以将字符串转换为对象 例如JSON parse 或类似的东西 db sessions update set extra JSON parse stringData 我的解决方案 function my
  • 使用 XSLT 转换 XML 并保留 CDATA(在 Ruby 中)

    我正在尝试将包含如下内容的文档转换为另一个文档 使 CDATA 与第一个文档中的完全相同 但我还没有弄清楚如何使用 XSLT 保留 CDATA 初始 XML
  • 解析dev/input/event触摸事件

    我能够在 Android 手机上从 dev input event 读取事件 然而 它们是按一定顺序排列的行代码 就像触摸事件给出的那样 3 53 216 3 54 444 3 48 40 3 50 5 0 2 0 0 0 0 如何将它们解
  • 使用 GSON 将 JSON 字符串转换为 Java 对象

    我正在尝试将 json 解析为 java 根据 jsonlint com 我有以下字符串 该字符串是有效的 json private final static String LOC JSON lat1 39 737567 lat2 32 7
  • 在 C++ 中解析逗号分隔的数字

    我有一个简短的问题要问大家 我正在尝试编写一个简单的代码来从用户输入中提取数字并将其保存到 int 数组中 但我很难思考如何使其工作 下面显示的代码适用于单位数 但不适用于超过 1 位的数字 例如 如果用户输入 1 2 3 4 50 60
  • include 内的 ASP.net 代码不执行

    我已经很长时间没有涉足服务器端了 但在我看来 嵌入在包含的代码文件中的脚本应该正常执行 由于某种原因 情况似乎并非如此 注意 下面显然是一个基于我的调试尝试的简化实现 实际上 我在实际项目中还得到了其他包含平面 HTML 和 JavaScr
  • .NET 的 C 代码解析器

    有谁知道 NET 的 C 解析器库吗 我打算将 C 代码解析为某种形式的对象图 这样我就可以将其转换为不同的语言 ANTLR 可以做你想做的事 它有一个 C 预处理器和 ANSI C 语法 https github com antlr gr
  • “HH:MM:SS”中的秒数

    获取 hh mm ss 等字符串表示形式的秒数的最佳方法是什么 显然 Integer parseInt s substring 3600 Integer parseInt s substring 60 Integer parseInt s
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • XAMPP 不解析 PHP

    我刚刚安装了 XAMPP 1 8 1 并重新启动了计算机 开始运行 Apache 和 MySQL 并在 XAMPP 下的 htdocs 目录中的测试文件夹中创建了一个测试文件 当我访问 xampp index php 时 他们的页面显示正常
  • Rebol / Red Parse html规则返回true但没有插入任何内容

    我有一个返回 true 的解析规则 但它没有按预期插入我的文本 html 未更改 而它应该插入到主结束 div 的末尾 我尝试使用类似的计数器如何使用 REBOL 解析 HTML 标签内部 https stackoverflow com q
  • Python itertools groupby 中令人不安的奇怪行为/错误?

    我在用itertools groupby解析一个短的制表符分隔的文本文件 文本文件有几列 我想做的就是对具有特定值的所有条目进行分组x在特定的列中 下面的代码对名为的列执行此操作name2 寻找变量中的值x 我尝试使用以下方法来做到这一点c

随机推荐