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

  • 格式:doc
  • 大小:2.47 MB
  • 文档页数:79

下载文档原格式

  / 79
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

编译原理课程设计报告

课题名称: 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、错误、结束

typedef enum

{

elsee=1,iff,intt,returnn,voidd,whilee,xiaoyudengyu,day udengyu,dengyudengyu,budengyu,//10

jia,jian,cheng,chu,dayu,xiaoyu,dengyu,fenhao,douhao, zuokuohao,youkuohao,zuozhongkuohao,//22

youzhongkuohao,zuohuakuohao,youhuakuohao,num, id,error,end//29

}Tokentype;

2.3.3DNF分析

词法分析的DFA描述:

词法分析的DFA如下所示,一共分为5个状态:START、INNUM、INID、INDBSYM、DONE。状态START 表示开始状态,状态INNUM表示数字类型(NUM)Token的状态,状态INID表示字符串类型Token 的状态(如关键字和一般的标示符),状态INDBSYM 表示双目运算符型Token的状态(如<=、>=、!=、==),状态DONE表示接收状态。

2.4语法分析

2.4.1代码结构分析

语法分析阶段的代码中,每一条文法都有相对应的函数,通过函数之间的递归调用来达到语法分析的目的。语法分析的过程主要是:在语法分析之前进行词法分析,然后通过递归向下分析法根据C-语言的文法进行语法分析,并生成语法树,最后打印语法树。

下面是语法分析所用到的全局变量和函数的声明:

token currenttoken;//当前token

token lasttoken;//上一个token

int tokenxb=0;//token下标

int blank=0;//先行空格

void gettoken();//得到token

void parseerror();//输出错误

void match(Tokentype tt);//匹配

treenode * compound_stmt();//函数声明

void printspace(int n);//打印空格

void printtree(treenode * t);//打印语法分析树

treenode * newnode(Nodekind kind);//创建新节点

treenode * args();

treenode * call(treenode * k);//函数调用

treenode * factor(treenode * k);

treenode * term(treenode * k);

treenode * additive_expression(treenode * k);//加成的表达式

treenode * simple_expression(treenode * k);//简单表达式

treenode * varr();

treenode * expression();

treenode * expression_stmt();//表达式声明