文档介绍:编译原理实验报告
年级学号姓名成绩
专业实验地点指导教师
实验项目C_minus语言词法分析器的设计实验日期
概述
词法分析程序完成打的是编译第一阶段的工作,它的主要任务是从左至右逐个字符的对源程序进行扫描,产生一个个单词序列,用以语法分析。本程序是独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件作为语法分析程序的输入而继续编译过程。
正文
词法分析需解决的首要问题是如何正确的获得一个单词,并判断它的类型,本程序设定了三种单词类型,分别为:关键字、标识符、常数、运算符和界符,其中,对标识符和常数的判断,用DFA图,其余的直接定义成常量。下面逐一介绍:
1、关键字(keyword):else if int return void while共6个,所有的关键字都是保留字,并且必须是小写。
在程序中的定义为:
#define KEYWORD_ELSE 1
#define KEYWORD_IF 2
#define KEYWORD_INT 3
#define KEYWORD_RETURN 4
#define KEYWORD_VOID 5
#define KEYWORD_WHILE 6
string strKey[6] = {"else","if","int","return","void","while"};
2、标识符(Identifier):识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID =letter (letter | digit)*;所对应的DFA图如下:
相应的表示其类型的定义为:
#define IDENTIFIER 10
对应的判断代码为:
bool Identifier(char ch[], int state)
{
switch(state)
{
case 0:
if (isalpha(ch[0]))
return Identifier(ch+1,1);
else
return false;
case 1:
if (isalpha(ch[0]) || isdigit(ch[0]))
return Identifier(ch+1,1);
if (ch[0] == '\0')
return true;
else
return false;
}
}
3、常数(constant):NUM=(+ | - |ε)digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123, -123, +123等;小数,, +, -;科学计数法表示的常数,如+,--9;对应的DFA图如下:
相应的表示其类型的定义:
#define CONSTANT_INTEGER 20 // 整数
#define CONSTANT_DECIMAL 21 // 小数
#define CONSTANT_SCIENTIFIC 22// 科学计数
对应的判断代码为:
int Constant(char ch[], int