在解释器设计方面,我是一个初学者,在学习了一些语言设计(语法,语言,词法分析器,解析器)后,我不明白为什么解析器必须随其构建一个抽象语法树。为什么不只使用递归调用的函数在那里执行操作。
这是我所发现的最简单的示例。https://www.youtube.com/watch?v=N55XNj8KjC4。
詹姆斯:您可能熟悉Java。想象一下,您的Java递归解析器仅包含源代码文本,而没有其他内容……它将看到文本“ x + y”。它到底应该执行什么动作?
您不仅需要AST,还需要更多。您还需要符号表,从代码片段到范围的映射以及用于存储变量值的位置。如果您遵循@EJP的思路,如果您想要聪明的答案/更快的解释器(例如每次遇到符号表时都不在标识符表中查找标识符),则需要缓存一堆有关代码结构和标识符含义的事实。
一旦您同意必须缓存某些信息以提高“解释器”的效率,唯一的争论就是要缓存的事物的种类。AST缓存解析文本的结果,因此您不必每次都解析它。想象一下在每次迭代中为一个内部循环解析源代码;您将拥有一个非常慢的解释器。
其他所有这些基本上也都是有关所提供文本的推理结果的缓存。但是,当试图使您的语言处理器足够有效以在实践中使用时,它们确实很有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句