为什么需要抽象语法树?为什么递归下降解析器无法进行解析?
Why is an abstract syntax tree necessary? Why cant a recursive descent parser parse as it goes?
我是解释器设计的初学者,在学习了一些语言设计(语法、语言、词法分析器、解析器)之后,我不明白为什么解析器需要构建抽象语法树,因为它去。为什么它不直接使用递归调用的函数就在那里执行操作。
这是我所谈论的我发现的最简单的例子。 https://www.youtube.com/watch?v=N55XNj8KjC4.
James:您可能熟悉 Java。想象一下 Java 的递归解析器只有源代码文本,没有其他任何东西......它看到文本 "x+y"。它究竟应该执行什么操作?
你需要的不仅仅是 AST;您还需要符号表,从代码片段到范围的映射,以及存储变量值的地方。如果你遵循@EJP 的思路,如果你想要聪明的 answers/faster 解释器(比如不在每次遇到它们时都在符号表中查找标识符),你将需要缓存一堆关于代码结构和含义的事实标识符。
一旦您同意必须缓存一些信息以使您的 "interpreter" 更有效率,唯一的争论就是关于要缓存的内容的种类。 AST 缓存了解析文本的结果,所以你不必每次都解析它。想象一下,在每次迭代中解析源代码以获得一个内循环;你将有一个非常慢的解释器。
所有这些其他东西也基本上是对所提供文本进行推理的结果的缓存。但是当你试图让你的语言处理器足够高效以在实践中使用时,它们真的很有用。
我是解释器设计的初学者,在学习了一些语言设计(语法、语言、词法分析器、解析器)之后,我不明白为什么解析器需要构建抽象语法树,因为它去。为什么它不直接使用递归调用的函数就在那里执行操作。
这是我所谈论的我发现的最简单的例子。 https://www.youtube.com/watch?v=N55XNj8KjC4.
James:您可能熟悉 Java。想象一下 Java 的递归解析器只有源代码文本,没有其他任何东西......它看到文本 "x+y"。它究竟应该执行什么操作?
你需要的不仅仅是 AST;您还需要符号表,从代码片段到范围的映射,以及存储变量值的地方。如果你遵循@EJP 的思路,如果你想要聪明的 answers/faster 解释器(比如不在每次遇到它们时都在符号表中查找标识符),你将需要缓存一堆关于代码结构和含义的事实标识符。
一旦您同意必须缓存一些信息以使您的 "interpreter" 更有效率,唯一的争论就是关于要缓存的内容的种类。 AST 缓存了解析文本的结果,所以你不必每次都解析它。想象一下,在每次迭代中解析源代码以获得一个内循环;你将有一个非常慢的解释器。
所有这些其他东西也基本上是对所提供文本进行推理的结果的缓存。但是当你试图让你的语言处理器足够高效以在实践中使用时,它们真的很有用。