什么是编译器设计中的输入缓冲?

词法分析每次都必须访问辅助存储器来识别标记。这是耗时且昂贵的。因此,输入字符串被存储到缓冲区中,然后由词法分析进行扫描。

词法分析一次从左到右扫描输入字符串一个字符以识别标记。它使用两个指针来扫描令牌 -

  • Begin Pointer (bptr) - 它指向要读取的字符串的开头。

  • Look Ahead Pointer (lptr) - 它向前移动以搜索令牌的结尾。

示例- 对于语句 int a, b;

  • 两个指针都从存储在缓冲区中的字符串的开头开始。

  • Look Ahead Pointer 扫描缓冲区,直到找到令牌。

  • 在确定标记(“int”)之前,必须检查标记(“int”)之外的字符(“空格”)。

  • 在处理令牌(“int”)后,两个指针都将设置为下一个令牌('a'),并且整个程序将重复此过程。

一个缓冲区可以分为两半。如果前瞻指针在前半部分移向一半,则后半部分将充满要读取的新字符。如果前瞻指针移向后半部分缓冲区的右端,则前半部分将被新字符填充,然后继续。

哨兵- 哨兵用于进行检查,每次转换前向指针时,都会完成检查以提供一半的缓冲区尚未转换。如果已完成,则应重新加载另一半。

Buffer Pairs - 一种专门的缓冲技术可以减少在传输字符时处理输入字符所需的开销。它包括两个缓冲区,每个缓冲区都包含 N 字符大小,可以交替重新加载。

支持词位Begin 和forward 等两个指针。Lexeme Begin 指向发现的当前词位的开始。在发现模式匹配之前向前扫描。在启动一个词位之前,将词位开始设置为仅构造的词位之后的字符,并将前向设置为其右端的字符。

初步扫描- 某些过程最好在字符从源文件移动到缓冲区时执行。例如,它可以删除评论。像 FORTRAN 这样忽略空白的语言可以将它们从字符流中删除。它还可以将几个空格的字符串折叠成一个空格。对要进行词法分析的字符流进行预处理可以省去在空白字符串上来回移动前瞻指针的麻烦。