parsing - 为什么需要抽象语法树?为什么递归下降解析器无法解析?
问题描述
在解释器设计方面,我是一个初学者,在学习了一点语言设计(语法、语言、词法分析器、解析器)之后,我不明白为什么解析器需要构建一个抽象的语法树。为什么不直接使用递归调用的函数来执行操作呢。
这是我发现的最简单的例子。https://www.youtube.com/watch?v=N55XNj8KjC4。
解决方案
James:您可能对 Java 很熟悉。想象一下,您的 Java 递归解析器只有源代码文本,没有其他内容……它看到文本“x+y”。它究竟应该执行哪些操作?
您需要的不仅仅是 AST;您还需要符号表、从代码片段到范围的映射以及存储变量值的位置。如果您遵循@EJP 的思路,如果您想要聪明的答案/更快的解释器(例如每次遇到符号表时不要在符号表中查找标识符),则需要缓存一堆关于代码结构和标识符含义的事实.
一旦你同意你必须缓存一些信息以使你的“解释器”更有效率,唯一的争论是关于要缓存的东西的种类。AST 会缓存解析文本的结果,因此您不必每次都解析它。想象一下在每次迭代中解析内部循环的源代码;你会有一个异常缓慢的解释器。
所有这些其他的东西基本上也是对所提供文本的推理结果的缓存。但是在尝试使您的语言处理器足够高效以在实践中使用时,它们确实很有用。
推荐阅读
- python - Python:如何在保存了原始索引的列表的所有元素之间获得差异
- php - 当我尝试在购物车中添加产品时,将显示错误。产品将添加到购物车中,但购物车未显示。试图获取非对象的属性“图像”
- python - AWS - Codebuild 失败的问题
- linux - CMake 项目未通过 Visual Studio 2022 在 WSL2 上加载
- python - 以编程方式设置气流中的连接/变量
- vb.net - 如何在 vb.net 中为背景色属性设置透明度效果
- mysql - 添加具有数字名称的列时出错
- django - 在 django orm 中使用 annotate() 在 MariaDB 服务器上运行 hasrsine 公式
- python - 为什么'return'不会破坏嵌套在函数中的循环?
- python - 如何保留 Azure Cosmos DB 连续令牌