课程设计词法分析器

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

《编译原理》课程设计

题目:词法分析器

班级:计算机科学系0901班

2012 年 6 月08 日

目录

1.需求分析 (1)

1.1问题描述 (1)

1.2基本要求 (1)

2.概要设计 (1)

2.1待分析的简单语言词法 (1)

2.2主要函数 (2)

2.2流程图: (3)

3.详细设计 (4)

4.调试与分析 (8)

4.1解析源文件 (8)

4.2调试与分析 (9)

4.3运行结果 (10)

5.用户手册 (11)

5.1运行环境 (11)

5.2执行文件 (11)

6.参考文献 (12)

7.心得体会 (12)

8.小组成员任务分配及工作进度安排 (12)

1.需求分析

1.1问题描述

本次课程设计旨在是设计并实现一个具体的词法分析程序,加深对词法分析的原理的理解。该词法分析程序能输入源程序并输出单词符号。在扫描源程序字符串时,一旦识别出关键字、分隔符、标识符、无符号常数中之一,即以单词形式(各类单词均采用相同的结构,即二元式编码形式)输出。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。

1.2基本要求

1.对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词类型,单词符号)显示;

2.可以将要分析的程序保存到文件中进行读取;

3.删除无用的空白字符、回车符、及其它非实质性符号。

2.概要设计

2.1待分析的简单语言词法

(1)关键字"main","void","int","char","printf","scanf","else","if","return"

(2)运算符:"+","-","*","/","="

(3)界符:"{","}","[","]",";",",",".","(",")",":"

(4)其他标记如字符串,表示以字母开头的标识符。

(5)空格、回车、换行符跳过。

2.2主要函数

int IsAlpha(char c)//判断是否为字母int IsNum(char c)//判断是否为数字

int IsKey(char *Word)//识别关键字函数void scanner(FILE *fp)//扫描函数

2.2流程图:

3.详细设计

#include

#include

#include

#include

char //定义关键字

*Key[10]={"main","void","int","char","printf","scanf","else","if","return"}; char Word[20],ch; // 存储识别出的单词流

int IsAlpha(char c) //判断是否为字母

{

if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1;

else return 0;

}

int IsNum(char c) //判断是否为数字

{

if(c>='0'&&c<='9') return 1;

else return 0;

}

int IsKey(char *Word) //识别关键字函数

{

int m,i;

for(i=0;i<9;i++)

{

if((m=strcmp(Word,Key[i]))==0)

{

if(i==0)

return 2;

return 1;

}

}

return 0;

}

void scanner(FILE *fp) //扫描函数

{

char Word[20]={'\0'};

char ch;

int i,c;

ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符

if(IsAlpha(ch)) //判断该字符是否是字母

{

Word[0]=ch;

ch=fgetc(fp);

i=1;

while(IsNum(ch)||IsAlpha(ch)) //判断该字符是否是字母或数字{

Word[i]=ch;

i++;

ch=fgetc(fp);

}

Word[i]='\0'; //'\0' 代表字符结束(空格)

fseek(fp,-1,1); //回退一个字符

c=IsKey(Word); //判断是否是关键字

if(c==0) printf("%s\t$普通标识符\n\n",Word);//不是关键字

else if(c==2) printf("%s\t$主函数\n\n",Word);

else printf("%s\t$关键字\n\n",Word); //输出关键字

}

else //开始判断的字符不是字母

if(IsNum(ch))

{ //判断是否是数字

Word[0]=ch;

ch=fgetc(fp);

i=1;

while(IsNum(ch)){

Word[i]=ch;

i++;

ch=fgetc(fp);

}

Word[i]='\0';

fseek(fp,-1,1); //回退

printf("%s\t$无符号实数\n\n",Word);

}

else //开始判断的字符不是字母也不是数字

{

Word[0]=ch;

switch(ch){

case'[':

case']':

case'(':

case')':

case'{':

case'}':

case',':

case'"':

case';':printf("%s\t$界符\n\n",Word); break;

case'+':ch=fgetc(fp);

Word[1]=ch;

if(ch=='='){

printf("%s\t$运算符\n\n",Word);//运算符“+=”

}

else if(ch=='+'){

printf("%s\t$运算符\n\n",Word); //判断结果为“++”

}

else {

fseek(fp,-1,1);

printf("%s\t$运算符\n\n",Word); //判断结果为“+”

}

break;

case'-':ch=fgetc(fp);

Word[1]=ch;

if(ch=='='){

printf("%s\t$运算符\n\n",Word); }

else if(ch=='-'){

printf("%s\t$运算符\n\n",Word); //判断结果为“--”

}

else {

fseek(fp,-1,1);

printf("%s\t$运算符\n\n",Word); //判断结果为“-”

}

break;

case'*':

case'/':

case'!':

case'=':ch=fgetc(fp);

if(ch=='='){

printf("%s\t$运算符\n\n",Word);

}

else {

fseek(fp,-1,1);

printf("%s\t$运算符\n\n",Word);

}

break;

case'<':ch=fgetc(fp);

Word[1]=ch;

if(ch=='='){

printf("%s\t$运算符\n\n",Word); //判断结果为运算符“<=”

}

else if(ch=='<'){

printf("%s\t$运算符\n\n",Word); //判断结果为“<<”

}

else {

fseek(fp,-1,1);

printf("%s\t$运算符\n\n",Word); //判断结果为“<”

}

break;

case'>':ch=fgetc(fp);

Word[1]=ch;

if(ch=='=') printf("%s\t$运算符\n\n",Word);

else {

fseek(fp,-1,1);

printf("%s\t$运算符\n\n",Word);

}

break;

case'%':ch=fgetc(fp);

Word[1]=ch;

if(ch=='='){printf("%s\t$运算符\n\n",Word);}

if(IsAlpha(ch)) printf("%s\t$类型标识符\n\n",Word);

else {

fseek(fp,-1,1);

printf("%s\t$取余运算符\n\n",Word);

}

break;

default:printf("无法识别字符!\n\n"); break;

}

}

}

main()

{

printf("////////////////////////////////////////////////////////////////////////////////\n\n");

printf("/**********************************词法分析器**********************************/\n\n");

printf("/* 编译原理课程设计*/\n\n");

printf("/* 0901班侯阳琳李彩凤芦光霞张进*/\n\n");

char in_fn[30]; //文件路径

FILE *fp;

printf("\n请输入源文件名(包括路径和后缀名):");

while(true){

gets(in_fn);

//scanf("%s",in_fn);

if((fp=fopen(in_fn,"r"))!=NULL) break;

//读取文件内容,并返回文件指针,该指针指向文件的第一个字符

else printf("文件路径错误!请重新输入:");

}

printf("\n******************* 词法分析结果如下*******************\n"); do{

ch=fgetc(fp);

if(ch=='#') break; //文件以#结尾,作为扫描结束条件

else if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格,空白,和换行

else

{

fseek(fp,-1,1); //回退一个字节开始识别单词流

scanner(fp);

}

}while(ch!='#');

return(0);

}

4.调试与分析

4.1解析源文件

void main()

{

int a=3;

a+=b;

printf("%d",a);

return;

}

4.2调试与分析

1.未输入任何数据时,运行结果如下:

2.文件输入错误时,运行结果如下:

4.3运行结果

5.用户手册

5.1运行环境

*硬件环境:多媒体计算机。

*软件环境:Windows 2003;Microsoft Visual C++6.0。

5.2执行文件

*词法.exe

6.参考文献

【1】陈火旺.程序设计语言编译原理.北京:国防工业出版社,2012

【2】王磊.编译原理上机指导.北京:科学电出版社,2009

【3】 Alfred V.Aho.编译原理.北京:机械工业出版社,2009

7.心得体会

通过此次实验,让我们对实验原理有更深的理解. 通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解,熟悉了构造词法分析程序的手工方式的相关原理,使用C语言直接编写此法分析程序。另外,也让我们熟悉了C语言的相关内容,加深了对C语言的用途的理解。全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。

8.小组成员任务分配及工作进度安排小组成员:侯阳琳、李彩凤、芦光霞、张进

任务分配:李彩凤、张进主要负责程序编程和调试

侯阳琳、芦光霞主要负责文本输入、排版工作及心得体会工作进度安排:

第十六周:李彩凤、张进编写和调试程序

第十七周:侯阳琳、芦光霞对文本进行输入和排版

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

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

实验1-3-《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

电气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人)

实验一 词法分析器的设计

实验一词法分析器的设计 (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) 关键字都是保留字。

词法分析课程设计

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

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

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对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);

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

《电子电路设计与制作》教学大纲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 };

词法分析器的实现与设计

题目:词法分析器的设计与实现 一、引言................................ 错误!未定义书签。 二、词法分析器的设计 (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语言作为开发工具。基于实验任务

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

用结点电压法求解含源网络 周全(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语言的一个子集)中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的部编码及单词符号自身值。(遇到错误时可显示“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"))

词法分析器课程设计

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

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

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

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

词法分析器的设计与实现

《编译原理》课程实验报告 实验题目:某种简单程序语言的词法分析器的设 计与实现 专业:计算机科学与技术 班级:11060341 学号:11060341 姓名:

实验目的: 设计一个词法分析程序,理解词法分析器实现的原理,掌握程序设计语言中的各类单词的词法分析方法,加深对词法分析原理的理解。 实验任务: 词法分析是从左向右扫描每行源程序的符号,拼成单词,换成统一的二元式(单词种别,单词符号的属性值)表示。对给定的程序通过词法分析器识别一个个单词符号,并以二元式(单词种别,单词符号的属性值)显示,本程序则是通过对给定程序段分析后以单词符号和文字提示显示) 实验流程:

程序清单: #include #include #include using namespace std; int k=0; struct word { char name[10]; int kind; } word[1000]; char key[35][10]= {"scanf","short","int","long","float","double","char","struct","union", "printf","typedef","const","unsigned","signed","extern","register","static", "volatile","void","if","else","switch","case","for","do","while","goto", "continue","break","default","sizeof","return","include","bool" }; bool cmp(char a[]) { int i; for(int k=0; k<35; k++) { if(strcmp(a,key[k])==0) return 1; } return 0; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif int p,q,flag; char a[1000],b[10],ch; while(gets(a)) { p=0; int len=strlen(a); while(p

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

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

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

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

编译原理课程设计报告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)程序流程图 程序主流程图: 词法分析: 语法分析:

词法分析器的设计与实现

目录 一.设计题目 (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. 设计要求 对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。另外,如果是算术表达式,则需要通过栈、运算符的优先级比较处理等从而计算出最终结果并显示。通过此次课程设计要求掌握从源程序文件中读取有效字符的方法,掌握词法分析的实现方法并上机调试编出的词法分析程序。 在处理表达式前,首先设置两个栈:一是运算符栈,用于在表达式处理过程中存放运算符。在开始时,运算符栈中先压入一个表达式结束符“#”。二是操作数栈,用于在表达式处理过程中存放操作数。然后从左到右依次读出表达式中的各个符号(运算符或操作数),每读出一个符号按以下原则进行处理:

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

电子课程设计报告书写要 求 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进制电路设计

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

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] != '}')

相关文档
最新文档