6、4.2词法分析器的设计

1、词法分析器的结构

 

预处理子程序在扫描器的调用下,将源程序输入到输入缓冲区,预处理子程序读取输入缓冲区的字符进行文本的预处理。

经过预处理后规范性更好的文本被送到扫描缓冲区,预处理子程序返回到扫描器,

扫描器继续从缓冲区中读取预处理后的文本,根据词法规则识别出单词的符号。

扫描缓冲区

两个半区互补使用

 2、单词符号的识别:超前搜索

  • 基本字识别:
    • 例如:

        DO99K = 1, 10                                               DO    99  K  =  1 ,   10

        DO99K=1.10

        IF(5.EQ.M)GOTO55                                       IF ( 5 .EQ.M)  GOTO  55

        IF(5)=55

    • 上面情况需要超前搜索才能确定哪些是基本字
  • 标识符识别
    • 字母开头的字母数字串,后跟界符或算符
  • 常数识别
    • 识别出算术常数并将其转变为二进制内码表示

      5.EQ.M

      5.E08

  • 算符界符的识别
    • 把多字符组成的算符和界符拼成一个单词符号
  • 几点限制——不必要使用超前搜索
    • 所有基本字都是保留字;用户不能用它们作自己的标识符
    • 基本字作为特殊的标识符来处理,使用保留字表
    • 如果基本字、标识符和常数(或标号)之间没有确定的的运算符或界符做间隔,则必须使用空白符作间隔

        DO99K = 1 , 10

        要写成DO 99 K = 1, 10

3状态转换图

  • 状态转换图是一张有限方向图
    • 结点代表状态,用圆圈表示
    • 状态之间用箭弧连接,箭弧上的标记(字符)代表射出结状态下可能出现的输入字符字符类
    • 一张转换图只包含有限个状态,其中有一个为初态,至少要有一个终态

                 

 

 

  • 状态转换图可用于识别(或接受)一定的字符串
    • 若存在一条从初态到某一终态的道路,且这条路上所有弧上标记符连接成的字等于α,则称α被该状态转化图所识别(接受)

                    *代表不包括其他

          识别整常数的状态转换图

                        

 

  •  词法分析器的设计示例
    • 一个简单的程序设计语言-单词表

               

4、状态转化图的实现

  •  每个状态节点对应一小段程序
  • 不含回路的分叉结点
    • 可用一个case语句或一组if-then-else语句实现

  • 含回路的状态结点
    • 对应一段由while结构和if语句构成的程序

                 

 

  •  终态结点
    • 表示识别出某种单词符号,对应返回语句

                     

  • 全局变量与过程
    • ch字符变量,存放最新读入的源程序字符
    • strtoken字符数组,存放构成单词符号的字符串
    • get har子程序过程,把下一个字符读入到ch中
    • getbc子程序过程,跳过空白符,直至ch中读入一非空白符
    • concat子程序,把ch中的字符连接到strtoken
    • IsLetterIsDisgital布尔函数,判断ch中字符是否为字母和数字
    • Reserve整数函数,对于strToken中的字符串查找保留字表,若它是保留字则给出它的编码,否则回送0(标识符)
    • Retract子程序,把搜索指针回调一个字符位置(回退)
    • InsertId整型函数,将strToken中的标识符插入符号表,返回符号表指针(地址)
    • InertConst整型函数过程,将strToken中的常数插入常数表,返回常数表指针
  • 将状态图的代码一般化
    • 变量curState用于保存现有的状态
    • 用二维数组表示状态图:stateTrans[state][ch]
posted @ 2022-11-21 23:17  多一些不为什么的坚持  阅读(131)  评论(0编辑  收藏  举报