为什么需要抽象语法树?为什么递归下降解析器不能解析它呢?

詹姆斯·弗克斯·史密斯

在解释器设计方面,我是一个初学者,在学习了一些语言设计(语法,语言,词法分析器,解析器)后,我不明白为什么解析器必须随其构建一个抽象语法树。为什么不只使用递归调用的函数在那里执行操作。

这是我所发现的最简单的示例。https://www.youtube.com/watch?v=N55XNj8KjC4

艾拉·巴克斯特

詹姆斯:您可能熟悉Java。想象一下,您的Java递归解析器仅包含源代码文本,而没有其他内容……它将看到文本“ x + y”。它到底应该执行什么动作?

您不仅需要AST,还需要更多。您还需要符号表,从代码片段到范围的映射以及用于存储变量值的位置。如果您遵循@EJP的思路,如果您想要聪明的答案/更快的解释器(例如每次遇到符号表时都不在标识符表中查找标识符),则需要缓存一堆有关代码结构和标识符含义的事实。

一旦您同意必须缓存某些信息以提高“解释器”的效率,唯一的争论就是要缓存的事物的种类。AST缓存解析文本的结果,因此您不必每次都解析它。想象一下在每次迭代中为一个内部循环解析源代码;您将拥有一个非常慢的解释器。

其他所有这些基本上也都是有关所提供文本的推理结果的缓存。但是,当试图使您的语言处理器足够有效以在实践中使用时,它们确实很有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的递归下降解析器是右关联的

回溯以下语法的递归下降解析器

为递归下降解析器制作 shell 语法

是否可以为此语法编写递归下降解析器?

递归下降解析器容易得到解释

使用递归下降解析器验证“break”语句

K&R递归下降解析器错误

PEG和递归下降解析器之间的区别?

递归下降解析器中的多行注释

在递归下降解析器中避免递归算法中的stackoverflow

需要了解为什么内联函数的Promise结果不能解析为预期的返回结果

递归下降解析器应该在重复字母终端上出错

了解Haskell中已实现的递归下降解析器

如何为递归下降解析器的一部分编写代码?

为什么我的递归FParsec解析器解析嵌套数组时会抛出异常?

厨师为什么不能解析我的菜谱?

为什么我不能解析此数据值?

为什么不能解析提供的格式表示的时间?

为什么我不能解析代码中的值“字段”?

为什么不能用LR(1)解析器解析C ++?

为什么编译器不能解析“ a as u32 <b”或类似的东西?

为什么JFlap无法从我的计算器语法构建可用的LL(1)解析器?

为什么组合器“之间”不能与“选择”一起用作解析器?

简单的解析器 - 当 len(tokens) 大于 0 时,为什么会引发“语法错误”?

为什么生成的解析器会发出语法错误?

为什么我的解析器生成此LALR(1)语法不是LALR(1)的报告?

为什么我们需要框架来做依赖关系解析器?

为什么我们需要快速的身体解析器?

为什么SAX xml解析器需要很长时间