文档库 最新最全的文档下载
当前位置:文档库 › 霍夫曼编译器课设

霍夫曼编译器课设

霍夫曼编译器课设
霍夫曼编译器课设

沈阳航空航天大学

课程设计报告

课程设计名称:数据结构课程设计课程设计题目:霍夫曼编/译码器

院(系):

专业:

班级:

学号:

姓名:

指导教师:

目录

1 需求分析 (1)

1.1问题描述 (1)

1.2问题理解 (1)

2 系统设计 (2)

2.1总体方案设计 (2)

2.2数据结构设计 (2)

2.3函数设计 (3)

2.4关键流程 (4)

2.4.1 系统主流程 (4)

2.4.3 创建霍夫曼树函数流程函数 (7)

2.4.4 霍夫曼树建立霍夫曼表的函数流程 (8)

3 调试分析 (10)

4 测试及运行结果 (11)

参考文献 (13)

附录 (14)

1 需求分析

1.1 问题描述

设计一个利用霍夫曼算法的编码与译码系统,可以接收来自键盘输入的字符集大小、字符和权值信息,创建霍夫曼树生成霍夫曼编码并能对其进行译码的系统。

1.2 问题理解

首先,建立的霍夫曼编码与译码器并能够接受字符集大小、字符和权值信息,因此用字符数组存储字符串,把相同字符出现的次数作为每个字符的权值,用数组存储,建立一个链表,依次存储字符串中的字符,建立霍夫曼树,选取两个权值最小的字符组合,依次构成霍夫曼树,以左孩子码为0,右孩子为1,对霍夫曼树中的节点进行编码以及译码的应用。

2 系统设计

2.1 总体方案设计

打开存放字符或编码的文件,将文件中的字符串存入字符串数组里,查找字符串中字符的个数和每个字符出现的次数,创建霍夫曼树,将各个字符出现的次数作为权值,存入霍夫曼链表的前n个单元中,将后n-1个节点赋权值,建树,从每个叶子节点开始,利用霍夫曼树对每个字符进行编码,最终建立一个霍夫曼表,利用霍夫曼编码表对整个字符串进行编码,对霍夫曼编码进行解码,放入字符串s中。

2.2 数据结构设计

本程序的数据结构设计用了霍夫曼树的节点结构体,编码结构体其结构体如下:

typedef struct node

{

int weight;

struct node *LChild,*RChild,*Parent;

struct node *next;

} HFMNode,*HFMTree;

typedef struct

{

char ch;

char code[N+1];

int start;

}CodeNode;

2.3 函数设计

﹙1﹚本系统所设计的函数见表2.1。

表2.1 函数列表

函数名称函数原型功能描述

main void main()

进入编码程序

TransCode TransCode(char code[],char str[],char

ss[],HFMTree *HT,CodeNode HC[]) 对经过编码得到的字符串码进行解码

Coding Coding(char s[],char str[],char

code[],int count[],HFMTree

*HT,CodeNode HC[])

对文件中的字符串进行编码

DeCoding DeCoding(char code[],HFMTree HT,char

str[],char s[])

将编码进行解码存入字符串数组ss[]中

TotalCoding TotalCoding(char s[],CodeNode

HC[],char code[])

利用哈夫曼编码表对整个字符串进行

编码

HFMCode HFMCode(HFMTree HT,CodeNode HC[],char

str[])

/从每个叶子节点开始,利用哈夫曼树

对每个字符进行编码,最终建立一个哈

夫曼表

CreatHFMTree CreatHFMTree(HFMTree *HT,int count[]) 创建哈夫曼树

SelectMin SelectMin(HFMTree HT,int k,HFMTree

*HT1,HFMTree *HT2)

查找哈夫曼链表中两个权值最小的节

SearchStr SearchStr(char s[],char str[],int

count[])

查找字符串中字符的个数和每个字符

出现的次数

Save Save(char s[]) 保存字符或编码到文件中

Open Open(char s[]) 打开存放字符或编码的文件,将其存入

字符串数组中

﹙2﹚本系统函数的调用关系见图2.1。

图2.1 函数调用关系

2.4 关键流程

2.4.1 系统主流程

(1)主函数的简单描述:

首先主函数调用清屏函数Clearscreen (),然后,当choice='1,调用函数Coding(s,str,code,count,&HT,HC),实现对文件中的字符串进行编码功能;当choice='2,调用函数TransCode(code,str,ss,&HT,HC),实现对经过编码得到的字

符串码进行解码功能;当choice !='0,主函数进行循环;当choice='0,主函数调

用结束。

(2)主函数的流程图

本函数的具体流程见图2.2。

main

coding

transcode

open searchstr HFMcode

totalcoding Save(code) creatHFMtree

Save(ss open

docodin g

s[M]和ss[M]是两个字符数组;Clearscreen ()是清屏函数;choice 则是switch 语句;Coding 是对文件中的字符串进行编码;TransCode 是对经过编码得到的字符串码进行解码。

开始

char s[M],ss[M];

Clearscreen ();

choice=‘1’

choice!='0'

Coding(s,str,code,count,&HT,

HC);break;

结束

choice='2'

choice='0'

TransCode(code,str,ss,&HT,HC

);break;

printf(" 输入错误!请重新输

入!\n");

break;

N

N

N

Y

Y

Y

图2.2 主函数的流程图

2.4.2 打开存放字符文件,存入字符串数组流程

(1)打开存放字符文件,存入字符串数组流程的简单描述:

本函数的功能是:首先判断文件是否为空,然后将文件中的字符存到数组中,当数组中的元素不为EOF时就进行循环直到不满足循环条件结束。

(2)打开存放字符文件,存入字符串数组流程流程图。

本函数的具体流程见图2.3。

fp是一个文件;s[i]存储文件中字符fget(fp)。

开始

N

(fp=fopen(name,"r

t"))==NULL

Y

printf("打开失败!\n");

s[i++]=fgetc(fp);

N

s[i-1]!=EOF

Y

s[i++]=fgetc(fp);

结束

图2.3 打开存放字符文件,存入字符串数组流程图

2.4.3 创建霍夫曼树函数流程函数

(1)霍夫曼树函数的简单描述:

写出本函数的具体功能为:当满足i<2*n-1时,创建哈夫曼链表,然后将字符出现的次数 作为权值钱n 个链表结点中,最后对后n-1个接点赋值建树。 (2)霍夫曼树函数的流程图。本函数的具体流程见图2.4。

i 是计数量;p 是创建的HFMTree 结构体;HT 是树根;p->weight 是权值;count 起计数作用;SelectMin 查找字符串中字符的个数和每个字符出现的次数。

Y

i

p->weight=count[i];

i++ i=n

SelectMin(*HT,i,&HT1,&HT2);

i++

结束

i<2*n-1

开始

inti;

i=1

p->next=(HFMTree)malloc(sizeof

(HFMNode));

i++

i<2*n-1

Y

Y

N

i=0,p=*HT

N

N

图2.4霍夫曼树函数的流程图

2.4.4 霍夫曼树建立霍夫曼表的函数流程

(1)霍夫曼树对每个字符进行编码,最终建立一个霍夫曼表的函数简单描述:本函数的功能是:首先将字符存入哈夫曼编码结构体数组的字符单元中,然后将叶子结点的数值转换到创建的霍夫曼表中。

(2)霍夫曼树建立霍夫曼表的函数流程图

本函数的具体流程见图2.5。

HC[]是CodeNode结构体数组, str[]是字符型数组;q->Parent不为空的作用是判断q所指向的节点,左孩子置0,右孩子置1 q==q->Parent->LChild是将p指向p的左孩子;p=p->next是将将p指向p的下一个结构体。

图2.5霍夫曼树建立霍夫曼表的函数流程图

q->Parent

q==q->Parent ->LChild

HC[i].code[--HC[i].s tart]='0';

i++

p=p->next;

HC[i].code[--HC[i].start]='1';

q=q->Parent

结束

开始

inti;

i=0

i

HC[i].ch=str[i];

i++

i=0

i

HC[i].start=n-1;

q=p

N

Y

N

Y

Y

Y

N

N

3 调试分析

(1) 问题1

●问题描述:编码过程中字符串编码总是缺少很多位,甚至不能编码一些

字符。

●问题分析:字符串编码总是缺少很多位,说明导致这种情况的可能是节

点不够多,致使编码没空间存储。

●解决方法:初始化霍夫曼链表的节点不够,如果假设字符串有n个,那

链表节点至少得有2n-1个,比如对4个字符串编码,先在4个字符里选2个权值最小的字符,2个字符权值相加,生成新的一个节点存储,现在还剩3个节点,同理3选2,生成新节点,剩余一个节点最后与上一步生成的节点配对,因此共需要生成3个新节点来存储。

(2) 问题2

●问题描述:程序运行中,当创建树时,无法将树的元素存入到其中。

●问题分析:无法存入其中,可能有两方面原因,第一:没有初始化树,

即没有申请空间;第二方面:可能是树的结构体定义出现错误。

●解决方法:在树的创建中,首先对其进行初始化,申请存储空间,然

后再输入树的元素,经过调试,结果正确。

4 测试及运行结果(1)编码的具体的测试结果如图4.1所示。

图4.1编码的测试结果

(2)编码和保存编码的具体的测试结果如图4.2所示。

图4.2 编码和保存编码的测试结果

(3)译码和保存译码的具体的测试结果如图4.3所示。

图4.3译码和保存译码的测试结果

参考文献

[1] 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2007

[2] 吕国英. 算法设计与分析[M].北京:清华大学出版社,2006

[3] 徐宝文,李志.C程序设计语言[M].北京:机械工业出版社,2004

[4] Erich Gamma,Richard Helm.设计模式(英文版)[M].北京:机械工业出版社,2004

附录

源程序清单:

#include

#include

#include

#define M 10000

#define N 128

typedef struct node

{

int weight;

struct node *LChild,*RChild,*Parent;

struct node *next; //指向建立的哈夫曼树的下一个节点

} HFMNode,*HFMTree;

typedef struct

{

char ch;

char code[N+1];

int start;

}CodeNode;

int n;

void clearscreen()

{

system("cls");

}

void Save(char s[])

{

char name[10];

FILE *fp;

printf("请输入要保存的文件名:");

gets(name);

if((fp=fopen(name,"wt"))==NULL)

{

printf("存储失败!");

exit(1);

}

fputs(s,fp);

printf("\n保存成功,文件名为:%s。\n",name); printf("\n按回车键继续...");

getchar();

fclose(fp);

}

void Open(char s[])

{

char name[10];

FILE *fp;

int i=0;

printf("请输入要打开的文件名:");

gets(name);

if((fp=fopen(name,"rt"))==NULL)

{

printf("打开失败!\n");

exit(1);

}

s[i++]=fgetc(fp);

while(s[i-1]!=EOF)

s[i++]=fgetc(fp);

s[i]='\0';

fclose(fp);

}

void SearchStr(char s[],char str[],int count[]) {

int i,j,k=0;

for(i=0;i

count[i]=0;

for(i=0;s[i];i++)

{

for(j=0;j

if(str[j]==s[i])

{

count[j]++;

break;

}

if(j==k)

{

str[k]=s[i];

count[k++]++;

}

}

str[k]='\0';

n=k-1; //将实际的字符个数作为叶子节点个数存入n

}

void SelectMin(HFMTree HT,int k,HFMTree *HT1,HFMTree *HT2) {

int i,min;

HFMTree p;

min=32767;

for(i=0,p=HT;inext)

if(p->weightParent==0)

{

min=p->weight;

*HT1=p;

}

min=32767;

for(i=0,p=HT;inext)

if(p->weightParent==0&&p!=*HT1)

{

min=p->weight;

*HT2=p;

}

}

void CreatHFMTree(HFMTree *HT,int count[])

{

int i;

HFMTree p,HT1,HT2;

p=*HT=(HFMTree)malloc(sizeof(HFMNode));

p->next=p->LChild=p->RChild=p->Parent=NULL;

for(i=1;i<2*n-1;i++)

{

p->next=(HFMTree)malloc(sizeof(HFMNode));

p=p->next;

p->next=p->LChild=p->RChild=p->Parent=NULL;

}

for(i=0,p=*HT;i

{

p->weight=count[i];

p=p->next;

}

for(i=n;i<2*n-1;i++)

{

SelectMin(*HT,i,&HT1,&HT2);

HT1->Parent=HT2->Parent=p;

p->LChild=HT1;

p->RChild=HT2;

p->weight=HT1->weight+HT2->weight;

p=p->next;

}

}

void HFMCode(HFMTree HT,CodeNode HC[],char str[]) {

int i;

编译原理课程设计

<PL0编译器-PCompiler> 软件需求说明书 作者:刁诗云、麻汉华、潘彦荃、周津、李程完成日期:2009年6月7日 签收人: 签收日期: 修改情况记录:

目录 软件需求说明书 (1) 1 引言 (1) 1.1 编写目的 (1) 1.2 项目背景 (1) 2 项目概述 (2) 2.1 产品描述 (2) 2.2 产品功能 (2) 2.3 用户特点 (2) 3 具体需求 (3) 3.1 EBNF定义的PL/0文法 (3) 3.2 语法图 (4) 3.3 功能需求 (6) 3.4 系统概要设计 (15)

1 引言 1.1 编写目的 为了清楚表达客户提出的需求,便于用户理解和确认项目所包含的具体功能需求、性能需求以及非公能性需求,因此以文件化的形式,把系统整体及其部分的业务流程、系统功能进行了详细的说明。同时,此文也对开发人员起到引导的作用,请认真阅读。 1.2 项目背景 PL/0是由世界著名计算机科学家、PASCAL语言的创始人N.Wirth教授选择提供的。在选择PL/0语言的过程中,Wirth很费了一番脑筋。一方面他希望借助这个语言,能尽可能把程序设计语言和编译技术一些最重要的内容都讲到;但另一方面又不希望内容太多,太杂,而希望尽可能简单一些,以便与有限的课时和课程范围相适应。于是他精心选择提供了这个PL/0语言。事实证明,它非常适合于编译技术的教学,目前已被国内越来越多的编译教材所采用。 PL/0语言的语句类型比较丰富,能适应各种可能的程序结构。最进本的是赋值语句。组合结构语句有语句串、条件语句和循环语句。还有重要的子程序概念,是通过过程说明和过程调用两部分实现的。至于数据类型和数据结构,PL/0则特别简单,只有整数类型一种,没有数据结构,因此只允许有整常数和整数变量的说明以及相应的算术运算表达式。PL/0允许在一个过程范围内说明常数、变量和过程。这些常数、变量和过程只在它们被说明的过程范围内有效。PL/0语言也允许递归调用,既可以间接递归,也可以直接递归。

编译原理课程设计

《编译原理》课程设计大纲 课程编号: 课程名称:编译原理/Compiler Principles 周数/学分:1周/1学分 先修课程:高级程序设计语言、汇编语言、离散数学、数据结构 适用专业:计算机科学与技术专业、软件工程专业 开课学院,系或教研室:计算机科学与技术学院 一、课程设计的目的 课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写。 设计时间: 开发工具: (1) DOS环境下使用Turbo C; (2) Windows环境下使用Visual C++ 。 (3) 其它熟悉语言。 二、课程设计的内容和要求 设计题一:算术表达式的语法分析及语义分析程序设计。 1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词 法检查和分析。 2.设计内容及要求: 算术表达式的文法: 〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/ (1) 分别选择递归下降法、算符优先分析法(或简单优 先法)完成以上任务,中间代码选用逆波兰式。 (2) 分别选择LL(1)、LR法完成以上任务,中间代码选 用四元式。 (3) 写出算术表达式的符合分析方法要求的文法,给出 分析方法的思想,完成分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通 过所设计的分析程序。 设计题二:简单计算器的设计 1.目的 通过设计、编制、调试一个简单计算器程序,加深对语法及语 义分析原理的理解,并实现词法分析程序对单词序列的词法检 查和分析。 2.设计内容及要求 算术表达式的文法:

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理课程设计

编译原理课程设计报告 课题名称: C-语言编译器设计(scanner和parser) 提交文档学生姓名: 提交文档学生学号: 同组成员名单:无 指导教师姓名:金军 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间: 2011年 6 月 17 日

1.课程设计目标 设计C-Minus编译器分为scanner和parser两个部分。scanner主要作用是对目标代码进行扫描,列出关键字,变量等内容;parser主要对语法进行分析并生成语法树。 2.分析与设计 ●实现方法:代码用C语言编译而成。其中scanner为手工实现,主要采用switch-case结构实现 状态转换;parser部分采用递归下降分析方法实现。 ●扫描器:C-的词法如下: 1、语言的关键字:i f el se i nt return void while 2、专用符号:+ - * /< <= > >= == != =; , ( ) [ ] { } /* */ 3、其他标记是变量(ID)和数字(NUM),通过下列正则表达式定义: ID = letter letter* NUM = di git digi t* letter = a|..|z|A|..|Z digi t = 0|..|9 4、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字 5. 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在 标记内)上,且可以超过一行。注释不能嵌套 其DFA图如下:

分析器:以下为C-的语法规则BNF:

编译原理课程设计报告_LL(1)分析过程模拟

课程设计(论文)任务书 软件学院学院软件工程专业07-1班 一、课程设计(论文)题目LL(1)分析过程模拟 二、课程设计(论文)工作自 2010 年 6 月 22日起至 2010 年 6月 28 日止。 三、课程设计(论文) 地点: 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)使学生掌握LL(1)模块的基本工作原理; (2)培养学生基本掌握LL(1)分析的基本思路和方法; (3)使学生掌握LL(1)的调试; (4)培养学生分析、解决问题的能力; (5)提高学生的科技论文写作能力。 2.课程设计的任务及要求 1)基本要求: (1)分析LL(1)模块的工作原理; (2)提出程序的设计方案; (3)对所设计程序进行调试。 2)创新要求: 在基本要求达到后,可进行创新设计,如改算法效率。 3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括目录、绪论、正文、小结、参考文献、附录等 (3)课程设计论文装订按学校的统一要求完成 4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程(含翻译):40分; (3)完成调试:20分;

(4)回答问题:20分。 5)参考文献: (1)张素琴,吕映芝,蒋维杜,戴桂兰.编译原理(第2版).清华大学出版社 (2)丁振凡.《Java语言实用教程》北京邮电大学出版社 6)课程设计进度安排 内容天数地点 构思及收集资料2图书馆 编程与调试4实验室 撰写论文1图书馆、实验室 学生签名: 2009 年6 月22 日 课程设计(论文)评审意见 (1)完成原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析(20分):优()、良()、中()、一般()、差();(3)完成调试(20分):优()、良()、中()、一般()、差();(4)翻译能力(20分):优()、良()、中()、一般()、差();(5)回答问题(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否() 评阅人:职称: 年月日

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告 一个简单文法的编译器的设计与实现专业班级:计算机1406班 组长姓名:宋世波 组长学号: 20143753 指导教师:肖桐 2016年12月

设计分工 组长学号及姓名:宋世波20143753 分工:文法及数据结构设计 词法分析 语法分析(LL1) 基于DAG的中间代码优化 部分目标代码生成 组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0) 部分目标代码生成 组员2学号及姓名:孙何奇20143754 分工:符号表组织 部分目标代码生成

摘要 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。 一.编译器的概述 1.编译器的概念 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。 2.编译器的种类 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语

(重庆理工大学计算机学院)编译原理课程设计报告

编译原理课程设计报告 实验名称编译原理课程设计 班级 学号 姓名 指导教师 实验成绩 2013 年06月

一、实验目的 通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。 通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。 二、实验内容 正规式——>NFA——>DFA——>MFA 1.正规式转化为不确定的有穷自动机 (1)目的与要求 通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。 (2)问题描述 任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFA N。 (3)算法描述 对于Σ上的每个正规式R,可以构造一个Σ上的NFA M,使得L(M)=L(R)。 步骤1:首先构造基本符号的有穷自动机。 步骤2:其次构造连接、或和闭包运算的有穷自动机。

(4)基本要求 算法实现的基本要求是: (1) 输入一个正规式r; (2) 输出与正规式r等价的NFA。(5)测试数据 输入正规式:(a|b)*(aa|bb)(a|b)* 得到与之等价的NFA N

(6)输出结果 2.不确定的有穷自动机的确定化 (1)目的与要求 通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。DFA的表现形式可以是表格或图形。(2)问题描述 任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFA N变换为与之等价的DFA D。 (3)算法描述 用子集法将NFA转换成接受同样语言的DFA。 步骤一:对状态图进行改造 (1) 增加状态X,Y,使之成为新的唯一的初态和终态。从X引ε弧到原初态结点, 从原终态结 点引ε弧到Y结点。 (2) 对状态图进一步进行如下形式的改变

《编译原理》课程实验报告(词法分析)完整版

《编译原理》课程实验报告 题目词法分析 专业计算机 指导教师签名 华东理工大学信息学院计算机系 2013年4月10日

一.实验序号:《编译原理》第一次实验 二.实验题目:词法分析 三.实验日期:2013.3.27-2013.4.10 四.实验环境(操作系统,开发语言) 操作系统:Windows 开发语言:C 五.实验要求 ●修改词法: 1)将标识符的词法改为“以大写字母或小写字母开头,后面可以跟大写字母 或小写字母或数字或下划线”。 把while ((isalpha(buffer))||(isdigit(buffer)))改成while ((isalpha(buffer))||(isdigit(buffer))||buffer==’_’) 2)将<条件>中的表示相等关系的单词“=”改为“= =” char *relation[6]={"<","<=","=",">",">=","<>"}; 把其中的=改成==即可 3)将原来无小数的数改为可以有小数的数 把while (isdigit(buffer))改成while (isdigit(buffer)||buffer==’.’) ●用C语言开发词法分析程序。读入用PL/0语言编写的测试用例源程序, 将识别出的一个个单词组成单词流依序同时输出到屏幕和文件中。 六.实验步骤 1)根据修改词法后的PL/0语言编写测试用例源程序。 2)用C语言编写词法分析程序。读入PL/0语言的测试用例源程序,进行 词法分析,将识别出的一个个单词组成单词流依序同时输出到屏幕和文 件中。 3)设立断点,单步运行词法分析程序,依次单个输出单词。分析和理解词 法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。 七.实验结果(测试用例源程序,运行结果部分截图,词法分析函数主要部分源程序 PL0程序: const a=6,b=81; var x,y; procEdure p; procedure q; x:=2; begin

大学编译原理课程复习试题及答案

编译原理复习材料 选择题 1. 文法S→0S | S1 | 0的语言是( )。 A. { 0 m1m| m >=0 } B. { 0 m1m| m >=1 } C. { 0 m1n | m>=1,n>=0 } D. { 0 m1n | m>=0,n>=1 } 2. 描述程序语言所采用的Ⅲ型文法是( )。 A. 短语文法 B.正规文法 C.上下文无关文法 D.上下文有关文法 3. 状态转换图实现的简单方法是使每个状态结对应( )。 A.一个终结符 B.一个非终结符 C.一段小程序 D.一个函数 4. 规范归约的关键问题是寻找( )。 A. 最左素短语 B.句柄 C.直接短语 D.短语 5. 一个算符文法的任何产生式的右部都不含有两个相继的( )。 A.终结符 B.非终结符 C.终结符和非终结符 D.空字 6. 算符优先分析法的关键在于规定( )。 A.算符优先顺序和结合性质 B.算符优先顺序 C.结合性质 D.终结符和非终结符之间关系 7. 优先函数的优点是( )。 A.形象直观 B.便于进行比较运算 C.语法分析速度快 D.语法分析方法简单 8. 文法符号的属性通常分为( )两类。 A. 共用属性和私有属性 B.固有属性和可变属性 C.语法属性和语义属性 D.综合属性和继承属性 9. 在程序流图中,组成循环的结点序列应满足( ) A. 它们是强连通的 B.它们中间有唯一的入口结点 C.它们中间有一条回边 D.它们是强连通的且有唯一的入 口结点 10. 在利用寄存器R生成T1:=C/B的目标代码同时,还应记录信息( )。 A. C/B在T1中 B. T1在C/B中 C. R含有T1, T1在R中 D. R含有C/B, C/B在R中 1.D 2.B 3.C 4.B 5.B 6.A 7.B 8.D 9.D 10.C

编译原理课程设计词法分析(有代码)

《编译原理》课程 实验报告 题目词法分析 专业计算机科学与技术 班级2013级计双班 学号2013708033 姓名刘畅 指导老师郑瑶 石河子大学信息学院计算机系 2014 年11 月20 日

一. 实验序号:《编译原理》词法分析实验 二. 实验题目:词法分析 三. 实验日期: 2014年11月20日 四. 实验环境(操作系统,开发语言) 操作系统:Windows 开发语言:C 五. 实验要求 1)将标识符的词法改为“以大写字母或小写字母开头或下划线开头,后面 可以跟大写字母或小写字母或数字或下划线”。 2)将<条件>中的表示相等关系的单词“=”改为“= =”;增加用于识别自增、 自减、关系运算符、逻辑运算符及逗号运算符的相关语句。 3)将原来无小数的数改为可以识别整数和小数的数。 4)增加识别字符常量和字符串常量的识别。 5)或按C语言要求编写一个完整的用于识别C语言中各类单词的词法分析 程序。 六. 实验步骤 1)用PL/0语言编写测试用例源程序。用C语言编写词法分析程序。 2)运行词法分析程序,读入PL/0语言的测试用例源程序,进行词法分析。 3)设立断点,单步运行词法分析程序,依次单个输出单词。分析和理解词 法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。 4)根据上述“实验要求”修改词法分析程序,同时也应修改PL/0语言测试 用例源程序中的相应的单词。 5)运行修改后的词法分析程序,读入修改后的PL/0语言测试用例源程序, 进行词法分析。 七. 实验结果(测试用例源程序,运行结果截图) 测试用例源程序: const c1=5.61,c2=20,c3='S',c4="abc"; var num1,num2,count,sum1,sum2; procedure func1; var y1,y2; begin y1:=1; y2:=x2 end;

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

编译原理课程设计报告 课题名称:C- Minus词法分析和语法分析设计 提交文档学生姓名:X X X 提交文档学生学号:XXXXXXXXXX 同组成员名单:X X X 指导教师姓名:X X 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2015年6月10日

1.课程设计目标 实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。 2.分析与设计 C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。 2.1 、扫描程序scanner部分 2.1.1系统设计思想 设计思想:根据DFA图用switch-case结构实现状态转换。 惯用词法:

①语言的关键字:else if int return void while ②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 大写和小写字母是有区别的 ④空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM 关键字。 ⑤注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 scanner的DFA

说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。 2.1.2程序流程图

编译原理课设报告2

编译原理课程设计题目:pl/0编译程序的改进与完善 学生所在学院:信息科学与工程学院 学生所在班级:06级计算机软件1班 学生姓名: 学生学号: 指导教师:张世辉

一、课设目的: 1.阅读、研究、改进、设计和调试一个简单的编译程序; 2.加深对编译程序理论和编译过程的理解。 二、课设内容: 1扩充语句for(<语句>;<条件>;<语句>)<语句>; 2扩充语句if <条件> then <语句> else <语句>; 3扩充语句repeat <语句>;until <条件>; 4增加自增自减运算++和—和+=,-=运算; 5修改不等号#,为!=; 6增加一维数组 声明格式:[/:/]; 赋值格式:[]:=<表达式>; 调用格式:[] 三、程序结构: PL/0源程序 图1 编译程序结构图2功能模块调用

1.各功能模块的作用: Pl0.c:主程序 Error:出错处理,打印出错位置和错误编码 Getsym:词法分析,读取一个单词 Getch:漏掉空格,读取一个字符 Gen:生成目标代码,并送入目标程序区 Test:测试当前当前符号是否合法 Block:分程序分析处理过程,词法语法分析 Enter:登陆名字表 Position:查找标识符在名字表中的位置 Constdeclaration:常量定义处理 Vardeclaraction:变量说明处理 Listcode:列出目标代码清单 Statement:语句处理 Expression:表达式处理 Term:项处理 Factor:因子处理 Condition:条件处理 Interpret:对目标代码的解释执行程序 Base:通过静态链求出数据取得基地址 增加两个功能: Arraydeclaration:数组声明处理 Arraycoef:数组索引计算和“虚拟机”动作生成 2.保留字: enum symbol {nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen, rparen, comma, semicolon, period, becomes, beginsym, endsym, ifsym, thensym,elsesym, forsym, inc, dec, whilesym, writesym, readsym, dosym, callsym, constsym,varsym, procsym, repeatsym, untilsym, plusbk, minusbk, lbrack, rbrack, colon,} 共43个,其中补充保留字为:else, for, repeat, until, plusbk, minusbk,

编译原理-课程设计报告-简单编译器实现-精品

课程设计 题目:简单编译器实现 学院:信息工程学院计算机系专业:计算机科学与技术班级:计科1103班 组长: 小组成员: 指导教师: 2014 年12 月19 日

目录 1 概述 (3) 1.1源、目标语言简介 (3) 1.2实现平台与运行平台简介 (3) 1.3其它 (4) 2简单词法分析器的设计与实现 (4) 2.1 基础理论说明 (4) 2.2 需求分析 (4) 2.3 概要设计 (5) 2.4 详细设计 (5) 2.5 测试数据与结果 (7) 2.6 心得体会 (7) 3 简单语法分析器设计与实现 (8) 3.1 基础理论说明 (8) 3.2 需求分析 (8) 3.3 概要设计 (8) 3.4 详细设计 (8) 3.5 测试数据与结果 (9) 3.6 心得体会 (10) 4 中间代码产生器的设计与实现 (10) 4.1 基础理论说明 (10) 4.2 需求分析 (10) 4.3 概要设计 (10) 4.4 详细设计 (11) 4.5 测试数据与结果 (12) 4.6 心得体会 (12) 附录: (14) 附录A:主要源程序与系统截图 (14) 附录B:任务分配表及个人完成的程序模块 (33) 附录C:小组讨论与研发记录 (34)

编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。 其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。针对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可以同时使用。语法分析器把语法单元作为输入供语义分析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。上面三个过程可以与硬件无关,而接下来的优化器和目标代码生成器是针对某一种处理器而言的。代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代码。目标代码生成器最终生成可以在某种机器上运行的机器语言或者汇编语言。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。 1.1源、目标语言简介 使用C语言做简单语法分析器,C语言是一门高级计算机编程语言,设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言 1.2实现平台与运行平台简介 在win32环境下进行编译,Win32是指Microsoft Windows操作系统的32位环境,是目前使用最多的操作系统。 实验环境:需要TC、VC++ 6.0等开发工具作为本次试验的环境。

编译原理课程设计

先简要分析一下语法分析的大致流程: 当有句子要进行处理时,首先要对其进行词法分析来分解出该句子中的每个符号,然后将该句子按照算符优先算法压入归约栈中,如果可以顺利归约,则说明这是一个合法的句子,否则该句子非法。 这里有一个需要考虑的地方,就是如何进行归约。由于文法已经给定,所以我们考虑设计一个文法表,文法表中的内容就是可归约串的种别码的顺序,比如v=E可以表示为9,1,13。这样的话当我们要进行一次归约时,只用按顺序存储最左素短语中符号的种别码,然后拿这个种别码序列与文法表进行匹配,就可知道当前归约需要执行哪些操作。 还有一点需要注意,就是如何对一个表达式进行求值。这里需要我们设计一个二元组的变量名表,这个变量名表可以根据变量的名称来返回变量的数据。变量名表的具体设计见详细设计部分。 由于是简化分析,所以这个程序只考虑整数的处理。 有了上面的分析,可以构造出算符优先分析算法的流程图,如下图所示。

详细设计 (1)词法分析部分 由于词法分析的内容在课程设计1中已经介绍,并且这次的状态转换图与课程设计1中的非常相似,所以这里就不过多介绍。(2)优先关系表 在程序中我们用一个二维数组priTable[][]来存储算符间的优先关系。priTable[a][b]=1表示a>b; 。priTable[a][b]=0表示a=b; 。priTable[a][b]=-1表示a

编译原理课程设计实验报告-(川大张兵)

编译原理课程设计实验报告-(川大张兵)

编译原理课程设计报告 课题名称: C-词法扫描器及语法分析器实现 提交文档学生姓名:刘佳玉 提交文档学生学号: 2012141461134 同组成员名单:无 指导教师姓名:张兵 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间: 2015 年 6 月 10 日

1、课程设计目标 学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C或C++语言描述及上机调试,实现一个C-Minus 小编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。 要求:实现scanner和parser功能 2、分析与设计 2.1程序结构 语法分析采用递归下降方法的程序结构: 本程序采用面向对象的思想编写,使用C语言实现,程序分为两部分:词法分析(scan)和语法分析(parse),分别将两个处理阶段写在两个函数中,分别是scan()和parse(),两个函数分别完成词法分析和语法分析的任务。scan()函数主要的工作是检查注释是否合法、词法分析获取token。parse()函数的主要工作是根据scan()词法分析之后的token进行语法分析,生成语法树,最后并输出语法树。

2.2程序流程 递归下降方法的程序流程图 2.3词法分析 2.3.1代码结构分析 词法分析阶段的代码写在一个函数中——scan()。main函数读取程序数据,将其存储在一

个二维数组中,调用函数zhushierror(),确定程序是否存在注释错误,注释的错误主要是注释的符号不匹配。如果不存在注释错误,则调用scan()函数进行词法分析,否则报错。词法分析是对输入的数据一个字符一个字符的分析,将所分析出来的token存储在一个vector数组中,方便后面语法分析时调用。词法分析没有什么错误限制,基本不会报错。所以在分析的同时,就会将所分析出的token输出 2.3.2token定义和类型 token结构体定义如下: struct token//token结构体 { Tokentype tokentype;//token类型 char tokenstring[1100];//token串 int lineno;//token行号 }; token类型: //定义的T oken的类型(29种),分别对应于else、if、int、return、void、while、 //+、-、*、/、<、<=、>、>=、==、 /////!=、=、;、,、(、)、[、]、{、}、num、id、错误、结束

编译器_编译原理课程设计报告书

广西大学 编译原理课程设计 专业:计算机科学与技术 姓名: 课程:编译原理 指导教师:

目录 一.程序简介与分析---------------------------------------------------------1 二.程序适用围-----------------------------------------------------------1 三.词法分析---------------------------------------------------------------1 四.语法分析---------------------------------------------------------------3 五.语义分析和中间代码生成------------------------------------------------9 六.代码生成--------------------------------------------------------------11 七.流程图----------------------------------------------------------------12 八.实现------------------------------------------------------------------13 九.程序运行结果----------------------------------------------------------13 十.总结------------------------------------------------------------------18 十一.附录(源程序)--------------------------------------------------------19

编译原理课程设计报告

《编译原理》 课程设计报告 姓名:熊齐超(1208060220) 姓名:刘畅(1208060221) 姓名:袁青伟(1208060222) 姓名:张文(1208060223) 班级:软件121班 专业:软件工程 指导教师:陈晓明 时间:2015/6/14 项目名称:算术表达式的语法及语义分析 贵州大学计算机科学与信息学院

目录 一、课程设计目的 (3) 二、课程设计题目描述和要求 (3) 1、算术表达式的文法的描述: (3) 2、课程设计的要求描述: (3) 3、实现的功能描述: (4) 4、分析器的使用描述 (4) 三、课程设计实现描述 (4) 1、实现平台 (4) 2、课程设计的基本思路描述 (5) 3、自顶向下与递归下降分析方法的基本原理描述 (5) 4、程序运行的最后界面 (6) 5、演示分析 (8) 四、课程设计总结 (8) 五、参考文献及小组分工 (9) 六、核心代码 (10)

一、课程设计目的 通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。加深对文法分析器的知识的掌握,掌握计算机语言的语法分析的过程。以及掌握计算机语言的语法分析程序设计与文法应用的实现方法。能够熟练运用一种分析方法,自上而下或自下而上的方法分析一个给定的文法,我使用的是自上而下的分析方法。以及通过思考以及动手制作分析器的过程来锻炼自己的编程能力和逻辑思维能力,体会计算机编译器的奥妙之处。 二、课程设计题目描述和要求 1、算术表达式的文法的描述: 〈无符号整数〉∷=〈数字〉{〈数字〉} 〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉} 〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷=〈标志符〉|〈无符号整数〉 〈加法运算符〉∷=+|- 〈乘法运算符〉∷=*|/ 〈字母〉∷= a | b | … | z 〈数字〉∷= 0 | 1 | … | 9 2、课程设计的要求描述: 1)在递归下降法、LL(1)、算符优先分析法或者LR法中选择其中一种方法完成以上任务,中间代码选用四元式。 2)编制分析程序,设计若干用例,并上机测试。 3)书写课程设计报告。

编译原理课程设计参考选题

《编译原理》是计算机专业的一门重要的专业课程,其中包含大量软件设计思想。大家通过课程设计,实现一些重要的算法,或设计一个完整的编译程序模型,能够进一步加深理解和掌握所学知识,对提高自己的软件设计水平具有十分重要的意义。大家在进行课程设计时,可从所学内容中选择某个主题,抽象成一个模型,可适当进行简化。也可按提供给大家的一些参考选题进行设计。软件开发选择C/C++语言(也可以是你熟悉的任何语言)。最后每位同学都要认真撰写设计报告,格式要规范,内容要详尽 ,包括: 设计题目,设计目的,设计内容,设计要求,问题的描述及解决的方法、原理、思想、算法(流程图),设计的输入和输出形式,测试、模拟的结果(屏幕拷贝、生成结果的打印输出),总结(体会),源程序清单,等等。 大家应把该门课的课程设计当成对自己学习效果的一次检验,当成是为在大四能够顺利完成毕业设计的一次基本功训练。希望每个同学尽可能不要都选择完全一样的题目。大家可以自主选题,或选择我提供的题目,也可以把几个题目合起来做(如开发一个小的编译器)。鼓励选择有一定技术难度、有一定工作量、综合性较强的题目,在评定成绩时将会给予好的成绩。 编译原理课程设计部分参考选题: 1.题目: FORTRAN语言实型常数识别程序设计 设计内容及要求: 将教材P.41的图 3.2(d)识别FORTRAN实型常数的状态转换图用程序实现。程序能够从用户输入的任意一个字符串中识别出FORTRAN实型常数,显示输出。 2.题目: 简化的FORTRAN语言词法分析程序设计

设计内容及要求: 将教材P.42上的表 3.1的词法分析器构造出来,限制条件如教材所述。保留字的识别按标识符一样识别,通过查找保留字表区分是保留字还是标识符。程序能够从用户输入的源程序中,识别出的单词符号,并用二元式表示,显示输出或输出到文件中。 3.题目: ε-CLOSURE(I)构造算法的程序实现 设计内容及要求: 将ε-CLOSURE(I)构造算法用程序实现。要求: 对任意 4.题目: 从右线性文法构造与之等价的有限自动机的程序实现 设计内容及要求: 构造一转换程序,实现将用户任意给定的右线性文法,转换为与之等价的有限自动机FAM,输出其状态转换矩阵(显示输出或输出到文件中)。 5.题目: 从有限自动机构造与之等价的右线性文法的程序实现 设计内容及要求: 构造一转换程序,实现将用户任意给定的有限自动机FAM,转换为与之等价的右线性文法,显示输出或输出到文件中。 6.题目:

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

北华航天工业学院 《编译原理》课程实验报告 课程实验题目:词法分析器实验 作者所在系部:计算机科学与工程系作者所在专业:计算机科学与技术 作者所在班级:B08512 作者学号:18 作者姓名:李桂丁 指导教师姓名:李建义 完成时间:2010年3月26日

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

相关文档
相关文档 最新文档