词法分析器(含完整源码)

词法分析器(含完整源码)
词法分析器(含完整源码)

词法分析实验报告

一、实验目的与要求:

1、了解字符串编码组成的词的内涵,感觉一下字符串编码的方法和解读

2、了解和掌握自动机理论和正规式理论在词法分析程序和控制理论中的应用

二、实验内容:

构造一个自己设计的小语言的词法分析器:

1、这个小语言能说明一些简单的变量

识别诸如begin,end,if,while等保留字;识别非保留字的一般标识符(有下划线、字符、数字,且第一个字符不能是数字)。识别数字序列(整数和小数);识别:=,<=,>=之类的特殊符号以及;,(,)等界符。

2、相关过程(函数):

Scanner()词法扫描程序,提取标识符并填入display表中

3、这个小语言有顺序结构的语句

4、这个小语言能表达分支结构的语句

5、这个小语言能够输出结果

总之这个小语言词法分析器能提供以上所说明到的语法描述的功能……

三、实验步骤:

1、测试评价

(1)、测试1:能说明一些简单的变量,如关键字、一般标识符、界符等;

(2)、测试2:能输出结果:单词符号(内码形式)、各种信息表(如符号表、常量表等);(3)、测试程序:

var x,y,z;

begin

x:=2;

y:=3;

if (x+5>=y*y) then

begin

z:=y*y-x;

z:=z+x*x;

end

else

z:=x+y;

prn z;

end.

(4)、结果:

①、从键盘读入;

部分结果如下:

(类型:该标识符所属的类型,如关键字,变量等;下标:该标识符所对应表(如变量标识符表,常量标识符表等)中其相应的位置,下同)

②、从文件读入,输出到文件;

部分结果如下:

其他测试及结果如下:

③、出错处理;

注:若有错误,则只指出错误,不输出各个表;

(5)、评价:

这个小语言程序基本上能完成词法分析阶段的工作,识别诸如begin,if等保留字;识别非保留字的一般标识符(有下划线、字符、数字,且第一个字符不能是数字)。识别数字序列(整数和小数);识别:=,<=,>=之类的特殊符号以及;,(,)等界符。在扫描源程序串的同时,能进行一些简单的处理,如删除空格、tab、换行等无效字符,也进行了一些基本的错误处理,如变量长度的判别等。

遇到的问题:(a)、判别标识符超过规定长度(20)时,未输出处理结果;(b)、整数长度过长输出结果仍为整数类型3;(c)、对于小数如﹒045,被解释为界符和整数;(d)、对以数字开头的一般标识符的处理,如100nuts被解释为整数类型和标识符,未给出错误提示。

如上测试,出现前两个问题时已报错并输出所在行,而后两个问题待解决。

2、对小语言的词法规则(正规式)画出一个确定的有限自动机(见附录2、3)

四、实验的源代码:(见附录1)

五、实验中发现的问题和遇到的困难及解决方法:

由于以前未曾接触过编译原理,在该实验的设计中,的确遇到一定的困难。主要是display表结构的设计,由于语法分析和语义分析还未学习,无法站在全局的角度统筹兼顾,在表结构设计时,不知该往表结构体中添加哪些内容,可以为后续的工作做铺垫,这是刚开始就遇到的最大的困难,也是最难的。

经过分析,我们在现有局限性的基础上,设计出一种折中的表结构,即在表结构中只添加标识符在其相应表中的对应下表,标记符类型码等关键的几处,这样既能唯一确定一标识符,达到该实验的要求,同时又为表保留了很好的扩充性,以达到后续实验的要求。表结构设计好后,其余的工作就是提取字符串和写入display表,在提取单字符还是双字符组成的运算符时有些麻烦,不过利用数据结构的相关知识也是容易做到。

六、总结:

词法分析是构造编译器的起始阶段,也是相应比较简单的一个环节。词法分析的主要任务是:根据构造的状态转换图,从左到右逐个字符地対源程序进行扫描,识别开源程序中具有独立含义的最小语法单位——符号或单词,如变量标识符,关键字,常量,运算符,界符等。

然后将提取出的标识符以内码的形式表示,即用int类型的数字来表示其类型和在display表中的位置,而无须保留原来标识符本身的字符串,这不仅节省了内存空间,也有利于下一阶段的分析工作。

当然,在扫描源程序串的同时,进行一些简单的处理,如删除空格、tab、换行等无效字符,也进行了一些基本的错误处理,如变量长度的判别,有些不合词法规则的标识符判别等。总之,严格说来,词法分析程序只进行和词法分析相关的工作。

七、实验感想:

通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。

附录1(代码)

#include

#include

#include

#include <>

#include <>

#include

using namespace std;

#define Max 655 , '[' , ']' , ':' , '{' , '}' , '"'}; ymbol,str);

table[TableNum].type = 1; ine = nLine;

table[TableNum].Index = i;

TableNum ++;

break;

}

if(i >= MaxKeyWord) ndex = WordNum;

strcpy(Word[WordNum++],str);

table[TableNum].type = 2; ymbol,str);

table[TableNum].line = nLine;

TableNum ++;

}

}

}

/**********************************常数***********************/

ype = 3; ype = 4; ndex = DigNum;

strcpy(Digit[DigNum ++],str);

strcpy(table[TableNum].symbol,str);

table[TableNum].line = nLine;

TableNum ++;

}

/*******************************运算符************************************/

else

{

int errorFlag; ype = 6;

strcpy(table[TableNum].symbol,str);

table[TableNum].line = nLine;

table[TableNum].Index = i;

TableNum ++;

chIndex = chIndex + 2;

break;

}

if(i >= MaxOptBNum)

{

for( int k = 0;k < MaxOptANum; k++)

if(OptA[k] == ch[chIndex])

{

errorFlag = 0;

table[TableNum].type = 5;

table[TableNum].symbol[0] = ch[chIndex];

table[TableNum].symbol[1] = 0;

table[TableNum].line = nLine;

table[TableNum].Index = k;

TableNum ++;

chIndex ++;

break;

}

/*************************界符*****************************************/ for(int j = 0;j < MaxEndNum;j ++)

if(End[j] ==ch[chIndex])

{

errorFlag = 1;

table[TableNum].line = nLine;

table[TableNum].symbol[0] = ch[chIndex];

table[TableNum].symbol[1] = 0;

table[TableNum].Index = j;

table[TableNum].type = 7;

TableNum ++;

chIndex ++;

}

/********************其他无法识别字符*************************************/ if(errorFlag != 0 && errorFlag != 1) ype = 8;

strcpy(table[TableNum].symbol,str);

table[TableNum].line = nLine;

table[TableNum].Index = -2;

TableNum ++;

}

}

}

}

}

void Trans(double x,int p) n";

exit(1);

}

cout<<"Enter the output file name:\n";

cin>>out_file_name;

(out_file_name);

("变量表.txt");

("常量表.txt");

if()) n";

exit(1);

}

if()) n";

exit(1);

}

if()) n";

exit(1);

}

(ch,Max,'#');

Scanner(ch, strlen(ch),table,nLine); ype<< " , "<< "0x" << hex << table[i].Index<< ")" <

{

long num1;

num1 = atoi(table[i].symbol);

outCon<< "(0x" <

}

if(table[i].type == 4)

{

double num2;

num2 = atof(table[i].symbol);

outCon<< "(0x" <

}

}

outVar <<"类型"<<" "<< "变量名称" <

for( i = 0; i < WordNum;i ++)ype<< " , "<< "0x" << hex << table[i].Index<< ")" <

cout << "\n常量表:\n" << "下标" << " " << "常量值" << endl;

for(i = 0;i < TableNum;i++) ype == 3)

{

long num1;

num1 = atoi(table[i].symbol);

cout<< "(0x" <

num1 << ")" <

if(table[i].type == 4) {

char *num2; float num,num3;

num = atof(table[i].symbol);

num2 = gcvt(16,strlen(table[i].symbol),table[i].symbol); num3 = num - floor(num);

cout << "(0x" << hex << table[i].Index << " , " << num2; Trans(num3,5) ; cout << ")" <

cout <<"\n 变量表:\n 类型"<<" "<< "变量名称" <

< =、>

非= 且 非>

0 1 2 3 4 5 6 7 8

9 10小数点小数点

>

=

非= +、—、*、/、=、# : =

(、)、,、;、—、[、]、:、{、}、‘’

非‘ ’、{、}

11

12

13

141516

18

17

实验一 词法分析器的设计

实验一词法分析器的设计 (2) 1.1 词法分析器的结构和主要任务 (2) 1.1.1 输入输出接口 (2) 1.1.2 条件限制 (2) 1.2 词法分析程序的总体设计 (3) 1.3 词法分析程序的详细设计 (4) 1.4实验步骤 (5) 1.5输入数据 (15) 1.6结果输出 (15)

实验一词法分析器的设计 实验目的:掌握词法分析的概念,设计方法,熟悉高级语言中词法的定义,词法分析程序的编写。 实验要求:在8学时内实现SAMPLE语言的词法分析器,要求用VC窗口界面实现。 实验内容:分为4次实验完成。 1.1 词法分析器的结构和主要任务 1.1.1 输入输出接口 图1-1词法分析器的输入输出界面 词法分析程序的主要任务是从左到右扫描每行源程序,拼成单词,换成统一的内部表示(token)输出,送给语法分析器。具体包括: 1.组织源程序的输入; 2.按规则拼单词,并转换成二元形式; 3.滤掉空白符,跳过注释、换行符及一些无用的符号(如字符常数的引号) 4.进行行列计数,用于指出出错的行列号,并复制出错部分; 5.列表打印源程序; 6.发现并定位词法错误; 7.生成符号表。 token文件和符号表用作语法分析的输入部分。 1.1.2 条件限制 本实验可以作如下假定: (1) 假定SAMPLE语言采用自由格式书写; (2) 可以使用注解,用/*……*/或者{……}标识,但注解不能插在单词内部,注解要在一行内结束,若一行结束,没有遇到注释后面的结束标记,自动认为注释也结束; (3) 一行可以有多个语句,一个语句也可以分布在多行中,单词之间和语句之间可以插入任意空格,单词中间不能有空白符号,单词中间也不能有回车换行符,即单词不能跨行书写; (4) 关键字都是保留字。

编译原理实验-词法分析器的设计说明

集美大学计算机工程学院实验报告 课程名称:编译原理班级: 指导教师:: 实验项目编号:实验一学号: 实验项目名称:词法分析器的设计实验成绩: 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 二、实验容 编写一个词法分析器,从输入的源程序(编写的语言为C语言的一个子集)中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 三、实验要求 1、词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符 2 别单词的类型,将标识符和常量分别插入到相应的符号表中,增加错误处理等。 3、编程语言不限。

四、实验设计方案 1、数据字典 本实验用到的数据字典如下表所示:

3、实验程序 #include #include #include #include //判断读入的字符是否为字母 bool isLetter(char c){ if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){ return true; } else return false; } //判断读入的字符是否为数字 bool isDigit(char c){ if(c >='0' && c <= '9'){ return true; } else return false; } //判断是否为关键字 bool isKey(char *string) { if(!strcmp(string,"void") || !strcmp(string,"if")|| !strcmp(string,"for")|| !strcmp(string,"wh ile") || !strcmp(string,"do")|| !strcmp(string,"return")|| !strcmp(stri ng,"break") || !strcmp(string,"main")|| !strcmp(string,"int")|| !strcmp(strin g,"float")|| !strcmp(string,"char") || !strcmp(string,"double")|| !strcmp(string,"String"))

词法分析器的实现与设计

题目:词法分析器的设计与实现 一、引言................................ 错误!未定义书签。 二、词法分析器的设计 (3) 2.1词的内部定义 (3) 2.2词法分析器的任务及功能 (3) 3 2.2.2 功能: (4) 2.3单词符号对应的种别码: (4) 三、词法分析器的实现 (5) 3.1主程序示意图: (5) 3.2函数定义说明 (6) 3.3程序设计实现及功能说明 (6) 错误!未定义书签。 7 7 四、词法分析程序的C语言源代码: (7) 五、结果分析: (12) 摘要:词法分析是中文信息处理中的一项基础性工作。词法分析结果的好坏将直接影响中文信息处理上层应用的效果。通过权威的评测和实际应用表明,IRLAS是一个高精度、高质量的、高可靠性的词法分析系统。众所周知,切分歧义和未登录词识别是中文分词中的两大难点。理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实

现方法和技术,用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。Abstract:lexical analysis is a basic task in Chinese information processing. The results of lexical analysis will directly affect the effectiveness of the application of Chinese information processing. The evaluation and practical application show that IRLAS is a high precision, high quality and high reliability lexical analysis system. It is well known that segmentation ambiguity and unknown word recognition are the two major difficulties in Chinese word segmentation. The understanding of lexical analyse the program at compile, deepen of finite automata model for understanding, master lexical analysis program implementation method and technology, using C language subset of a simple language compilation of a scanned again compiler, to deepen to compile the principle solution, master compiler implementation method and technology. 关键词:词法分析器?扫描器?单词符号?预处理 Keywords: lexical analyzer word symbol pretreatment scanner 一、引言 运用C语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。本程序是在Visual?Studio环境下,使用C语言作为开发工具。基于实验任务

编译原理设计c语言的词法分析器

编译原理课程设计报告 题目: 学院: 教师: 姓名: 学号: 班级: 评分: 签字:

编译原理课程设计一:设计c语言的词法分析器 一、实验目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。 二、实验要求 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 三、实验设计 3.1.单词分类及表示 3.1.1 C语言的子集分类 (1)标识符:以字母开头的字母数字串 (2)整数或浮点型。 (3)保留字:for,while,do,else,if,static,int,sizeof,break,continue (4)运算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,!,&,&&,||; (5)界符:"(",")",",",":",";","{","}" 3.1.2单词二元组(单词分类号、单词自身值)

3.2 词法分析器的设计 3.2.1算法设计 3.2.1.1概要设计 从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进行查找,输出单元二次组至另一文件夹。

3.2.1.2状态图设计 3.2.2输入输出设计 输入:通过文件指针从文件中一个一个读取字符 输出:输出单词二元组至文件。格式为(种别码,值) 3.2.3主要函数 void Getchar(FILE *fp ) //读入一个字符 void GetBC(FILE *fp)//读入一个非空字符 void contacat()//连接字符 int letter()//判断是否为字母 int digit()//判断是否为字母 void retract(FILE *fp,char *c)//回退 int reserve (char **k)//处理保留字 int sysmbol(identifier *id)//处理标识符,查找符号表并存放位置若没有则添加int constant(constnumber *con)//存入常数表,并返回它在常数表中的位置

词法分析器课程设计

软件类课程设计报告 设计题目:词法分析器 学生学号: 专业班级:计算机科学与技术 学生姓名: 学生成绩: 指导教师(职称): 课题工作时间:至

信息工程学院软件类课程设计任务书 指导教师: 日期:年月日

成绩评定表学生姓名:学号:专业/班级:

目录 目录.................................................................................................................................................................. I 第一章概述.. (2) 1.1词法分析器概述 (2) 1.2课程设计内容 (2) 第二章词法分析器课程设计 (3) 2.1课程设计内容 (3) 2.2课程设计思想 (3) 2.3设计目的及说明 (3) 2.3.1程序设计范畴 (3) 2.3.2程序设计说明 (3) 第三章程序详细设计 (4) 3.1主要算法的设计 (4) 3.2算法的实现 (4) 3.2.1数据类型 (4) 3.2.2函数模块功能 (4) 3.3程序设计流程图 (4) 3.3.1设计流程图 (5) 3.3.2状态转换图 (5) 第四章运行结果及分析 (6) 4.1运行结果 (6) 4.2结果分析 (6) 4.3设计总结 (6) 结束语 (8) 参考文献 (8) 附录源程序 (9)

第一章概述 1.1词法分析器概述 词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换称长度统一的标准形式——属性字(TOKEN)。而词法分析器的功能是输入源程序,输出单词符号,并且词法分析器有两种处理结构:一种是把词法分析器作为主程序;另一种是把词法分析器作为语法分析程序调用的子程序。编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、)然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。词法分析器的功能就是把输入的符号串整理成特定的词素。 1.2课程设计内容 运用c++语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。本程序是在Visual Studio环境下,使用c++语言作为开发工具。基于实验任务的内容及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。逐步细化其功能,做到相应模块的具体化。画出未成熟的流程图,确定整体设计的走向,在一定范围内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善流程图。

编译原理词法分析器语法分析课程设计报告书

《编译原理》 课程设计 院系信息科学与技术学院 专业软件工程 年级 2011级 学号 20112723 姓名林苾湲 西南交通大学信息科学与技术学院 2013年 12月

目录 课程设计1 词法分析器 (2) 1.1 设计题目 (2) 1.2 设计容 (2) 1.3 设计目的 (2) 1.4 设计环境 (2) 1.5 需求分析 (2) 1.6 概要设计 (2) 1.7 详细设计 (4) 1.8 编程调试 (5) 1.9 测试 (11) 1.10 结束语 (13) 课程设计2 赋值语句的解释程序设计 (14) 2.1 设计题目 (14) 2.2 设计容 (14) 2.3 设计目的 (14) 2.4 设计环境 (14) 2.5 需求分析 (15) 2.6 概要设计 (16) 2.7 详细设计 (16) 2.8 编程调试 (24) 2.9 测试 (24) 2.10 结束语 (25)

课程设计一词法分析器设计 一、设计题目 手工设计c语言的词法分析器(可以是c语言的子集)。 二、设计容 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 三、设计目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 四、设计环境 该课程设计包括的硬件和软件条件如下: 4.1.硬件 (1)Intel Core Duo CPU P8700 (2)存4G 4.2.软件 (1)Window 7 32位操作系统 (2)Microsoft Visual Studio c#开发平台 4.3.编程语言 C#语言 五、需求分析 5.1.源程序的预处理:源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 5.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。 (2)常数:各种类型的常数。 (3) 保留字(关键字):如if、else、while、int、float等。 (4) 运算符:如+、-、*、<、>、=等。 (5)界符:如逗号、分号、括号等。 5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。 5.4.可选择性地将结果保存到文件中。 六、概要设计 6.1.数据类型 6.1.1.单词的分类:本词法分析器演示的是C语言的一个子集,故字符集如下:

C++语言实现词法分析器设计例题参考

给同学们的一段话 《编译原理》计算机软件专业的一门重要专业课程。该课程系统地向学生介绍编译程序的结构、工作流程及编译程序各组成部分的设计原理和实现技术。由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计算法,因此,一直是一门比较难学的课程。为了使学生更好地理解和掌握编译技术的基本概念、基本原理和实现方法,实践环节非常重要,只有通过上机进行程序设计,才能使学生对比较抽象的教学内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。 编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。从左到右逐个字符对构成源程序的字符串进行扫描,依据词法规则,识别出一个一个的标记(token),把源程序变为等价的标记串序列。执行词法分析的程序称为词法分析器,也称为扫描器。本例题是一个词法分析的设计,采用C++代码实现。 希望大家复习回顾以前学习的《C++程序设计》课程相关知识。 一、设计内容和要求 1、设计内容 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状态转换图设计词法分析器的基本方法。 2、设计要求 利用该词法分析器完成对源程序字符串的词法分析。输出形式是源程序的单词符号二元式的代码,并保存到文件中。 (1) 假设该语言中的单词符号及种别编码如下表所示。 单词符号及种别编码 单词符号种别编码单词符号种别编码 main 1 [ 28 int 2 ] 29 char 3 { 30

Tiny语言的词法分析器C版课程设计报告

实验报告学号:姓名:专业:计算机科学与技术班级:2班第9周

#include #include #include using namespace std; static int rowCounter = 1;//静态变量,用于存储行数 static bool bracketExist = false;//判断注释存在与否,false为不存在class Lex { public: ofstream output; string line = ""; Lex(string inputLine) { line = inputLine; scan(Trim(line)); rowCounter++; } string Trim(string &str)//函数用于去除每行前后空格 { int s = str.find_first_not_of(" \t"); int e = str.find_last_not_of(" \t"); str = str.substr(s, e - s + 1); str += "\0"; return str; } void scan(string inputLine) { ofstream output; output.open("SampleOutput.txt", ios::app); string line = inputLine; int i = 0; string str = ""; int temp; string token = ""; output << rowCounter << ": " << line << endl;//输出每行 while (line[i] != '\0')//根据DFA扫描并判断 { if (line[i] == '{')//注释 { bracketExist = true; } if (bracketExist == true) { output << "\t" << rowCounter << ": "; while (line[i] != '}')

编译原理实验报告(词法分析器语法分析器)

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

简单的词法分析器设计

《编译原理》 课程设计院系 专业 年级 11级 学号 姓名 2014年 05月 实验一简单的词法分析器设计 一、设计内容 熟悉并实现一个简单的词法分析器 二、设计目的 了解高级语言单词的分类,了解如何识别单词规则,掌握状态图到识别程序的编程。 源程序中,存在许多编辑用的符号,她们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 三、实验步骤 1、 将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名与过程名。 (2)常数:各种类型的常数。 (3) 保留字(关键字):如if、begin、then、while、do等。 (4) 运算符:如+、-、*、<、>、=等。

(5)界符:如逗号、分号、括号等。 2、 将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。 3、 可选择性地将结果保存到文件中。 四、概要设计 1.待分析的简单语言的词法 (1)关键字:while do relop letter id number所有关键字都就是小写。 (2)运算符与界符: : = + –* / < <= <> > >= = ; ( ) # (3)其她单词就是标识符(ID)与整型常数(NUM),通过以下正规式定义: 如课本P20例2、6 空格由空白、制表符与换行符组成。空格一般用来分隔ID、NUM,运算符、界符与关键字,词法分析阶段通常被忽略。 2.词法分析器的结构 图6、1 词法分析器的结构 3.部分单词的正规式与状态转换图

编译原理实验-词法分析器的设计与实现.docx

南华大学 计算机科学与技术学院实验报告 (2018~2019学年度第二学期) 课程名称编译原理 实验名称词法分析器的设计与 实现 姓名学号 专业班级 地点教师

1.实验目的及要求 实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 实验要求 1.对单词的构词规则有明确的定义; 2.编写的分析程序能够正确识别源程序中的单词符号; 3.识别出的单词以<种别码,值>的形式保存在符号表中,正确设计和维护 符号表; 4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误 提示,保证顺利完成整个源程序的词法分析; 2.实验步骤 1.词法分析规则 <标识符>::=<字母>|<标识符><字母>|<标识符><数字> <常数>::=<数字>|<数字序列><数字> <数字序列>::=<数字序列><数字>|<数字>|<.> <字母>::=a|b|c|……|x|y|z <数字>::=0|1|2|3|4|5|6|7|8|9 <运算符>::=<关系运算符>|<算术运算符>|<逻辑运算符>|<位运算符>|<赋值运算符> <算数运算符>::=+|-|*|/|...|-- <关系运算符>::=<|>|!=|>=|<=|== <逻辑运算符>::=&&| || |! <位运算符>::=&| | |! <赋值运算符>::==|+=|-=|/=|*= <分界符>::=,|;|(|)|{|}|:| // |/**/ <保留字>::=main|if|else|while|do|for|...|void

设计 词法分析之基于lex实现词法分析

词法分析程序 一、设计目的 通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将其分解成各类单词的词法分析方法。 二、设计要求 要求将用模拟语言书写的源程序进行词法分析,输出源程序清单,Token文件和错误信息文件,若有错误,必须输出错误在源程序中行号和列号,并将符号表和字符串以文件的形式写出来。 三、设计说明 基于Parser Genarator的词法分析器构造方法。Lex输入文件由3个部分组成:定义集(definition),规则集(rule)和辅助程序集(auxiliary routine)或用户程序集(user routine)。这三个部分由位于新一行第一列的双百分号分开,因此,Lex输入文件的格式如下 {definitions} %% {rules} %% {auxiliary routines} 而且第一部分用“%{”和“%}”括起来。 第一和第三个部分为C语言的代码和函数定义,第二个部分为一些规则。 3.1正规式定义 定义正则表达式如下 ID = letter letter* NUM = digit digit* Letter = a|…|z|A|…|Z D igit = 0|…|9 Keyword = else|if|int|return|void|while Special symbol = +|-|*|/|<|<=|>|>=|==|!=|=|;|,|(|)|[|]|{|}|/*|*/

White space = “ ” Enter = \n 在lex中的构造 letter [A-Za-z] digit [0-9] id ({letter}|[_])({letter}|{digit}|[_])* error_id ({digit})+({letter})+ num {digit}+ whitespace [ \t]+ enter [\n]+ 3.2转换规则定义 在Lex中的规则定义构造 定义识别保留字规则 "int"|"else"|"return"|"void"|"if"|"while" {Upper(yytext,yyleng); printf("%d 行 ",lineno); printf("%s reserved word\n",yytext);}//保留字 定义识别数字规则 {num} {printf("%d 行 ",lineno); printf("%s NUM\n",yytext);}//数字 定义识别专用符号规则","|";"|"("|")"|"{"|"}"|"*"|"/"|"+"|"-"|">"|"<"|">="|"<="|"=="|"!="|"="|"/*"|"*/" {printf("%d 行 ",lineno); printf("%s special symbol\n",yytext);}//特殊符号 定义识别标识符规则 {id} {printf("%d 行 ",lineno); printf("%s ID\n",yytext);}//标识符 定义识别错误的字符串规则 当开头为数字的后面为字母的字符串时,是错误的标识符。 {error_id}

词法分析器课程设计报告

2009-2010学年第二学期 《编译原理》课程设计报告 学院(系): 班级: 学生姓名: 学号: 指导教师: 时间:2010 年6 月

目录 1. 课程设计的目的 (1) 2.课程设计的内容及要求 (1) 2.1.课程设计内容 (1) 2.2.课程设计要求 (2) 2.3.运行环境 (3) 2.4.程序的不足 (3) 3.问题分析及相关原理介绍 (3) 3.1. 编译程序介绍 (3) 3.2.各部分的功能介绍及分析 (3) 3.3. 算法实现及模拟 (4) 3.3.1总体流程图 (4) 3.3.2详细的流程图 (5) 4.设计思路及关键问题的解决方法 (7) 4.1.设计思路及关键问题 (7) 4.1.1处理时机 (7) 4.1.2一个棘手问题 (8) 4.2.解决方法 (8) 5.结果及测试分析 (8) 5.1.待分析程序的部分内容 (8) 5.2.运行结果 (9) 6.总结 (10) 6.1.设计过程 (10) 6.2.困难与收获 (11) 参考文献 (11) 附录 (11)

1.课程设计的目的 通过课程设计实践,树立正确的设计思想,巩固所学编程语言基本知识,增进C语言编辑基本功;综合运用所学的理论知识,进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解;掌握课程设计的一般方法与步骤,深入掌握课程设计的基本理论、方法和步骤,提高自己的编程能力,培养好的程序设计风格。 通过课程设计,真正掌握设计和构造编译程序的基本原理和常用的编译技术,具备系统软件调试能力和开发能力,培养分析问题和解决问题的能力。同时通过某种编程语言的应用,具备初步的Windows环境下的编程思想。 完成本课程设计的项目——词法分析器,理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实现方法和技术,用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 2.课程设计的内容及要求 2.1.课程设计内容 设计内容:完成下述文法所描述的单词符号的词法分析程序。 <标识符>--><字母>|<标识符><字母>|<标识符><数字> <无符号整数>--><数字>|<无符号整数><数字> <分界符>-->+|-|*|/|;|(|)|{|}|<|<=|==|!=|>=|>|=|<空格> <字母>-->a|…|z|A|…|Z <数字>-->0|…|9 运用C语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析, 将结果写入指定文件。 本程序是在Visual Studio环境下,使用C语言作为开发工具。基于实验任务的内容 及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。逐步细化其功能,做到相应模块的具体化。画出未成熟的流程图,确定整体设计的走向,在一定范围 内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善 流程图。 程序设计的具体内容: 在实际的设计中,预分析程序保存在文本文件sourcecode.txt中,该文件不能由执 行程序自动创建,需要在程序执行前预先提供,程序拥有只读的权限。程序逐个字符的 分析源程序,能够识别标识符,整数,分界符,并分别把分析得到的字符写入相应文档:keyword,words,digit,single,double;其它字符标示为无法识别,记录在error 文档中。程序结束后,将最总结果写入文件Dualistic_formula,该文件的内容包括统 计结果(排除重复出现的字符)和二元式。这七个文件会在程序执行时自动创建,程序 结束时,关闭文件,但保留文件的内容,以供查看和检验,测试。 不同类别的字符通过相应的函数模块来分析识别。普通标识符由函数int word(char ch)来识别,并进一步由函数int keyword(char key[])来分离普通标识符和关键字;

词法分析器的设计

学生实验报告册2017 ——2018 学年第1学期 学院:信息与电气工程学院 专业:计算机科学与技术 姓名:李金 学号:195140046 班级:计算机2班

实验一词法分析器的设计 一、实验目的 1、通过设计编制一个调试一个具体的此法分析程序,理解词 法分析在编译程序中的作用。 2、加深对有穷自动机模型的理解。 3、掌握词法分析程序的实现方法和要求。 4、用C语言,对一个简单语言的子集编制一个一遍扫描的 程序,以加深对编译原理的理解,掌握编译程序的实现方 法和技术。 编制一个读单词过程,从输入的源程序中,识别出 各个具有独立意义的单词,即基本保留字、标识符、 常数、运算符、分隔符五大类,并依次输出各个单 词的内部编码及单词符号自身值(遇到错误时课显 示“Error”,然后跳过错误部分继续显示) 一、程序要求 程序输入/输出示例 如源程序为C语言,输入如下一段: Main() { int a,b; a = 10; b = a + 20;

} 要求输出如下图 (2,main) (4,=) (5,() (3,10) (5,)) (5,;) (5,{) (2,b) (1,int) (4,=) (2,a) (2,a) (5,,) (4,+) (2,b) (3,20) (5,;) (5,;) (2,a) (5,}) 要求: 1、识别保留字:if,int,for,while,do,return,break,continue; 单 词识别码为1; 2、其他的都识别为标识符;单词识别码为2; 3、常数为无符号整数;单词识别码为3; 4、运算符包括:+,-,*,/,=,<,<=,!=;单词识别码为4; 5、分隔符包括:,、;、{、}、(、);单词识别码为5; 二、实验步骤 1、定义部分:定义常亮、变量、数据结构。 2、初始化:从文件源程序全部输入到字符缓冲区中。

词法分析器的设计

广州中医药大学医学信息工程学院 实验报告 课程名称:编译原理 专业班级:计算机科学与技术(12)级第一组 实验参与者(姓名、学号)刘加彦2012081026、李汝强2010131083张丰锦2012081017、张鹏燕2012081076 实验名称:设计SAMPLE语言的词法分析器 实验成绩: 课程类别:必修□限选 公选□其它□

实验三设计SAMPLE语言的词法分析器 实验时间:2015-5-14 一、实验目的 1、通过使用一定的编程工具设计sample语言的词法分析器,要求满足以下条件: a)先输出作者姓名、班级、学号(可用汉语、英语或拼音); b)请求输入测试程序名,键入程序名后自动开始词法分析并输出结果; c)输出结果为单词的二元式序列(样式见样板输出1和2); d)要求能发现下列词法错误并指出错误性质和位置: a.非法字符,即不是SAMPLE字符集的符号; b.字符常数缺右边的单引号; c.注释部分缺右边的界符*/; 2、设计成功后,要求可以通过至少10类测试程序的测试。 二、实验方法 1、实验工具 a)Java语言; b)Windows平台; c)选用Eclipse开发工具编写程序,项目文件wordAnalysize,并做测试。 2、算法逻辑分析(重点) a)有一个当前状态的变量,状态变量的初始值是开始符S。一个队列,存的是待处理程序的源代码。 b)按自动机,写IF语句。用一个大循环把它们包起来。 c)如果当前状态不是终态,并且队列的队首是一个不可解释的终结符(自动机中没有对应的边),则报错,当前状态复位到初始状态S。继续处理。 d)如果当前状态是终态,并且队列的队首是一个不可解释的终结符(自动机中没有对应的边),则识别,当前状态复位到初始状态S。并重新处理这个终结符。 e)如果当前状态是初态S,遇到空格、回车、文件结束符等无意义的字符,

编译原理课程设计-词法分析器的设计

词法分析器的设计 1.设计说明及设计要求 一般来说,整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。本课程设计即为词法分析阶段。词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。如保留字(关键字或基本字)、标志符、常数、算符和界符等等。 二.设计中相关关键字说明 1.基本字:也称关键字,如C语言中的 if , else , while , do ,for,case,break, return 等。 2.标志符:用来表示各种名字,如常量名、变量名和过程名等。3.常数:各种类型的常数,如12,6.88,和“ABC”等。 4.运算符:如 + ,- , * , / ,%, < , > ,<= , >= 等。 5.界符,如逗点,冒号,分号,括号,# ,〈〈,〉〉等。三、程序分析 词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字 符地对源程序进行 扫描,产生一个个单词序列,用以语法分析。词法分析工作可以是独立的一遍,把字符流的源程序变为单词序列,输出在一个中

间文件上,这个文件做为语法分析程序的输入而继续编译过程。 然而,更一般的情况,常将词法分析程序设计成一个子程序,每 当语法分析程序需要一个单词时,则调用该子程序。词法分析程 序每得到一次调用,便从源程序文件中读入一些字符,直到识别 出一个单词,或说直到下一个单词的第一个字符为止。 四、模块设计 下面是程序的流程图 五、程序介绍 在程序当前目录里建立一个文本文档,取名为infile.txt,所有需要分析的程序都写在此文本文档里,程序的结尾必须以“@”标志符结束。程序结果输出在同一个目录下,文件名为outfile.txt,此文件为自动生成。本程序所输出的单词符号采用以下二元式表示:(单词种别,单词自身的值)如程序输出结果 (57,"#")(33,"include")(52,"<")(33,"iostream") 等。程序的功能:(1)能识别C语言中所有关键字(共32个)(单词种别

编译原理词法语法语义分析器设计

编译技术课程设计 班级计算机0802 学号3080602049 姓名周勇 指导老师朱玉全 二零一一年七月

编译技术课程设计 一、目的 <<编译技术>>是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

IF i>0 i= 1; 而绝对不要写成 IFi>0 i=1; 因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。 这个小语言的单词符号的状态转换图,如下图: 2.语法分析器能识别由加+ 减- 乘* 除/ 乘方^ 括号()操作数所组成的算术表达式,其文法如下: E→E+T|E-T|T T→T*F|T/F|F F→P^F|P p→(E)|i 使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。 3.中间代码生成器产生上述算术表达式的中间代码(四元式序列) 较高要求:

词法分析器

实验二词法分析器 一、实验要求 为给定编程语言设计词法分析器 二、实验材料 1、单词结构 ?注释:以“//”开头到该行尾部为注释 ?关键字(共6个):int real if then else while ?标识符:以字母开头,后跟字母或数字的符号串,最长为64个字符。(注意:关键字不是标识符)?操作符(共11个):+ - / * = == < <= > >= != ?分隔符(共5个):( ) { } ; ?数字(用正规式描述): digit ← 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 整数← digit+ (最大整数为231) exponent ← E ( + | - | ε ) digit+ (最大指数为128) fraction ← . digit+ 实数← digit+ exponent | digit+ fraction ( exponent | ε ) 2、词法分析器要求 将词法分析部分设计为一个子程序(以备随后的语法分析器调用)。 输入:input.txt,其内容为指定编程语言的一段程序代码。 输出:output.txt,其内容为四元组形式(单词类型,单词本身,行号,列号),output文件中的每一行对应一个单词的信息。四元组形式中,第一项为单词类型,第二项为单词本身,第三项为单词所在的行号,第四项为单词所在的列号。 注意:词法分析器需要滤掉注释,即在词法分析过程中遇到注释则跳过,继续分析随后的单词信息,词法分析器的输出信息中不含注释。 三、实验提示 1、对于设计词法分析器来说,首先应明确词法分析器是做什么的,然后进行分析和设计, 最后编程实现并测试。即先分析问题,再想解决问题的办法,然后再着手解决问题。2、编程实现词法分析器后,是否进行了测试?特别是,你设计的词法分析器能否滤掉注 释?能否识别小数? 3、在进行词法分析时,会遇到什么样的错误?词法分析器能否识别这些错误?当遇到这些 错误后,词法分析器如何继续进行分析? 四、实验提交资料 1、词法分析器设计思路.doc,其内容包含各类单词的DFA描述、词法分析器的处理流程 等; 2、词法分析器源程序; 3、测试输入文件input.txt及词法分析输出文件output.txt。 这三类资料打包,文件名命名为“学号姓名实验二”,上交至邮箱:tlf1220@https://www.360docs.net/doc/d31070380.html,。 DO IT YOURSELF – CHEATING WILL BE PUNISHED

相关文档
最新文档