编译原理词法分析器
- 格式:doc
- 大小:134.50 KB
- 文档页数:10
编译原理大作业词法分析器
班级:电计0902
学号:200981174
姓名:修德斌
一、实验目的
通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标:
1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。
2、掌握词法分析的实现方法。
3、上机调试编出的词法分析程序。
二、实验过程
1、需求分析:
词法分析是编译程序的第一个阶段,主要任务是对于字符串流的输入,根据词表,将关键字、变量等转化成自定义逻辑结构,就是输入源程序,输出单词符号,用于下一步的语法分析。
比如:
{
int a; int b;
{
a=10;
if (a>0) then b=a
a and b;
}
}
词法分析的功能就是输入源程序,输出单词符号,去除空白符等无意义字符,然后对于像main、a、b这样的函数名、变量名字符串参考前后关键字,按照各自的分类,转换成一个变量表,对于像char = +这种关键字,按照关键词词表转化成对应的序号。
2、概要设计:
(1)、输入输出方式:
以文件的形式进行输入,然后对识别出的单词以
Linenum: 行数 string= 具体的单词或者符号类型(如分解符等)
最后在识别完成后列出了标示符的个数以及标示符的表示名称
关键字表:
sting key[6]
key[0]=”if”
key[1]=”else”
key[2]=”while”
key[3]=”do”
key[4]=”int”
key[5]=”then”
分界符表:
border[7]={ "," , ";" , "{" , "}" , "(" , ")" ,"="}
算数运算符
arithmetic[6]={"+" , "-" , "*" , "/" , "++" , "--"}
关系运算符
relation[6]={"<" , "<=" , ">" , ">=" , "==" ,"!="}
逻辑运算符
logicaloperator[2]={"and","or"}
标识符表
char *lableconst[80];
(2)、状态转换图:
根据对实验分析,对词法分析过程的剖析,画出其基本状态转换图如下;
3、详细设计:
1、字符串的输入采用文件方式,然后将文件中的数据读入数组lableconst中。
2、对标识符、逻辑运算符和关键字的判断
3、对数字,分界符等的识别
4、输出按照linenum 行数具体输入词类型
的形式输出
三、实验结果
输入源:
{
int a; int b;
{
a=10;
if (a>0) then b=a
a and b;
}
}
程序运行以及输出结果:
四、讨论与分析
该词法分析器能够进行简单的词法分析,包括对关键字、分界符、算术运算符、关系运算符、标示符、逻辑运算符以及常数的识别,对不同类型的词归类,为下一步的语法分析做好铺垫,在处理常数时,先把常数转换为二进制,再存储在数组中。
但是仍有不足之处,各类型表囊括的项目部完全,还需进一步完善。
五、附录:
(给出适当注释,可读性高)
#include
#include
#include
#include
#include
using namespace std;
ifstream fp("1.txt",ios::in);
char cbuffer;
char *key[6]={"if","else","while","do","int","then"}; //关键字char *border[7]={ "," , ";" , "{" , "}" , "(" , ")" ,"="}; //分界符
char *arithmetic[6]={"+" , "-" , "*" , "/" , "++" , "--"}; //算数运算符
char *relation[6]={"<" , "<=" , ">" , ">=" , "==" ,"!="};
//关系运算符
char *logicaloperator[2]={"and","or"}; //逻辑运算符
char *lableconst[80]; //标识符
int constnum=40;
int lableconstnum=0;
int linenum=1; //统计常数和标识符数量
int search(char searchchar[],int wordtype)
{
int i=0,t=0;
switch (wordtype)
{
case 1:
{ for (i=0;i<=5;i++) //关键字
{
if (strcmp(key[i],searchchar)==0)
return(i+1);
}
return(0);}
case 2:
{
for (i=0;i<=6;i++) //分界符
{
if (strcmp(border[i],searchchar)==0)
return(i+1);
}
return(0);