编译原理初学

本文介绍了词法分析器的工作原理,包括输入源程序文本、预处理、超前搜索以及如何使用转换图进行识别。重点讲解了在实现转换图时涉及的字符变量、字符数组、获取字符和空白字符处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

词法分析器(1)

词法分析器的功能是输入源程序,输出单词符号。程序语言的单词符号一般分为下列五种:
(1)关键字,由程序语言定义的具有固定意义的标识符,比如java中的while、if、const、int等等。
(2)标识符,用来表示各种名字,如变量名、数组名、过程名等等。
(3)常数 分为整型、实型、布尔型、文字型等等
(4)运算符 +、-、*等
(5)界符,如“,”、“;”、“()”等等
词法分析器所输出的单词符号常常表示为如下的二元式
    (单词种别,单词符号的属性值)
单词种别通常用整数编码。标识符归为一类,常数则按照类型分钟,关键字可将其视为一种,
也可以一字一种,一般都是一字一种,好处理。运算符也采用一字一符,界符也是。
如果一个种别只含一个单词符号,那么,对于这个单词符号,种别编码就完全代表它。
还应给出有关单词符号的属性信息。单词符号的属性信息是指单词符号的特性或特征值,
属性值则是反应特性特征的值,如:对于某个标识符,
常将存放它的有关信息的符号项表的指针作为其属性值。

* 针对以上所述,可以得出:只有标识符(自己定义的变量)和常数的二元式中第二个项——单词符号的属性值不为空,值为相应项表的指针。*


词法分析器工作第一步是输入源程序文本,输入串一般放在输入缓冲区中。

  • 先把输入串预处理一下,删除源程序中存在的空白符、跳格符、回车符和换行符等编辑性字符:
    分析器有两个指示器,一个指向当前正在识别的单词的开始位置,另一个用于向前搜索以寻找单词的终点。
    超前搜索:有些语言中队关键字不加特殊保护,所以需要超前搜索到某些位置后才能判断其到底是什么类型的字符。

  • 使用转换图:是一张有限方向图,结点代表状态,状态之间用箭弧连接,箭弧上的标记代表在射出结点状态下可能出现的输入字符或字符类。一个状态图可用于识别(或接受)一定的字符串。
    用程序实现转换图,让每个状态结点对应一小段程序,引进一组全局变量和过程,将它们作为实现转换图的基本成分:
    (1) ch,字符变量,存放最新读进的源程序字符。
    (2)strToken 字符数组,存放构成单词符号的字符串。
    (3)GetChar 子程序过程,将下一输入字符读到ch中,搜索指示器前移一字符位置。
    (4)GetBC 子程序过程,检查ch中的字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符。
    (5)Concat 子程序过程,将ch中的字符连接到strToken之后。例如,假定strToken原来的值为”AB“ ,而ch中存放着‘C’,经调用Concat后,strToken的值变为‘ABC’.
    (6)IsLetter和IsDigit 布尔函数过程

    下次再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值