Compiler construction 缓冲如何增加编译器中lookahead的数量?

Compiler construction 缓冲如何增加编译器中lookahead的数量?,compiler-construction,Compiler Construction,我正在阅读有关编译器设计原则的书籍,特别是缓冲和前瞻术语之间的关系 问题1:缓冲限制 如果缓冲的主要目的是增加编译器中lookahead的数量,那么为什么在构造编译器时缓冲区的使用会受到限制 为了澄清这个问题,编译器在读取输入(源代码)时使用了缓冲技术。如果它能够看到更多即将到来的信件(Lexems专业),那么就可以更准确地做出决定 我的下一个问题是关于lookaheads的数量,我们可以通过在编译器中放置缓冲区来获得 问题2:通过添加每个缓冲区来增加lookahead 如果我们在编译器中添加一

我正在阅读有关编译器设计原则的书籍,特别是缓冲前瞻术语之间的关系

问题1:缓冲限制

如果缓冲的主要目的是增加编译器中lookahead的数量,那么为什么在构造编译器时缓冲区的使用会受到限制

为了澄清这个问题,编译器在读取输入(源代码)时使用了缓冲技术。如果它能够看到更多即将到来的信件(Lexems专业),那么就可以更准确地做出决定

我的下一个问题是关于lookaheads数量,我们可以通过在编译器中放置缓冲区来获得

问题2:通过添加每个缓冲区来增加lookahead

如果我们在编译器中添加一个简单的50字符大小的缓冲区,那么前瞻性增加了多少


感谢您的精彩回答。

除非术语自20世纪80年代以来发生了很大变化,否则“前瞻”要么在正则表达式中使用(请参阅),要么在解析器技术中使用(例如)。如果要将词汇表位转换为标记,则仅限于第一种情况,但我们通常不计算特定数量的字符,而是查看前瞻的复杂性。字符的数量通常很小,不值得关注,但重要的是要有界,以避免lexer中的指数时间。如果您看到第二种情况(例如,LALR(k)中的常数k),那么缓冲区大小通常变得无关紧要:此时解析器正在处理令牌,lexer细节不重要,除了令牌内存的内存生存期问题。您的第一个问题没有真正意义。前瞻是有限的,因为缓冲区是有限的。在任何情况下,任何LR(N)语法都可以重写为LR(1)语法,对于较小的语法类也是如此,因此它在形式上是多余的。@EJP我知道缓冲区的数量是有限的。我在问为什么我们不使用1000个缓冲区而不是(例如)10个缓冲区。它会影响性能吗?有什么副作用?@aligholamee:你认为10个10字符的缓冲区与1个100字符的缓冲区有什么区别?在任何情况下,缓冲通常(完全忽略编译器构造)只是一种摊销成本的方法:读或写有一些固定成本,加上每单位(通常是每字节)的一些可变成本。假设它们分别是200和2。每次读取1个字节=每个字节202个成本单位;读取100字节=400个成本单位=每个字节4个成本单位。除非术语自20世纪80年代以来发生了很大变化,否则,“前瞻”要么在正则表达式中使用(请参阅),要么在解析器技术中使用(例如)。如果要将词汇表位转换为标记,则仅限于第一种情况,但我们通常不计算特定数量的字符,而是查看前瞻的复杂性。字符的数量通常很小,不值得关注,但重要的是要有界,以避免lexer中的指数时间。如果您看到第二种情况(例如,LALR(k)中的常数k),那么缓冲区大小通常变得无关紧要:此时解析器正在处理令牌,lexer细节不重要,除了令牌内存的内存生存期问题。您的第一个问题没有真正意义。前瞻是有限的,因为缓冲区是有限的。在任何情况下,任何LR(N)语法都可以重写为LR(1)语法,对于较小的语法类也是如此,因此它在形式上是多余的。@EJP我知道缓冲区的数量是有限的。我在问为什么我们不使用1000个缓冲区而不是(例如)10个缓冲区。它会影响性能吗?有什么副作用?@aligholamee:你认为10个10字符的缓冲区与1个100字符的缓冲区有什么区别?在任何情况下,缓冲通常(完全忽略编译器构造)只是一种摊销成本的方法:读或写有一些固定成本,加上每单位(通常是每字节)的一些可变成本。假设它们分别是200和2。每次读取1个字节=每个字节202个成本单位;读取100字节=400个成本单位=每个字节4个成本单位。