解析:将所有标记保存在列表中是个坏主意吗?
Parsing: Is holding all tokens in a list a bad idea?
在具有回溯功能的递归下降解析器中,将所有标记保存在一个列表中是否是个坏主意?我读到这是一个很好的方法,除非我们有无限数量的令牌,但是如果有一个大文件并且令牌数量很大怎么办。这对性能有什么大的影响吗?
我不会太担心。如果文件太大以至于一次存储所有标记会占用大量内存,那么抽象语法树也会占用太多内存。更一般地说,您很可能迟早需要在内存中 some 表示整个文件。对于大多数现代语言来说,单通道编译器甚至是不可能的,而那些特意启用单通道编译器的语言(例如 C)会以更糟糕的开发体验为代价。
此外,假设我们不是在谈论 C/C++ 风格的预处理器模型,合理的 代码文件小于 1 兆字节,这意味着即使使用非常 space- 低效的令牌数据类型,您实际上看到的不超过几十兆字节。任何更大的文件都是病态的,写这么大文件的人的问题,而不是你的问题。
我大体上同意@Delnan。在任何情况下,大多数编译器 运行 在拥有大量内存的机器上与正在编译的程序的大小相比,所以 space 不是问题。
我还要观察一下,如果你要存储完整的 AST,你实际上是在存储令牌列表,作为 AST 的叶子。
这表明了一个方向:不要单独存储完整的令牌列表。简单地计划使用 AST 叶子作为它的表示。
在具有回溯功能的递归下降解析器中,将所有标记保存在一个列表中是否是个坏主意?我读到这是一个很好的方法,除非我们有无限数量的令牌,但是如果有一个大文件并且令牌数量很大怎么办。这对性能有什么大的影响吗?
我不会太担心。如果文件太大以至于一次存储所有标记会占用大量内存,那么抽象语法树也会占用太多内存。更一般地说,您很可能迟早需要在内存中 some 表示整个文件。对于大多数现代语言来说,单通道编译器甚至是不可能的,而那些特意启用单通道编译器的语言(例如 C)会以更糟糕的开发体验为代价。
此外,假设我们不是在谈论 C/C++ 风格的预处理器模型,合理的 代码文件小于 1 兆字节,这意味着即使使用非常 space- 低效的令牌数据类型,您实际上看到的不超过几十兆字节。任何更大的文件都是病态的,写这么大文件的人的问题,而不是你的问题。
我大体上同意@Delnan。在任何情况下,大多数编译器 运行 在拥有大量内存的机器上与正在编译的程序的大小相比,所以 space 不是问题。
我还要观察一下,如果你要存储完整的 AST,你实际上是在存储令牌列表,作为 AST 的叶子。
这表明了一个方向:不要单独存储完整的令牌列表。简单地计划使用 AST 叶子作为它的表示。