文档库 最新最全的文档下载
当前位置:文档库 › 编译原理课程设计实验报告 (川大张兵)

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

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

编译原理课程设计报告

课题名称: C-词法扫描器及语法分析器实现

提交文档学生姓名:刘佳玉

提交文档学生学号: 2012141461134 同组成员名单:无

指导教师姓名:张兵

指导教师评阅成绩:

指导教师评阅意见:

.

.

提交报告时间: 2015 年 6 月 10 日

目录

编译原理课程设计报告 (1)

1、课程设计目标 (2)

2、分析与设计 (2)

2.1程序结构 (2)

2.2程序流程 (3)

2.3词法分析 (3)

2.3.1代码结构分析 (3)

2.3.2token定义和类型 (4)

2.3.3DNF分析 (4)

2.4语法分析 (5)

2.4.1代码结构分析 (5)

2.4.2节点定义和类型 (5)

2.4.3递归下降语法分析 (6)

3、测试结果 (11)

3.1流程 (11)

3.2出错情况 (15)

4、总结 (15)

4.1收获 (15)

4.2特色 (15)

4.3不足 (16)

5、程序代码实现 (16)

5.1递归下降源代码 (16)

5.2C-文法 (67)

1、课程设计目标

学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C或C++语言描述及上机调试,实现一个C-Mi nus 小编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。

要求:实现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 tokenstri ng[1100];//token 串 i nt lineno;//token 行号 };

token 类型:

//定义的Token 的类型(29种),分别对应于el se 、i f 、int 、return 、void 、while 、 //+、-、*、/、<、<=、>、>=、==、

/////!=、=、;、,、(、)、[、]、{、}、num 、id 、错误、结束 typedef enum {

el see=1,i ff,intt,returnn,voidd,whilee,xi aoyudengyu,dayudengyu,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 表示接收状态。

START

INDBSYM

INID

d i g i t letter

letter

digit

other

[o t h

e r ]

[other]

[o t h e

r ]>

INNUM

DONE

white space

=

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();//表达式声明

treenode * return_stmt();//返回式声明

treenode * iteration_stmt();//while声明

treenode * selection_stmt();//if声明

treenode * statement();//复合语句后者种类

treenode * statement_list();//复合语句体后者

treenode * local_declaration();//复合语句体前者

treenode * param(treenode * k);//函参

treenode * param_list(treenode * k);//函参列表

treenode * compound_stmt();//函数内容,复合语句

treenode * params();//函数参数

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

treenode * declaration_list();//多个函数列表

treenode * parse();//语法分析

2.4.2节点定义和类型

节点定义:

struct treenode//树节点结构体

{

treenode * child;//子节点

treenode * brother;//兄弟节点

i nt lineno;//所在行

Nodekind nodekind;//节点类型

char nodestring[1100];//节点类型所代表的字符串,用于语法树打印

};

节点类型:

//19种节点类型,分别表示int、i d、void、数值、变量声明、数组声明、函数声明、

//函数声明参数列表、函数声明参数、复合语句体、i f、while、return、赋值、运算、

//数组元素、函数调用、函数调用参数列表、未知节点

typedef enum

{

i nts,i ds,voi ds,nums,var,shuzu,hanshu,hancanli st,hancan,fuheyuju,i fs,whiles,returns,

fuzhi,yunsuan,shuzuyuansu,hanshudiaoyong,hanshudiaoyongcanli st,unknown

}Nodekind;//节点种类

2.4.3递归下降语法分析

2.4.

3.1C-语法

program→declaration-list

declaration_list → declaration{ declaration }

declaration→var-declaration|fun-declaration

var_declaration →type-specifier ID; | type-specifier ID [NUM];

type - specifier → int | void

fun-declatation→type-specifier ID (params) | compound-stmt

params→param_list | void

param_list→param{, param}

param→ type-specifier ID{[ ]}

compound-stmt→{ local-declaration statement-list}

local-declarations → empty {var- declaration}

statement-list→{statement}

statement→expression-stmt | compound-stmt | selection-stmt | iteration-stmt | return-stmt expression-stmt→ [expression];

selection-stmt→if (expression) statement [else statement]

iteration-stmt→while (expression)statement

return-stmt→return [expression];

expression→ var = expression | simple-expression

relop → < = | < | > | > = | = = | ! =

var→ID | ID [expression]

simple-expression->additive-expression{ relop additive-expression }

additive-expression→term{addop term }

addop → + | -

term→factor{mulop factor }

mulop →* | /

factor→(expression) | var | call | NUM

call→ID( args )

args→arg-list | empty

arg-list→ expression{, expression}

2.4.

3.2递归下降语法分析过程

以下表格列出了根据上文中的C-文法使用递归向下分析方法分析程序的过程,在代码部分只列出了函数名,具体函数见源代码。

待分析文法program→declaration-list

分析函数treeNode * parse()

分析说明C-语言编写的程序由一组声名序列组成。parse(void)函数使用递归向下分析方法直接调用declaration_list()函数,并返回树节点

代码treenode * parse()

待分析文法declaration_list → declaration{ declaration }分析函数treenode * declaration_list()

分析说明C-语言编写的程序由一组声名序列组成。declaration_list(void)函数使用递归向下分析方法直接调用declaration()函数,并返回树节点

代码treenode * declaration_list()

待分析文法declaration→var-declaration|fun-declaration

var_declaration →type-specifier ID; | type-specifier ID [NUM]; fun-declatation→type-specifier ID (params) | compound-stmt type - specifier → int | void

分析函数treenode * declaration()

分析说明C-语言的声明分为变量声明和函数声明。declaration(void)函数并不是直接调用var-declaration或fun-declaration文法所对应的函数,令其返回节点,实际上程序并没有为var-declaration和fun-declaration文法定义函数,而是在declaration(void)函数中,通过求First集合的方式先确定是变量定义还是函数定义,然后分别根据探测的结果生成变量声明节点(Var_DeclK)或函数声明节点(FunK)。所以var-declaration和fun-declaration文法在declaration→var-declaration|fun-declaration文法中就都已经分析了

代码treenode * declaration()

待分析文法params→param_list | void 分析函数treenode * params()

分析说明函数参数列表要么是void,要么是多个参数组成。params(void)函数先判断第一个是void还是int,如果是int说明是由param_list组成,则调用param_list(TreeNode * k)函数递归向下分析;如果是void说明可能是void型的参数,也可能参数就是void,所以再求其Follow集合,如果集合求出来是右括号,则说明参数就是void,于是新建一个VoidK 节点就行;如果集合求出来不是右括号则说明是void型的参数,然后再调用param_list(TreeNode * k)函数递归向下分析,并将已经取出VoidK节点传递给

待分析文法param_list→param{, param}

分析函数treenode * param_list(treenode * k)

分析说明参数列表由param序列组成,并由逗号隔开。param_list(TreeNode * k)函数使用递归向下分析方法直接调用param(TreeNode * k)函数,并返回树节点

代码treenode * param_list(treenode * k)

待分析文法param→ type-specifier ID{[ ]}

分析函数treenode * param(treenode * k)

分析说明参数由int或void、标示符组成,最后可能有中括号表示数组。param(TreeNode * k)函数根据探测先行Token是int还是void而新建IntK或VoidK节点作为其第一个子节点,然后新建IdK节点作为其第二个子节点,最后探测Follow集合,是否是中括号,而确定是否再新建第三个子节点表示数组类型

代码treenode * param(treenode * k)

待分析文法compound-stmt→{ local-declaration statement-list} 分析函数treenode * compound_stmt()

分析说明复合语句由用花括号围起来的一组声明和语句组成。compound_stmt(void) 函数使用递归向下分析方法直接调用local_declaration()函数和statement_list()函数,并根据返回的树节点作为其第一个子节点和第二个子节点

代码treenode * compound_stmt()

待分析文法local-declarations →empty {var- declaration}分析函数treenode * local_declaration()

分析说明局部变量声明要么是空,要么由许多变量声明序列组成。local_declaration(void)函数通过判断先行的Token是否是int或void便可知道局部变量声明是否为空,如果不为空,则新建一个变量定义节点(Var_DeclK)

代码treenode * local_declaration()

待分析文法statement-list→{statement}

分析函数treenode * statement_list()

分析说明由语句列表由0到多个statement组成。statement_list(void)函数通过判断先行Token类型是否为statement的First集合确定后面是否是一个statement,如果是,则使用递归向下分析方法直接调用statement()函数

代码treenode * statement_list()

待分析文法statement→expression-stmt | compound-stmt | selection-stmt | iteration-stmt | return-stmt

分析函数treenode * statement()

分析说明statement由表达式或复合语句或if语句或while语句或return语句构成。statement(void)函数通过判断先行Token类型确定到底是哪一种类型。如果是IF则是if 语句类型,如果是WHILE,则是while语句类型,如果是RETURN,则是return语句类型,如果是左大括号,则是复合语句类型,如果是ID、SEMI、LPAREN、NUM,则是表达式语句类型

代码treenode * statement()

待分析文法expression-stmt→ [expression];

分析函数treenode * expression_stmt()

分析说明表达式语句有一个可选的且后面跟着分号的表达式。expression_stmt(void)函数通过判断先行Token类型是否为分号,如果不是则直接调用函数expression()

代码treenode * expression_stmt()

待分析文法selection-stmt→if (expression) statement [else statement]分析函数treenode * selection_stmt()

分析selection_stmt(void)函数直接调用expression()函数和statement()函数分别得到其第一个和第二个子节点,然后通过判断先行Token类型是否为ELSE,如果是则直接调用statement()函数得到其第三个子节点

代码treenode * selection_stmt()

待分析文法iteration-stmt→while (expression)statement 分析函数treenode * iteration_stmt()

分析iteration_stmt(void)函数直接调用expression()函数和statement()函数分别得到其第一个和第二个子节点

代码treenode * iteration_stmt()

待分析文法return-stmt→return [expression];分析函数treenode * return_stmt()

分析return_stmt(void)函数通过判断先行Token类型是否为分号,如果不是则直接调用函数expression()得到其子节点

代码treenode * return_stmt()

待分析文法expression→ var = expression | simple-expression 分析函数treenode * expression()

分析expression(void)函数通过判断先行Token类型是否为ID,如果不是说明只能是simple_expression情况,则调用simple_expression(TreeNode * k)函数递归向下分析;如果是ID说明可能是赋值语句,或simple_expression中的var和call类型的情况,所以再求其Follow集合,如果集合求出来是赋值类型的Token,则说明是赋值语句,于是新建一个AssignK节点就行;如果集合求出来不是赋值类型的Token则说明是simple_expression 中的var和call类型的情况,然后再调用simple_expression(TreeNode * k)函数递归向下分析,并将已经取出IdK节点传递给simple_expression(TreeNode * k)函数

代码treenode * expression()

待分析文法var→ID | ID [expression]分析函数treenode * varr()

分析varr(void)函数先新建一个IdK节点,再通过判断先行Token类型是否为左中括号,如果是则新建一个数组节点Arry_ElemK,将IdK作为Arry_ElemK节点的第一个子节点,再直接调用函数expression()得到Arry_ElemK的第二个子节点,最后返回的节点时Arry_ElemK;如果先行Token类型不是左中括号,则将之前的IdK返回

代码treenode * varr()

待分析文法simple-expression->additive-expression{ relop additive-expression } relop →< = | < | > | > = | = = | ! =

分析函数treenode * simple_expression(treenode * k)

分析simple_expression(TreeNode * k)函数先调用additive_expression(TreeNode * k)函数返回一个节点,然后再一直判断后面的Token是否为<=、<、>、>=、==、!=,如果是则新建OpK节点,然后令之前的节点为其第一个子节点,然后继续调用additive_expression(TreeNode * k)函数返回一个节点,作为OpK节点的第二个节点

代码treenode * simple_expression(treenode * k)

待分析文法additive-expression→term{addop term } addop →+ | -

分析函数treenode * additive_expression(treenode * k)

分析additive_expression(TreeNode * k)函数先调用term(TreeNode * k)函数返回一个节点,然后再一直判断后面的Token是否为+或-,如果是则新建OpK节点,然后令之前的节点为其第一个子节点,然后继续调用term(TreeNode * k)函数返回一个节点,作为OpK节点的第二个节点

代码treenode * additive_expression(treenode * k)

待分析文法term→factor{mulop factor } mulop →* | /

分析函数treenode * term(treenode * k)

分析term(TreeNode * k)函数先调用factor(TreeNode * k)函数返回一个节点,然后再一直判断后面的Token是否为*或/,如果是则新建OpK节点,然后令之前的节点为其第一个子节点,然后继续调用actor(TreeNode * k)函数返回一个节点,作为OpK节点的第二个节点

代码treenode * term(treenode * k)

待分析文法factor→(expression) | var | call | NUM 分析函数treenode * factor(treenode * k)

分析factor(TreeNode * k)函数首先判断k是否为空,如果不为空,则k为上面传下来的已经解析出来的以ID开头的var,此时可能为call或var的情况,然后判断后面的Token是否为左括号,如果是则说明是call的情形,如果不是则为var的情形。如果k为空,再根据先行的Token类型判断是4中推导中的哪一种,然后直接调用相关的函数返回一个节点

代码treenode * factor(treenode * k)

待分析文法call→ID( args )

分析函数treenode * call(treenode * k)

分析call(TreeNode * k)函数新建一个call语句的节点CallK,如果k不为空,则将k设为CallK 的第一个子节点,然后通过调用args(void)函数获得其第二个节点,最后返回CallK节点

代码treenode * call(treenode * k)

待分析文法args→arg-list | empty

arg-list→ expression{, expression}

分析函数treenode * args()

分析

factor(TreeNode * k)函数首先判断后面的Token是否为右括号,如果是则说明是

empty的

情形,如果不是则为至少有一个expression的情形,然后调用expression()函数返回节点,

然后一直判断后面的Token是否为逗号,如果是则说明后面还有一个expression,则再调用

expression()函数,使各expression返回的节点为兄弟节点,然后再将第一个expression

返回的节点作为函数调用语句参数节点ArgsK的子节点

代码treenode * args()

3、测试结果

3.1流程

测试数据:

测试结果:

词法分析:

语法分析:

3.2出错情况

若注释没有结束符号:

则提示删除注释出错

若含有未知Token:比如char

则语法分析出错

4、总结

4.1收获

在本次课程设计中增加了自己的动手能力,锻炼了构造一个项目的框架方法,能够很好的给出系统的框架,并且能够按照程序流程进行程序的编写。能够灵活运用递归下降的方法进行分析问题,在词法分析中掌握了状态机的转变,同时能够熟练运用状态机进行字符的匹配。在语法分析中,学习到了怎么样通过文法构建代码,以及根据文法编写代码带来的相关问题,如左递归,节点的定义等。

特别是在写语法分析器的时候,已经对编译器的语法分析的内容有了一定的了解,所以直接进行了理论的学习。首先自己对递归向下分析法进行了学习,将书上的几个递归向下分析的伪代码看过之后,自己对递归向下的分析方法的原理有了初步的认识,大概知道了根据文法怎么分析。但是由于C-语言给出的文法有左递归存在,于是自己将存在左递归的文法改写成EBNF的形式,并据此进行代码编写。整个过程可以说是痛并快乐着,一方面自己在编写代码的时候遇到了很多问题,这也是自己动手能力不足的一个表现。

4.2特色

在词法分析方面,使用全局变量zs来判断当前字符是否是注释,并且通过zs的值判断注释是否合法。

整体来说,代码简介明了,没有复杂的类的关系,树节点只有孩子和兄弟两个子节点,没有复杂的节点

之间的关系。

4.3不足

由于各函数之间逻辑关系比较复杂,代码还存在一些错误,需要通过测试来修复bug 5、程序代码实现

5.1递归下降源代码

#include

#include

#include

#include

#include

#include

#include

using namespace std;

char s[1005][1005];//文本

char p[1005][1005];

char t[1005];//当前token串

char linshi[1100];//临时数组

int k;//文本行数

int zs;//注释标记,1表示是注释,0表示不是注释

void zhushierror()//注释错误

{

int i,j,len;

zs=0;

for(i=0;i

{

len=strlen(s[i]);

for(j=0;j

{

if(s[i][j]=='/'&&s[i][j+1]=='*') {

if(zs==0)

{

zs=1;

}

else

{

return;

}

}

if(s[i][j]=='*'&&s[i][j+1]=='/') {

if(zs==1)

{

zs=0;

}

else

{

zs=1;

return;

}

}

}

}

}

//定义的Token的类型(29种),分别对应于else、if、int、return、void、while、

//+、-、*、/、<、<=、>、>=、==、

/////!=、=、;、,、(、)、[、]、{、}、num、id、错误、结束

typedef enum

{

elsee=1,iff,intt,returnn,voidd,whilee,xiaoyudengyu,dayudengyu,dengyudengyu,budeng yu,//10

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

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

}Tokentype;

struct token//token结构体

{

Tokentype tokentype;//token类型 char tokenstring[1100];//token串 int lineno;//token行号

};

Tokentype gettokentype(char c[]) {

Tokentype to;

if(!strcmp(c,"else"))

{

to=elsee;

}

else if(!strcmp(c,"if"))

{

to=iff;

}

else if(!strcmp(c,"return"))

{

to=returnn;

}

else if(!strcmp(c,"int"))

{

}

else if(!strcmp(c,"void")) {

to=voidd;

}

else if(!strcmp(c,"while")) {

to=whilee;

}

else if(!strcmp(c,"+"))

{

to=jia;

}

else if(!strcmp(c,"-"))

{

to=jian;

}

else if(!strcmp(c,"*"))

{

to=cheng;

}

else if(!strcmp(c,"/"))

{

编译原理课程设计

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

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

编译原理课程设计

<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语言也允许递归调用,既可以间接递归,也可以直接递归。

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

编译原理程序设计报告 一个简单文法的编译器的设计与实现专业班级:计算机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) 对状态图进一步进行如下形式的改变

编译原理课程设计报告_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)格式规范性及考勤是否降等级:是()、否() 评阅人:职称: 年月日

编译原理课程设计

编译原理课程设计报告 课题名称: 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:

编译原理课程设计

编译原理课程设计 自顶向下语法分析器 学院(系):计算机科学与技术学院学生姓名:xxxxxxxxx 学号:xxxxxxxxx 班级:电计1102 大连理工大学 Dalian University of Technology

目录

1 系统概论 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。语法分析器在编译程序中的地位如图1所示: 图1 语法分析器在编译程序中的地位 语言的语法结构是用上下文无关文法描述的。因此,语法分析器的工作本质上就是按文法的产生式,识别输入符号串是否为一个句子。这里所说的输入串是指由单词符号(文法的终结符)组成的有限序列。对一个文法,当给你一串(终结)符号时,怎样知道它是不是该文法的一个句子呢?这就要判断,看是否能从文法的开始符号出发推导出这个输入串。或者,从概念上讲,就是要建立一棵与输入串相匹配的语法分析树。 自顶向下分析法就是语法分析办法中的一类。顾名思义,自顶向下就是从文法的开始符号出发,向下推导,推出句子。这种方法是带“回溯”的。 自顶向下分析的主旨是,对任何输入串,试图用一切可能的办法,从文法开始符号(根结)出发,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。这种分析过程本质上是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。 实现这种自顶向下的带回溯试探法的一个简单途径是让每个非终结符对应一个递归子程序。每个这种子程序可作为一个布尔过程。一旦发现它的某个候选与输入串相匹配,就用这个候选去扩展语法树,并返回“真”值;否则,保持原来的语法树和IP值不变,并返回“假”值。 2 需求分析 以前,人们对语法的分析都建立在人工的基础上,人工分析虽然能够做到侧类旁推,但终究人力有限,再精密的分析都会出现或多或少的错误。为减少因人为产生的错误,并加快

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程序流程图

编译原理课程设计-词法分析器(附含源代码)

编译原理-词法分析器的设计 一.设计说明及设计要求 一般来说,编译程序的整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。本课程设计即为词法分析阶段。词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。如保留字(关键字或基本字)、标志符、常数、算符和界符等等。 二.设计中相关关键字说明 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个)(单词种别分别为1 — 32 ,详情见程序代码相关部分,下同) (2)能识别C语言中自定义的标示符(单词种别为 33) (3)能识别C语言中的常数(单词种别为0) (4)能识别C语言中几乎所有运算符(单词种别分别为41 — 54) (5)能识别C语言中绝大多数界符(单词种别分别为 55 — 66)六、运行结果 输入文件infile.txt 运行结果(输出文件 outfile.txt)

编译原理课程设计----C语言编译器的实现

$ 编译原理课程设计报告 设计题目编译代码生成器设计 、 学生姓名 班级 学号 指导老师 成绩 `

一、课程设计的目的 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。 二、课程设计的要求 1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。 2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正 确。 3、@ 4、写出完整的算法框架。 5、编写完整的编译程序。 三、课程设计的内容 课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。 四、总体设计方案及详细设计 总体设计方案: 1.总体模块

【 2. \ 详细设计: 界面导入设计 (1)一共三个选项: ①choice 1--------cifafenxi ②choice 2--------yufafenxi ③choice 3--------zhongjiandaima (2)界面演示 } 图一

编译原理课程设计报告

2011-2012学年第二学期 《编译原理》课程设计报告 学院:计算机科学与工程学院 班级: 学生姓名:学号: 成绩: 指导教师: 时间:2012年5 月

目录 一、课程设计的目的 ---------------------------------------------------------------- - 1 - 二、课堂实验及课程设计的内容 -------------------------------------------------- - 1 - 2.1、课堂实验内容-------------------------------------------------------------- - 1 - 2.2、课程设计内容-------------------------------------------------------------- - 1 - 三、visual studio 2008 简介------------------------------------------------------- - 2 - 四、问题分析及相关原理介绍 ----------------------------------------------------- - 3 - 4.1、实验部分问题分析及相关原理介绍 ---------------------------------- - 3 - 4.1.1、词法分析功能介绍及分析------------------------------------- - 3 - 4.1.2、语法分析功能介绍及分析------------------------------------- - 3 - 4.1.3、语义分析功能介绍及分析------------------------------------- - 4 - 4.2、课程设计部分问题分析及相关原理介绍 ---------------------------- - 5 - 4.2.1、编译程序介绍 ----------------------------------------------------- - 5 - 4.2.2、对所写编译程序的源语言的描述(C语言) -------------- - 6 - 4.2.3、各部分的功能介绍及分析 -------------------------------------- - 7 - 4.3、关键算法:单词的识别-------------------------------------------------- - 8 - 4.3.1、算法思想介绍 ----------------------------------------------------- - 8 - 4.3.2、算法功能及分析 -------------------------------------------------- - 8 - 五、设计思路及关键问题的解决方法 ------------------------------------------ - 10 - 5.1、编译系统------------------------------------------------------------------ - 10 - 5.1.1、设计思路 --------------------------------------------------------- - 10 - 5.2、词法分析器总控算法--------------------------------------------------- - 12 - 5.2.1、设计思路 --------------------------------------------------------- - 12 - 5.2.2、关键问题及其解决方法 --------------------------------------- - 13 - 六、结果及测试分析-------------------------------------------------------------- - 14 - 6.1、软件运行环境及限制--------------------------------------------------- - 14 - 6.2、测试数据说明------------------------------------------------------------ - 14 - 6.3、运行结果及功能说明--------------------------------------------------- - 16 - 6.4、测试及分析说明--------------------------------------------------------- - 16 - 七、总结及心得体会 --------------------------------------------------------------- - 17 - 7.1、设计过程------------------------------------------------------------------ - 17 - 7.2、困难与收获 ------------------------------------------------------------- - 17 - 八、参考文献 ------------------------------------------------------------------------ - 18 -

编译原理课程设计

编译原理: 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。编译原理是计算机专业设置的一门重要的专业课程。编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象。 编译原理课程设计: 《编译原理课程设计》是2007年11月浙江大学出版社出版的图书,作者是冯雁、鲁东明、李莹。 内容简介: 本书围绕着编译技术的基本原理和方法,以模拟程序设计语言SPL的编译器的设计和实现为主线,结合词法分析、语法分析、语义分析、代码生成、代码优化、错误处理等各个基本模块,对原理和实现方法进行了详细分析。该编译器可接受SPL的程序,并将其翻译成汇编语言程序,最终实现汇编语言到8086/8088机器语言的翻译。本书为编译技术等相关课程的实验提供了参考。在附件中还提供了三类不同类型和难度的实验题,可供课程实验选择。 第1章引论: 1.1本书介绍 1.2SPL语言的特点及实验安排

1.2.1SPL语言的特点 1.2.2SPL语言编译器的主要结构1.2.3实验安排 1.3平台的选择和介绍 1.3.1LEX简介 1.3.2YACC简介 第2章词法分析: 2.1词法分析器的基本框架 2.2词法分析器的基本原理 2.2.1DFA的构造和实现 2.2.2词法分析的预处理 2.2.3实现词法分析器的注意要点2.3词法分析器的实现 2.3.1SPL语言单词属性字 2.3.2SPL词法分析器的输入和输出2.3.3SPL词法分析器的分析识别第3章语法分析: 3.1语法分析的基本框架 3.1.1上下文无关文法 3.1.2语法分析过程 3.1.3语法分析过程中的数据结构3.2语法分析的基本方法

编译原理课程设计

河海大学 编译原理课程设计 学生姓名: 学号: 班级: 专业:--------- 指导教师:

编译原理 课程设计指导书

题目一基于语法制导翻译的表达式转换编译器 一、设计目的 通过本课程设计获得对实际编译器的构造原理、过程和方法的感性认识,全面掌握语法制导翻译技术。 二、设计内容 采用语法制导翻译模式设计一个包含词法分析、语法分析、符号表管理、错误处理及输出等功能模块的、由中缀表达式到后缀表达式的完整编译器。该翻译器的规格说明如下: start → list eof list → expr;list |ε expr → expr + term { print(‘+’) } | expr –term { print(‘-’) } | term term → term * factor { print(‘*’) } | term / factor { print(‘/’) } | term div factor { print(‘DIV’) } | term mod factor { print(‘MOD’) } factor → ( expr ) | id { print( https://www.wendangku.net/doc/bf2785567.html, ) } | num { print( num.value ) } 三、设计要求 1、使用模块化设计思想来设计该编译器; 2、词法分析模块用于读入输入串,并将其转换成供语法分析模块使用的记号流。其中包括滤掉空格和注释、识别常数、识别标识符和关键字等功能; 3、要求在语法分析模块中利用语法制导翻译技术完成具体的中缀表达式到后缀表达式的翻译,其中包括按前述翻译器的规格说明构建对应表达式、项、因子的非终结符expr、term 和factor的函数以及检查记号是否匹配的函数;并在不匹配时调用错误处理模块; 4、要求符号表管理模块主要完成符号表对应数据结构的具体实现功能; 5、错误处理模块负责报告错误信息及位置,并终止分析过程; 6、输出模块完成翻译后所得到的后缀表达式的输出。

编译原理课程设计

先简要分析一下语法分析的大致流程: 当有句子要进行处理时,首先要对其进行词法分析来分解出该句子中的每个符号,然后将该句子按照算符优先算法压入归约栈中,如果可以顺利归约,则说明这是一个合法的句子,否则该句子非法。 这里有一个需要考虑的地方,就是如何进行归约。由于文法已经给定,所以我们考虑设计一个文法表,文法表中的内容就是可归约串的种别码的顺序,比如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语言的一个子集)中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的部编码及单词符号自身值。(遇到错误时可显示“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"))

编译原理课程设计 C语言编译器的实现

编译原理课程设计报告 设计题目编译代码生成器设计 学生姓名 班级 学号 指导老师 成绩

一、课程设计的目的 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。 二、课程设计的要求 1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。 2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正 确。 3、写出完整的算法框架。 4、编写完整的编译程序。 三、课程设计的内容 课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。 四、总体设计方案及详细设计 总体设计方案: 1.总体模块 主程序 词法分析程序语法分析 程序 中间代码 生成程序

2. 表2.1 各种单词符号对应的种别码 单词符号种别码单词符号种别码bgin 1 :17 If 2 := 18 Then 3 < 20 wile 4 <> 21 do 5 <= 22 end 6 > 23 lettet(letter|digit)* 10 >= 24 dight dight* 11 = 25 + 13 ;26 —14 ( 27 * 15 ) 28 / 16 # 0 详细设计: 4.1界面导入设计 (1)一共三个选项: ①choice 1--------cifafenxi ②choice 2--------yufafenxi ③choice 3--------zhongjiandaima (2)界面演示 图一

编译原理课程设计---一个简单编译器的设计与分析

摘要 使用过现代计算机的人都知道,多数用户是应用高级语言来实现他们所需要的计算的。现在计算机系统一般都含有不只一个的高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序,供用户按不同需要进行选择。高级语言编译程序是计算机系统软件最主要的组成部分之一,也是用户最直接关系的工具之一。 计算机上执行一个高级语言程序一般分为两步:第一,用一个编译程序把高级语言翻译成机器语言程序;第二,运行所得的机器语言程序求得计算结果。 通常说的翻译程序是指能够把某一种语言程序转换成另一种语言程序(目标语言程序)。如果源语言诸如Fortran,Pascal,C,Ada或java这样的高级语言,而目标程序是诸如汇编语言或者机器语言这类的低级语言,这样的一个翻译程序就是称为编译程序。 一个编译程序的工作过程一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成。每个阶段都是从上一个阶段得到结果,对他进行分析,并且根据一些外部环境(例如符号表等)得到最终的输出结果。要构造一个编译程序,可以按照这样的阶段来分别构造,最后来连调。 现在人们已经建立了多种编制部分编译程序或整个编译程序的有效工具。有些能用于自动生成扫描器(如LEX),有些可以用于自动产生语法分析器(如YACC),有些甚至可以用来自动产生整个的编译程序。这些构造编译程序的工具成为编译程序-编译程序、编译程序产生器或翻译程序书写系统,他们是按照编译程序和目标语言的形式描述而自动产生编译程序的。 编译程序是一极其庞大而又复杂的系统,掌握它比较苦难。但是一旦对其掌握,对以后的程序语言设计,系统软件分析,系统软件设计,形式语言研究等方面都是非常有好处的。 关键字:C语言、、编译、扫描器、语法分析

编译原理实验题目

编译原理 课程设计指导书

题目一基于语法制导翻译的表达式转换编译器 一、设计目的 通过本课程设计获得对实际编译器的构造原理、过程和方法的感性认识,全面掌握语法制导翻译技术。 二、设计内容 采用语法制导翻译模式设计一个包含词法分析、语法分析、符号表管理、错误处理及输出等功能模块的、由中缀表达式到后缀表达式的完整编译器。该翻译器的规格说明如下: start → list eof list → expr | expr → expr + term { print(‘+’) } | expr –term { print(‘-’) } | term |ε term → term * factor { print(‘*’) } | term / factor { print(‘/’) } | term div factor { print(‘DIV’) } | term mod factor { print(‘MOD’) } factor → ( expr ) | id { print( https://www.wendangku.net/doc/bf2785567.html, ) } | num { print( num.value ) } 三、设计要求 1、使用模块化设计思想来设计该编译器; 2、词法分析模块用于读入输入串,并将其转换成供语法分析模块使用的记号流。其中包括滤掉空格和注释、识别常数、识别标识符和关键字等功能; 3、要求在语法分析模块中利用语法制导翻译技术完成具体的中缀表达式到后缀表达式的翻译,其中包括按前述翻译器的规格说明构建对应表达式、项、因子的非终结符expr、term 和factor的函数以及检查记号是否匹配的函数;并在不匹配时调用错误处理模块; 4、要求符号表管理模块主要完成符号表对应数据结构的具体实现功能; 5、错误处理模块负责报告错误信息及位置,并终止分析过程; 6、输出模块完成翻译后所得到的后缀表达式的输出。

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

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

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

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