词法分析
标签(空格分隔): 未分类
词法分析器->语法分析器->语义分析与中间代码生成器->优化段->目标代码生成器
编译程序的第一阶段就是词法分析,完成词法分析的模块就是词法分析器,高级语言源程序首先经过词法分析器识别出单词符号,然后将单词符号输入到词法分析器中,继续完成语法分析、中间代码生成、优化和目标代码生成。最后实现编译。
词法分析的任务
从左到右逐个字符地对源程序进行扫描,产生一个单词符号
词法分析器
扫描器
执行词法分析的程序
词法分析器的功能
输入源程序,输出单词符号。
单词符号的类型
基本字(关键字)如begin,for..
标识符:用来表示各种名字,如变量名、数组名
运算符:+-*/
常数:各种类型的数值
界符::,等
单词的输出形式一般是二元式,表示单词的种别和单词自己本身
单词的种别信息就相当于类别(动词,名词等)
单词的值就相当与词义解释
单词种别通常都是用整数编码的
-->>(单词种别,单词自身的值)
- 若一个种别只有一个单词符号,则种别编码就代表该单词符号。假定基本字、运算符和界符都是一符一中。
- 若一个种别有多个单词符号,则对每一个单词符号,给出编码和自身的值。
- 标识符单列一种:标识符自身的值表示成按机器字节划分的内部码
- 常数按类型分种:常数的值则表示成标准的二进制形式
如if(5=m)goto 100
输出单词符号:
if(34,-)
左括号 (34,-)
整常数 (20,'5'的二进制)
....
词法分析作为一个独立的阶段
结构清晰简洁,有利于集中考虑词法分析一些枝节问题
但是通常是语法分析驱动调用词法分析
语法分析需要下一个单词的时候,继续调用词法分析器
两者都会在符号表中产生记录
减少多边程序输入输出带来的开销,提高效率
词法分析器的结构
扫描器调用预处理自子程序将文本输入到输入缓冲区中,在有预处理子程序进行处理,主要是:剔除无用的空白、跳格、回车、和换行等编辑性字符;区分标号区、捻接续行和给出句末符等。将表达性良好的语句输入到扫描缓冲区,由扫描器进行扫描产生单词符号,扫描器再次调用预处理子程序,直到结束。
扫描缓冲区
(起点指示器、搜索指示器)
起点指示器指向单词的起始,搜哦指示器寻找单词的末尾。
采用两个半区互补使用这样可一使得在处理比较长单词时不会导致单词读到一半。
例如在只有一个缓冲区的系统中,有一个字符为what a log word...
而缓冲区的长度只允许存储德到..what a long wo
这是后读取到wo
时就会调用读取器再次读取文件则缓冲区变成rd ...
同样时wo
不见了不能实现word的读取。如果时两个版区的结构,只要单词的长度不超过半区的长度,每次处理都只有一个半区,则在单词缺失的时候就可以吧缺失部分读取到另一个半区中。
单词符号的识别:超前搜索
基本字识别
标识符识别
常数识别
算符和界符的识别
如
DO99k=1,10 => DO 99 k = 1, 10
DO99k=1.10
要扫描到,
才能做出判断DO99k是什么东西
这就需要超前搜索
几点限制——不必使用超前搜索
1、所有基本字都是保留字;用户不能够用它们作为自己的标识符
2、基本字作为特殊的标识符来处理;使用保留字表
3、如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则必须只用一个空白符做间隔。DO99k=1,10 要写成 DO 99 k = 1, 10
状态转换图
状态转换符是一个有限的方向图。
节点代表状态,用圆圈表示
状态之间用箭弧连结,箭弧上的标记(字符)代表射出状态下可能出现的输入字符或字符类
一张状态转换图只包含有限个状态,其中一个为初用箭头表示出来,至少有一个终态用双圈表示。
状态转换图和用于识别一定的子符串
若存在一条从初态到某一终态的道路,且纸条路上上所有弧上的标记符号链接成的字等于a,则成a被该状态转换图所识别(接受)
状态转换图的实现
1、不含回路的分叉节点,可以用case语句或者if-else-then语句实现
2、有回路的状态节点可以用while结构和if语句构成
3、状态是一个终态节点,用return实现