一. 介绍
词法分析器,又称扫描器,输入源程序,进行词法分析,输出单词符号。词法分析仅仅是编译程序工作中的一部分,编译程序一般可以划分为5个阶段:词法分析,语法分析,语义分析与中间代码产生,优化,目标代码生成。我们这里编写一个简单的C语言源程序词法分析器。
二. 目的
设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。
四. 要求
1、实现预处理功能
源程序中可能包含有对程序执行无意义的符号,要求将其剔除。
首先编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);然后编制一个预处理子程序,去掉输入串中的回车符、换行符和跳格符等编辑性文字;把多个空白符合并为一个;去掉注释。
2、实现词法分析功能
输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。其中,
syn为单词种别码。
Token为存放的单词自身字符串。
Sum为整型常量。
具体实现时,可以将单词的二元组用结构进行处理。
3、待分析的C语言子集的词法
1)关键字
main if then while do static int double struct break else long switch case typedef char return const float short continue for void default sizeof do
所有的关键字都是小写。
2)运算符和界符
+ - * / : := < <> <= > >= = ; ( ) #
3)其他标记ID和NUM
通过以下正规式定义其他标记:
ID→letter(letter|digit)*
NUM→digit digit*
letter→a|…|z|A|…|Z
digit→0|…|9…
4)空格由空白、制表符和换行符组成
空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。
4、各种单词符号对应的种别码
单词符号 种别码 单词符号 种别码
main 1 void 23
if 2 sizeof 24
then 3 ID 25
while 4 NUM 26
do 5 + 27
static 6 - 28
int 7 * 29
double 8 / 30
struct 9 ** 31
break 10 == 32
else 11 < 33
long 12 <> 34
switch 13 <= 35
case 14 > 36
typedef 15 >= 37
char 16 = 38