当前位置:文档之家› 词法分析器课程设计

词法分析器课程设计

词法分析器课程设计
词法分析器课程设计

软件类课程设计报告

设计题目:词法分析器

学生学号:

专业班级:计算机科学与技术

学生姓名:

学生成绩:

指导教师(职称):

课题工作时间:至

信息工程学院软件类课程设计任务书

指导教师:

日期:年月日

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

目录

目录.................................................................................................................................................................. 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++语言作为开发工具。基于实验任务的内容及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。逐步细化其功能,做到相应模块的具体化。画出未成熟的流程图,确定整体设计的走向,在一定范围内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善流程图。

第二章词法分析器课程设计

2.1课程设计内容

用c++语言设计词法分析器,由指定文件读入预分析的源程序,从左至右

描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。2.2课程设计思想

该词法分析器首先扫描文件,识别出一系列具有独立意义的基本语法单位——单词,包括关键字、保留字、标识符、各种常数、各种运算符及界符等。由于我们规定的c++语言程序语句中涉及单词较少,所以在词法分析阶段

忽略了单词输入错误的检查,并在扫描后输出单词符号。规定输出的单词符号

格式为如下的二元式:(单词种别,单词自身的值)。c++语言中定义了属于这五

种类型的大量的单词,但是由于预编译器只识别我们自定义的注释,因此预

编译器处理的单词集只是c++语言中定义的单词集的一个真子集。

2.3设计目的及说明

2.3.1程序设计范畴

完成下述文法所描绘的单词符号的词法分析程序:

<标识符>--><字母>|<标识符><字母>|<标识符><数字>

<无符号整数>--><数字>|<无符号整数><数字>

<分界符>-->+|-|*|/|;|(|)|{|}|<|<=|==|!=|>=|>|=|<空格>

<字母>-->a|…|z|A|…|Z

<数字>-->0|…|9

2.3.2程序设计说明

说明:

1.假如该语言对字母的大小写不敏感,则由指定文件读入预分析的源程序,分析结果再写入指定文件;

2.语言关键字:“if”,“else”,“then”,“for”,“while”,“do”;

第三章程序详细设计

3.1主要算法的设计

<1>fopen()打开源文件,读入字符,对文件进行扫描,把读入的字符放入缓冲区中,然后对该字符进行判断。

<2>若是字母开头,则可能是关键字或者标识符,因此进入letterprocess()进行识别。识别的过程为:将以字母开头的字母数字串放入char letter[30]中,然后进行识别。识别的过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它是关键字,则输出其二元式;否则说明其为标识符,这时,将它与标识符表char *label[20]中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。并输出其二元式。

<3>若是数字开头,则可能是常量,因此进入numberprocess()进行识别。识别的过程为:将其与常量表char num[20]中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。并输出其二元式。

<4>否则进入otherprocess()识别当前是其它字符。在识别关系运算符的时候,有可能是两个字符为一个关系运算符,所以在识别的时候要判断连续的两个是否为一个关系运算符。

3.2算法的实现

3.2.1数据类型

(1)关键字:

char*keyword[6]={"if","else","then","for","while","do"};

(2)运算符和界符:

char*operatornum[16]={"+","-","*","/","<","<=",">",">=","!","="," {","}",";","(",")"};//运算符和界符

(3)常量表和标识符表:

char*num[20]:用于存放文件中的常量;char*label[20]:用于存放文件中的标识符。

3.2.2函数模块功能

(1)search():查找并识别当前单词类别,并给定单词类别二元式码,决定给定字符串类别码(即单词种别)和记录次序码。

(2)letterprocess():识别当前是数组、保留字、标识符。

(3)numprocess():识别当前是常整数、小数、负小数。

(4)otherprocess():识别当前是其它(标点符号等)。

(5)fopen():在默认路径下打开分析程序并读入字符串。

3.3程序设计流程图

3.3.1设计流程图

图3-1程序设计流程图

3.3.2状态转换图

词法分析器使用状态转换图来识别单词符号。状态转换图是一张有限方向图。在状态转换图中,有一个初态,至少一个终态。

图3-2状态转换图

其中0为初态,2为终态。这个转换图识别(接受)标识符的过程是:从初态0开始,若在状态0之下输入字符是一个字母,则读进它,并转入状态1。在状态1之下,若下一个输入字符为字母或数字,则读进它,并重新进入状态1。一直重复这个过程直到状态1发现输入字符不再是字母或数字时(这个字符也已被读进)就进入状态2。状态2是终态,它意味着到此已识别出一个标识符,识别过程宣告终止。终态结上打个星号意味着多读进了一个不属于标识符部分的字符,应把它退还给输入口中。如果在状态0时输入字符不为“字母”,则意味着识别不出标识符,或者说,这个转换图工作不成功。

第四章运行结果及分析

4.1运行结果

图4-1运行截图

4.2结果分析

通过程序运行截图可以知道程序运行结果完全是正确的。程序设计过程大致如下:

首先,根据课程设计的任务:使用c++语言编程,实现词法分析器的基本功能,来确定本次程序设计的总体目标及路线。详细阅读课程设计的内容及要求,明确接下来的大致作业。进一步,规划算法,描绘出初步的,总体的流程图。

然后,结合编译原理相关书籍,理解程序系统的基本原理。结合c++语言相关书籍,具体细化程序设计的思路,粗略确定程序的模块划分,功能划分,并确定这些模块和功能应该有c++语言的哪些函数来实现。

接下来,着手程序编写。依次完成源文件的读入,字符的判断,文件的读写,结果的输出,并在编程过程中反复完善,多多的测试,及时检测问题是否存在,若存在,立即改善。

直到程序足够强壮,功能完善,结果正确为止。

最后,选择考虑到所有可能的测试数据,总体测试词法分析器的性能。更改输出数据的格式,使之布局合理。在需要的地方增添注释信息,删除设计过程中的测试代码或其他冗余代码,美化程序布局,调整整体的程序代码间隔。

4.3设计总结

虽然曾经学过一个学期的c++语言,但现在基本上生疏了。所以,我又用了一周的时间来复习c++语言。总体的算法及流程图不是困难的问题,这些问题可以在纸上很快的解决。本以为这些解决了,课程设计的其他问题,如程序的具体编写,应该不是难事了。当着手于实际编程时,问题接连出现。

即便如此,付出换回的收获也是可观的。自己独立完成课程设计,熟悉程序设计中出现

的所有问题以及解决方案,这无疑加深了我对设计项目的印象,增进了c++语言编程能力,熟悉了程序设计的具体流程。为以后的工作打下了基础。

结束语

本次课程设计初步培养设计者对编译器设计的思想的了解,加深对编译原理和应用程序的理解。通过设计调试词法分析程序,实现了从程序中分出各种单词的方法,从而加深了对该知识的理解,提高了词法分析的实践能力。程序的关键点在于对对给出一段程序中的各种单词的分离。在每段程序中,单词种类可以分为:关键字,分界符,算术运算符,关系运算符,标识符和常数。关键字的判断则是通过与已知数组中列出的元素进行对比,得出该单词是否为关键字;分解符,算术运算符,关系运算符的判断与接受到的字符进行比较,得出该字符是否为分解符,算术运算符或者为关系运算符。同时在编写程序过程中也遇到了许多问题,如在vc++6.0中运行是出现了错误或是运行结果没有达到预期的效果,而出现了中断等其他的问题,在不断解决问题和发现问题的过程中,我学到了很多,我体会到实践和理论的巨大差别,并且也有所成长。

总之,通过课程设计,我树立了正确的设计思想,巩固了所学编程语言基本知识,增进c++语言编程基本功;学习到如何综合运用所学的理论知识,进一步理解到高级语言在计算机中的执行过程,加深了对编译原理中重点算法和编译技术的理解,理解词法分析在编译程序中的作用;掌握了课程设计的一般方法与步骤,设计和构造编译程序的基本原理和常用的编译技术,以及编译程序的实现方法和技,提高了自己的编程能力。

参考文献

[1]《编译原理》(第2版)陈意云、张昱等编著,高等教育出版社

[2]c++语言语言程序设计(第三版)郑莉,董渊,张瑞丰编著,清华大学出版社

[3]c++程序设计(第二版)谭浩强编著,清华大学出版社

附录源程序

源程序代码:

//Lex.cpp:定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include

#include

usingnamespacestd;

#define NULL 0

FILE*fp;

char ch;

char*keyword[6]={"if","else","then","for","while","do"};//关键字

char

*operatornum[16]={"+","-","*","/","<","<=",">",">=","!=","=" ,"{","}",";","(",")","#"};//运算符和界符

boolsearch(charsearchstr[],intwordtype){//查找是否是系统关键字或运算符或界符

Int i;

switch(wordtype){case1:for(i=0;i<=5;i++){//判断是否是关键字if(strcmp(keyword[i],searchstr)==0)

Return true;

}

case2:for(i=0;i<=15;i++){//判断是否是运算

符或界符

if(strcmp(operatornum[i],searchstr)==0)return true;}

}

Return false;}

/*********************************************************** ********/

Char letterprocess(char ch)//字母处理程序

{int i=-1;char letter[30];//定义一个字符串最大长度为30 while(isalnum(ch)!=0)//判断是否为数字或字母,从文件中获得一个字符串

{letter[++i]=ch;ch=fgetc(fp);};

letter[i+1]='\0';//字符串结束

if(search(letter,1))//调用search方法,判断是否是系统关键字{if(strcmp(keyword[0],letter)==0)

cout<<"(1,"<

else if(strcmp(keyword[1],letter)==0)

cout<<"(2,"<

else if(strcmp(keyword[2],letter)==0)

cout<<"(3,"<

else if(strcmp(keyword[3],letter)==0)

cout<<"(4,"<

else if(strcmp(keyword[4],letter)==0)

cout<<"(5,"<

else if(strcmp(keyword[5],letter)==0)

cout<<"(6,"<

}

else//若不是关键字,则为一般字符串

{

cout<<"(10,'"<

return(ch);}

/*********************************************************** ************************/

charnumberprocess(char ch)//数字处理程序

{int i=-1;char num[20];while(isdigit(ch)!=0){

num[++i]=ch;ch=fgetc(fp);}

if(isalpha(ch)!=0)//判断是否为字母

{

while(isspace(ch)==0)//判断是否为空格之类的,如/t,/n,/r等{

num[++i]=ch;ch=fgetc(fp);}

num[i+1]='\0';

cout<<"错误!非法标识符:"<

num[i+1]='\0';//数字结束

cout<<"(11,"<

{int i=-1;char other[20];if(isspace(ch)!=0)//判断是否为空格之类的,如/t,/n,/r等{

ch=fgetc(fp);goto u;//若是,就返回该字符

}

while((isspace(ch)==0)&&(isalnum(ch)==0))//判断字符串是否结束

{

other[++i]=ch;ch=fgetc(fp);}

other[i+1]='\0';//标示符结束

if(search(other,2)){//调用search方法,判断是否是运算

符或界符

if(strcmp(operatornum[0],other)==0)

cout<<"(13,"<

else if(strcmp(operatornum[1],other)==0)

cout<<"(14,"<

else if(strcmp(operatornum[2],other)==0)

cout<<"(15,"<

else if(strcmp(operatornum[3],other)==0)

cout<<"(16,"<

cout<<"(20,"<

else if(strcmp(operatornum[5],other)==0) cout<<"(22,"<

cout<<"(23,"<

else if(strcmp(operatornum[7],other)==0) cout<<"(24,"<

cout<<"(21,"<

else if(strcmp(operatornum[9],other)==0) cout<<"(25,"<

cout<<"(17,"<

else if(strcmp(operatornum[11],other)==0) cout<<"(18,"<

cout<<"(26,"<

else if(strcmp(operatornum[13],other)==0) cout<<"(27,"<

cout<<"(28,"<

else if(strcmp(operatornum[15],other)==0)

cout<<"(0,"<

}else{

cout<<"错误!非法标示符:"<

}

u: return (ch); }

/*********************************************************** ************************/

int _tmain(int argc, _TCHAR* argv[]) { char str;

cout<<"***************************************************** *****

************\n";

cout<<"**\n";

cout<<"*词法分析器*\n";

cout<<"**\n";

cout<<"***************************************************** *****

************\n";

if ((fp=fopen("lex.txt","r"))==NULL) cout<<"源程序无法打开!\n";

else { str=fgetc(fp); while (str!=EOF) {

if (isalpha(str)!=0) //判断是否为字母(A –Z or a –z)

str=letterprocess(str);

else {

if (isdigit(str)!=0)

//判断字符是否是数字(0 –9)

str=numberprocess(str);

else

//若不是,则执行其他字符处理程序

str=otherprocess(str);

}

};

cout<<"词法分析结束,谢谢使用!\n"; cout<<"点任意键退出!\n"; } system("pause");

return 0;

}

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

《编译原理》 课程设计 院系信息科学与技术学院 专业软件工程 年级 2011级 学号 姓名林苾湲 西南交通大学信息科学与技术学院 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语言的一个子集,故字符集如下:

电气14级四个班级虚拟仪器课程设计题目2015秋季2016.1.18-22

12级《虚拟仪器》课程设计任务书 一、设计题目及任务 学生按分组组别从以下对应题目号中选择一题进行设计。 1.粮仓管理系统设计(利用labVIEW)(3-4人) 1)一个粮仓系统有五个独立的粮仓,假设粮仓中各有一个控制节点,用来测量其内部温度及湿度,并有两个执行机构,分别用于打开通气窗口及打开风扇。 2)假设五个粮仓的数据都汇聚在一个集中节点,该节点将数据传至上位监控计算机(串行口)。(数据协议自定,要将五个节点区分开) 3)设计一个监控界面,用于实时监控五个粮仓的实时数据。并保留每天的数据。可以按日期及指定的粮仓来查询数据,并显示历史曲线。 4)用户可以设置报警线,当温度超过报警线时,要求下传数据,启动相应的执行机构。 并在控制面板中有所显示。 5)要求用实际串口完成。(可以在另一个电脑上用串口调试助手,模拟集中节点) 2.利用声卡的数据采集与输出(LabVIEW)(3-4人) 1)通过话筒,利用声卡采集一段声音 2)显示该段声音的频率分析,分析特点,并存储起来。 3)试着根据存储的声音特色,区别不同的人。 4)存储不同的声音,利用声卡实现回放。 3.虚拟仪器的网络控制(3-4人) 1)设计一个程序控制8个外设小灯的点亮方式,要求两种方式A:每个小灯间隔时间T,依次亮,时间T可调,并循环。B:先1.3.5.7.9亮隔时间T,2.4.6.8.10亮,并循环,T 可调。 2)要求主面板与硬件的8个小灯同步。 3)通过网络在另一台计算机上控制此程序的运行(利用LabVIEW的DateSocket技术) 4.基于NI数据采集卡的虚拟示波器(3-4人) 1):波形来自外来的信号发生器(可以外接,也可以仿真) 2:通过采集此信号(波形采集) 3):主界面要求为一个典型的示波器界面,各个调节按钮的功能应该均具备。 4):要求显示波形的特征量。 5:)存储并回放波形。 5.动态分析仪(3-4人) 1):设计一个典型系统的动态响应的过度过程的分析仪。 2):输入为:单位阶跃、单位斜坡、单位加速度、脉冲输入、正弦。 3):系统为典型的一阶系统和二阶系统。相关参数可调 4):当用户在主界面输入不同的输入及系统时,要求输出其动态响应的时域及频域分析。 5):如果在上述系统中加入延时环节(延时时间可调),对应的动态响应应如何? 6.基于NI数据采集卡的虚拟信号放生器(3-4人)

词法分析器的实现与设计

题目:词法分析器的设计与实现 一、引言................................ 错误!未定义书签。 二、词法分析器的设计 (3) 2.1词的内部定义 (3) 2.2词法分析器的任务及功能 (4) 2.2.1任务 (4) 2.2.2 功能: (4) 2.3单词符号对应的种别码: (5) 三、词法分析器的实现 (5) 3.1主程序示意图: (6) 3.2函数定义说明 (6) 3.3程序设计实现及功能说明 (6) 3.3.1关键字 (6) 3.3.2关键字的定义 (7) 3.3.3符合的关键字的查找 (7) 四、词法分析程序的C语言源代码: (7) 五、结果分析: (9) 摘要:词法分析是中文信息处理中的一项基础性工作。词法分析结果的好坏将直接影响中文信息处理上层应用的效果。通过权威的评测和实际应用表明,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语言设计词法分析器,由指定文件读入预分析的源

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

编译技术 班级网络0802 学号3080610052姓名叶晨舟 指导老师朱玉全2011年 7 月 4 日

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

词法分析课程设计

《词法分析》设计说明书 学生姓名 学 号 5011110122 5011110133 5011110128 所属学院 信息工程学院 专 业 计算机科学与技术 班 级 计算机15-1班 信息工程学院 《编译原理及实践》结课大作 业

摘要 编译,简单的说,就是把源程序转换为可执行程序。从hellow worl说程序运行机制里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。在这个过程中,编译器做了很多重要的工作。对于编译的内部实现,也就是编译的原理。 这篇论文主要说的是编译器前端,词法分析器的原理,最后会给出一个词法分析器的简单实现。 编译简单的说,就是把源程序转化为另一种形式的程序,而其中关键的部分就是理解源程序所要表达的意思,才能转化为另一种源程序。 可以用一个比喻来说明问题:人A和人B想要交谈,但是他们都不知道彼此的语言,这就需要一个翻译C,同时懂得A和B的语言。有了C做中间层,A和B才能正常交流。C的作用就有点像编译器,它必须能理解源程序所要表达的意思,才能把信息传递给另一个。编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、、),然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。 程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。 这篇论文主要说的就是词法分析,也就是把输入的符号串整理成特定的词素。 关键词:单片机;词法分析

电子电路设计与制作教学大纲

《电子电路设计与制作》教学大纲1.课程中文名称:电子电路设计与制作 2.课程代码: 3.课程类别:实践教学环节 4.课程性质:必修课 5.课程属性:独立设课 6.电子技术课程理论课总学时:256总学分:16 电子电路设计与制作学时:3周课程设计学分:3 7.适用专业:电子信息类各专业 8.先修课程:电路分析基础、模拟电子技术、数字电子技术、PCB电路设计一、课程设计简介 实验课、课程设计、毕业设计是大学阶段既相互联系又相互区别的三大实践性教学环节。实验课是着眼于实验验证课程的基本理论,培养学生的初步实验技能;毕业设计是针对本专业的要求所进行的全面的综合训练;而课程设计则是针对某几门课程构成的课程群的要求,对学生进行综合性训练,培养学生运用课程群中所学到的理论学以致用,独立地解决实际问题。电子电路设计与制作是电子信息类各专业必不可少的重要实践环节,它包括设计方案的选择、设计方案的论证、方案的电路原理图设计、印制板电路(即PCB)设计、元器件的选型、元器件在PCB板上的安装与焊接,电路的调试,撰写设计报告等实践内容。电子电路设计与制作的全过程是以学生自学为主,实践操作为主,教师的讲授、指导、讨论和研究相结合为辅的方式进行,着重就设计题目的要求对设计思路、设计方案的形成、电路调试和参数测量等展开讨论。 由指导教师下达设计任务书(学生自选题目需要通过指导教师和教研室共同审核批准),讲解示范的案例,指导学生各自对自己考虑到的多种可行的设计方案进行

比较,选择其中的最佳方案并进行论证,制作出满足设计要求的电子产品,撰写设计报告。需要注意是,设计方案的原理图须经Proteus软件仿真确信无误后,才能进行印刷电路图的制作,硬件电路的制作,以避免造成覆铜板、元器件等材料的浪费。电路系统经反复调试,完全达到(或超过)设计要求后,再完善设计报告。设计的整个过程在创新实验室或电子工艺实验室中完成。 二、电子电路设计与制作的教学目标与基本要求 教学目标: 1、通过课程设计巩固、深化和扩展学生的理论知识,提高综合运用知识的能力,逐步提升从事工程设计的能力。 2、注重培养学生正确的工程设计思想,掌握工程设计的思路、内容、步骤和方法。使学生能根据设计要求和性能参数,查阅文献资料,收集、分析类似电路的性能,并通过设计、安装、焊接、调试等实践过程,使电子产品达到设计任务书中要求的性能指标的能力。 3、为后续的毕业设计打好基础。课程设计的着眼点是让学生开始从理论学习的轨道上逐渐转向实际运用,从已学过的定性分析、定量计算的方法,逐步掌握工程设计的步骤和方法,了解工程设计的程序和实施方法;通过课程设计的训练,可以给毕业设计提供坚实的铺垫。 4、培养学生获取信息和综合处理信息的能力,文字和语言表达能力以及协调工作能力。课程设计报告的撰写,为今后从事技术工作撰写科技报告和技术文件打下基础。 5、提高学生运用所学的理论知识和技能解决实际问题的能力及其基本工程素质。 基本要求: 1、能够根据设计任务和指标要求,综合运用电路分析、电子技术课程中所学到的理论知识与实践操作技能独立完成一个设计课题的工程设计能力。 2、会根据课题需要选择参考书籍,查阅手册、图表等有关文献资料。能独立思考、深入钻研课程设计中所遇到的问题,培养自己分析问韪、解决问题的能力。

编译原理课程设计(词法分析,语法分析,语义分析,代码生成)

编译原理课程设计(词法分析,语法分析,语义分析,代码 生成) #include #include #include #include #include #include using namespace std; /************************************************/ struct token// token { int code;// int num;// token *next; }; token *token_head,*token_tail;//token struct str// string { int num;// string word;// str *next; }; str *string_head,*string_tail;//string struct ivan// {

char left;// string right;// int len;// }; ivan css[20];// 20 struct pank// action { char sr;// int state;// }; pank action[46][18];//action int go_to[46][11];// go_to struct ike// { ike *pre; int num;// int word;// ike *next; }; ike *stack_head,*stack_tail;// struct L// { int k; string op;// string op1;// string op2;// string result;// L *next;// L *Ltrue;//true L *Lfalse;//false };

用结点电压法求解含源网络-电路分析基础课程设计

用结点电压法求解含源网络 周全(5030309773) 结点电压法是一种运用范围较广的分析方法,用结点电压法分析含源网络时需要注意的是: 1.列方程前,应把实际电压源模型等效变换为实际电流模型; 2.理想电压源去路中的电流不能忽略 3.与理想电流源串联的元件应看成短路; 4.将受控源按独立源处理,并用结点电压表示其控制量 一、常规题: 例:列出图中电路的结点电压方程 解:取与理想电压源去路所连的两个结点之一的①为参考结点,这时结点②的 电压=1V ,可作为已知量,因此不必列写结点②的结点电压方程,对结点③,④的结点电压方程为: 2322341(11)330.5111(11)30.50.20.51n n n n n n u u u u u u ?+++=+??++++=???????? 2?4 补充方程 2n u u =? 把 u 2=1V 和 u 2=-u n4 代入方程组,整理即得 3434293 n n n n u u u u +=???+=??

二、用结点电压分析法求解电路时碰到的非常规情况: 用结点电压分析法求解的常规情况很多书上都有相应的题目,但我在做题时发现了一道用节点电压法解。 例:用结点电压法求解图示电路u 和u 3 解:选结点③为参考结点,对①,②列方程 121211(21)2(11)5n n n n n u u u u u u +?=???++=??=? 1u 0 整理以上方程可得 12123262n n n n u u u u ?=???+=? 可以看出,该方程无解,此题说明,当电路中含有受控源时,有可能解不存在,而对一个实际的物理系统来说,解应该是存在的,这道题当时做时很容易想为什么解不出,却没想到这题模型本来就是不合实际电路的,而答案正是要我们发现这一点,所以我觉得这道题还是很巧妙的。

编译原理设计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)//存入常数表,并返回它在常数表中的位置

词法分析器实验报告

词法分析器实验报告 词法分析器实验报告实验目的: 设计、编制、调试一个词法分析子程序,识别单词,加深对词法分析原理的理 解。 实验要求: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立 意义的单词,即基本保留字、标识符、常数、运算符、分界符五大类。并依次输出 各个单词的内部编码及单词符号自身值。 (一)实验内容 (1)功能描述:对给定的程序通过词法分析器弄够识别一个个单词符号,并以二 元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件 的分析后以单词符号和文字提示显示。 (2)程序结构描述: 函数调用格式: 函数调用格式函数名(实在参数表 ) Switch(m)、 isKey(String string)、isLetter(char c)、实参 isDigit(char c)、isOperator(char c) isKey(String string)、isLetter(char c)、调作为表达式 isDigit(char c)、isOperator(char c) 用 方 作为语句 getChar()、judgement()、 法 函数的递归调用 isOperator(char c) 、isLetter(char c)、isDigit(char c)

参数含义: 1 String string;存放读入的字符串 String str; 存放暂时读入的字符串 char ch; 存放读入的字符 int rs 判断读入的文件是否为空 char []data 存放文件中的数据 int m;通过switch用来判断字符类型, 函数之间的调用关系图: main Complier..judgement isOperate() M=0 getChar( ) isDigit() M=4 For(ch ) isLet ter() M=2 Switch(m) isKey() M=3 函数功能: Judgement()判断输入的字符并输出单词符号,返回值为空; getChar() 读取文件的,返回值为空; isLetter(char c) 判断读入的字符是否为字母的,返回值为Boolean类型; switch (m) 判断跳转输出返回值为空; isOperator(char c)判断是否为运算符的,返回值为Boolean类型; isKey(String string)判断是否为关键字的,返回值为Boolean类型; isDigit(char c) 判断读入的字符是否为数字的,返回值为Boolean类型。测试结果:

词法分析器课程设计

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

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

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

目录 目录.................................................................................................................................................................. 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++语言作为开发工具。基于实验任务的内容及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。逐步细化其功能,做到相应模块的具体化。画出未成熟的流程图,确定整体设计的走向,在一定范围内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善流程图。

用矩阵方法使网孔分析法通解-电路分析基础课程设计

用矩阵方法使网孔分析法通解 黄明康 5030309754 F0303025 在网络电路的学习中,我们一般使用结点分析法与网孔分析法。我们知道他们有各自的用途,但其实如果使用得当,只用其中的一个方法就可以解所有目前已经可解得网络电路。而在我看来这得当的使用就是巧妙运用数学。之所以如此,我认为是因为结点分析法的基础KCL与网孔分析法的基础KVL是相容的,即可以用结点分析法的地方就可以用网孔分析法解题。 先来看个例子,从网孔分析法说起,如图(1)所示,是一个非常适合用结点分析法与网孔分析法解题的网络。 正如上课时所做的,我们用网孔分析法解之,以im1、im2、im3为支路电流列出回路的矩阵方程,方程如式(2)。

最左边的矩阵是各回路的电阻矩阵,解出此方程,再根据VCR就能得出整个网路电路的各个参数。由于篇幅所限,也由于这已是大家皆知的常规方法,对于为何使用这种方法及其可用性、使用方法等在此不再冗述。 而我关心的是,这种方法是在这么一个可以说是完美的电路网络中运用的,所以一旦电路中的某个器件变了,可能使这种方法不可用。而其实上课时已经提出了这种问题,也给出了改进了的解题方法——运用网路电路的一些性质化解电路成可用网孔分析法的电路。 但这种方法在解题中会使不熟练的我不经意中掉入“陷阱”。我更愿意用以下的方法用数学解题,这样可以使我们不必太过计较概念。 对于我的方法,也请先看一个例子,如图(3): 这样,这个电路就不能单纯的运用网孔分析法了。那么按之前所述,运用网路电路的一些性质化解电路成可用网孔分析法的电路,然后解之,正如图(4)

a 和图(4) b 中所示过程。 然后得出电阻网络矩阵方程,解出所要的量。 对于以上的例题,也有所谓的虚网孔电流法如式(5): 其实,虚网孔电流法仅仅只是根据我们在网孔分析法的引出中得出的规律重新又列出了简单的方程组,这跟我们最初想要使用结点分析法和网孔分析法的初衷不符,初衷是按给出的网络电路图直接写出矩阵方程。这样就使我们可以更好的应对复杂的网络。 当然,也正是虚网孔电流法使我想起了网孔分析法的一般矩阵解法。仍就看图(3):

东南大学编译原理词法分析器实验报告

词法分析设计 1. 实验目的 通过本实验的编程实践,了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 2. 实验内容 用C++语言实现对C++语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。 3. 实验原理 本次实验采用NFA->DFA->DFA0的过程: 对待分析的简单的词法(关键词/id/num/运算符/空白符等)先分别建立自己的FA,然后将他们用产生式连接起来并设置一个唯一的开始符,终结符不合并。 待分析的简单的词法 (1)关键字: "asm","auto","bool","break","case","catch","char","class","

const","const_cast"等 (2)界符(查表) ";",",","(",")","[","]","{","}" (3)运算符 "*","/","%","+","-","<<","=",">>","&","^","|","++","--"," +=","-=","*=","/=","%=","&=","^=","|=" relop: (4)其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。 id/keywords: digit: (5)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

编译原理课程设计报告C语言词法与语法分析器的实现

编译原理课程设计报告 课题名称:编译原理课程设计 C-语言词法与语法分析器的实现

C-词法与语法分析器的实现 1.课程设计目标 (1)题目实用性 C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。(2)C-语言的词法说明 ①语言的关键字: else if int return void while 所有的关键字都是保留字,并且必须是小写。 ②专用符号: + - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。 小写和大写字母是有区别的。 ④空格由空白、换行符和制表符组成。空格通常被忽略。 ⑤注释用通常的c语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记)上,且可以超过一行。注释不能嵌套。

(3)程序设计目标 能够对一个程序正确的进行词法及语法分析。 2.分析与设计 (1)设计思想 a.词法分析 词法分析的实现主要利用有穷自动机理论。有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。通过有穷自动机理论能够容易的设计出词法分析器。b.语法分析 语法分析采用递归下降分析。递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。 (2)程序流程图 程序主流程图: 词法分析: 语法分析:

电子课程设计报告书写要求

电子课程设计报告书写要 求 Prepared on 22 November 2020

电子课程设计报告书写要求 (以数字电子钟为例) 1、封面(按以前的封面格式) 2、任务书 3、正文 一、数字电子钟总体设计方案 依据数字电子钟的任务要求,设计的总体方案如图1-1所示 图1-1 数字电子钟总体方案 (下面对总体原理进行说明)。。。。。。 二、各模块原理设计和分析 1、时基电路模块设计 本设计的时基电路模块由两个独立分模块组成,一个是由555定时器和RC 构成的秒脉冲电路;另一个是由的晶振和CD4060构成的振荡器,分频器构成的2Hz时基电路。 (1)555构成的秒脉冲电路 设计的555秒脉冲电路如图2-1所示 (电路工作原理阐述。。。。。。) (画出555振荡波形参考课件,给图标2-2) 参数计算 (列出振荡周期表达式,给定R80、R81和C10参数计 算周期) (2)晶振和CD4060构成的振荡分频电路 本设计采用频率为的晶振和CD4060构成精确的时基电路,见图2-3。 电路原理。。。。。。

由于晶振的频率为=215Hz,通过CD4060的14级分频输出为2Hz,必须再经过一次2分频才能实现秒脉冲,设计的2分频电路如图2-4所示。。。。。。。 图 2-4 晶振秒脉冲时基电 路 2、计时电路模块设计 该模块分别由” 秒”计数电路、”分”计 数电路和”小时”计数电路构成;秒和分都是60进制,小时是24进制,设计采用CD4518做计数器。 (1) CD4518计数器分析 CD4518是双8421-BCD编码同步加法计数 器如图2-5所示。 。。。。。。 列出CD4518的功能表和时序图(2-6)和 文字说明 (2)60进制电路设计 分和秒都是60进制,电路原理和 结构相同。60进制电路如图2-7所示。 电路原理。。。。。。 (3)24进制电路设计

词法分析器的设计与实现

目录 一.设计题目 (2) 二.设计要求 (2) 1. 词法分析器的定义 (2) 2. 设计要求 (2) 3. 本程序自行规定: (3) 三.设计作用与目的 (4) 1. 设计作用 (4) 2. 设计目的 (4) 四.运行环境及工具软件 (4) 五.系统设计 (5) 1. 系统总体设计 (5) (1)词法分析器的设计 (5) (2)总体设计框图 (6) (3)总程序流程图 (6) 2. 各子模块设计 (8) (1)字符的识别 (8) (2)关键字的识别 (8) (3)数字的识别 (8) (4)界符的识别 (10) (5)运算处理 (10) 3.相关函数分析 (11) 4. 源程序设计 (12) 六.实验调试结果 (29) 1. 调试工具 (29) 2. 调试步骤 (29) 3. 调试结果 (29) 七.设计中的问题及解决方法 (31) 八.设计心得 (32) 九.参考文献 (34)

词法分析器的设计与实现 一.设计题目 词法分析器的设计与实现 二.设计要求 1. 词法分析器的定义 词法分析顾名思义就是分词。它以程序设计语言编制的源程序作为输入,以单词序列作为输出。分词过程可以通过编制程序自动完成,我们通常称这个分词程序为词法分析器。词法分析器分析的源程序可以是现有的各类程序设计语言源程序也可以是人为给定的模型语言的源程序。本文中的源程序为后者。从词的角度来看,它涉及的内容较为简单,只包括几个较为常用的词类,词类的构成上也适当的作了一些简化。对词进行分析时,我们是按类型进行分析的。不同类型的词在后续的分析中所起的作用不同,相应的操作也各有不同,但同种类型中的词虽然单词的构成不同但从宏观上看它们的操作大体一致。模型语言中的单词可以分为“关键字”、“标识符”、“常数”、“分隔符”、“运算符”几类。一般,关键字在程序设计语言中人为给定 2. 设计要求 对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。另外,如果是算术表达式,则需要通过栈、运算符的优先级比较处理等从而计算出最终结果并显示。通过此次课程设计要求掌握从源程序文件中读取有效字符的方法,掌握词法分析的实现方法并上机调试编出的词法分析程序。 在处理表达式前,首先设置两个栈:一是运算符栈,用于在表达式处理过程中存放运算符。在开始时,运算符栈中先压入一个表达式结束符“#”。二是操作数栈,用于在表达式处理过程中存放操作数。然后从左到右依次读出表达式中的各个符号(运算符或操作数),每读出一个符号按以下原则进行处理:

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状 态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程 序字符串的词法分析。输出形式是源程序的单词符号二元式的代码, 并保存到文件中。 二、实验内容: 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符 3. 输出的单词符号的表示形式: 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 词法分析器的结构 单词符号 5. 状态转换图实现

三、程序设计 1.总体模块设计 /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/ string GetWord(string str,int i,int& j); /*这个函数用来除去字符串中连续的空格和换行 int DeleteNull(string str,int i); /*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i); /*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i);

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

南华大学 计算机科学与技术学院实验报告 ( 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

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

(此文档为word格式,下载后您可任意编辑修改!) 编译技术 班级网络0802 学号 姓名叶晨舟 指导老师朱玉全 2011年 7 月 4 日

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

相关主题
文本预览
相关文档 最新文档