《编译原理课程设计报告》.docx

上传人:b****3 文档编号:2831706 上传时间:2022-11-15 格式:DOCX 页数:16 大小:68.52KB
下载 相关 举报
《编译原理课程设计报告》.docx_第1页
第1页 / 共16页
《编译原理课程设计报告》.docx_第2页
第2页 / 共16页
《编译原理课程设计报告》.docx_第3页
第3页 / 共16页
《编译原理课程设计报告》.docx_第4页
第4页 / 共16页
《编译原理课程设计报告》.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

《编译原理课程设计报告》.docx

《《编译原理课程设计报告》.docx》由会员分享,可在线阅读,更多相关《《编译原理课程设计报告》.docx(16页珍藏版)》请在冰豆网上搜索。

《编译原理课程设计报告》.docx

《编译原理课程设计报告》

目录

 

一、课程设计的目的………………………………………………………………2

二、课程设计的要求………………………………………………………………2

三、课程设计报告内容……………………………………………………………2

四、实验运行环境…………………………………………………………………2

五、实验设计步骤…………………………………………………………………2

六、变化后的正规文法………………………………………………………………2

七、状态图………………………………………………………………3

八、基本测试数据…………………………………………………………4

九.词法分析程序的数据结构与算法………………………………………………4

十、实验结果截图……………………………………………………………………12

十一、设计结果及体会………………………………………………………………12

十二、参考文献………………………………………………………………………12

 

一、课程设计的目的

加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。

二、课程设计要求

1.根据以下的正规式,编制正规文法,画出状态图;

      标识符                 <字母>(<字母>|<数字字符>)*

      十进制数          

(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(ε|.)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*

      八进制数              0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*(ε|.)(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*

      十六进制数             0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*(ε|.)

(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*

      运算符和分隔符   + - * / > < = ( ) ;

      关键字                 if then else while do 

2.根据状态图,设计词法分析函数intscan(),完成以下功能:

1)从键盘读入数据,分析出一个单词。

2)返回单词种别(用整数表示),

3)返回单词属性(不同的属性可以放在不同的全局变量中)。

3.编写测试程序,反复调用函数scan(),输出单词种别和属性。

三、课程设计报告内容

编制一个能够分析三种数、标识符、主要运算符和主要关键字的词法分析程序。

四、实验运行环境

PC微机

DOS操作系统或Windows操作系统

TurboC程序集成环境或VisualC++程序集成环境

五、实验设计步骤

1.根据状态图,设计词法分析算法

2.采用C语言,设计函数scan(),实现该算法

3.编制测试程序(主函数main)。

4.调试程序:

输入一组单词,检查输出结果。

六、变化后的正规文法:

<标识符>-><字母>(<字母>|<数字字符>)*

<十进制数>-><数字字符><数字字符>

<八进制数>->0

<十六进制数>->0x

<运算符和分隔符>->+|-|*|/|>|<|=|(|)|;

<关键字>->if|then|else|while|do

<字母>->a|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|

R|S|T|U|V|W|X|Y|Z

<数字字符>->(0|1|2|3|4|5|6|7|8|9)<数字字符>|ε

->(ε|.)

->(0|1|2|3|4|5|6|7)

->(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)

七、状态图

图-1-

空白

0-9/a-z/A-Z

A-Z/a-z其它

0-9

1-9其它

0-9

非数字

0-7

00-7非0-7且…

00-7

x/X

非0-7

1-9/A-F/a-f

非(1-9/A-F/a-f)

+1-1…1

10-9/A-F/a-f

If/

while/非(1-9/A-F/a-f)

then/else/do

八、基本测试数据

输入数据例:

058+data>0x2f00then;

正确结果:

这些单词的单词种别及其属性

INT100

INT1058

+_

IDNdata

>_

INT1647

INT80

Then-

;-

九、词法分析程序的数据结构与算法

词法分析的算法思想主要是根据状态图来实现,由前面的状态图来进行结构的设计,具

体细节请参见“图1”的图示。

主要的数据结构如下所示:

unionchars{//联合,可存储字符串,整型和浮点型

charpro_char[15];

intpro_number;

floatreal;

};

structdata{//将每个单元用一个结构来存储

charkind[7];//类型即种别

intid;//所属的具体类型即种别号

unioncharspro;//属性值

};

种别与种别号的对应关系如下表所示:

种别种别号

INT101

INT82

INT163

标识符4

分隔符5

关键字6

出错7

REAL108

REAL89

REAL1610

完整代码如下:

#include

#include

unionchars{//联合,可存储字符串,整型和浮点型

charpro_char[15];

intpro_number;

floatreal;

};

structdata{//将每个单元用一个结构来存储,其内容包括:

类型,所属的具体类型,以及属性值

charkind[7];

intid;

unioncharspro;

};

intscan(char*a);//对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类

voidPrints(chara[15],intid,inta_long);//将分析后的每个token输出

voidsave(char*a,intid,intx);//将分析后的结果保存到一个结构数组中

charnowChar[15];//临时的存储单元,用来存储被空格打断以后单元

charkinds[11][8]={"","INT10","INT8","INT16","IDN","","","","REAL10","REAL8","REAL16"};

//单词的不同种别

structdatalink[100];//用来存放词法分析以后的结果的结构数组

intlink_long=0;//全局变量

intscan(char*a)

{

intid;

inta_long=0;

intdoc=0;

while(*a!

=NULL){

nowChar[0]='\0';

a_long=0;

doc=0;

//对数值的判断及处理

if('0'<=*a&&*a<='9'){//如果第一个字符为数值

nowChar[a_long]=*a;

*a++;

a_long++;

//对十六进制的判断及处理

if(nowChar[0]=='0'&&(*a=='x'||*a=='X')){//如果第一个字符为0且第二个字符为x,则为十六进制数

nowChar[a_long]=*a;

*a++;

a_long++;

while(*a!

=NULL&&(('0'<=*a&&*a<='9')||('a'<=*a&&*a<='f')||('A'<=*a&&*a<='F')||*a=='.')){

nowChar[a_long]=*a;//一直将此十六进制数完全读入,若为浮点型的,则加以标记

if(*a=='.')

doc=1;

*a++;

a_long++;

}

nowChar[a_long]='\0';//判断输入的十六进制数是否合法

if(a_long==2){//输入的只有0x,则输入错误

Prints(nowChar,7,a_long);

return0;

}

if(doc)//输入的十六进制数是浮点型的

Prints(nowChar,10,a_long);//则将其具体的类型属性定为10

else//输入的十六进制数是整型的

Prints(nowChar,3,a_long);//则将其具体的类型属性定义为3

continue;

}

//对八进制的判断及处理

if(nowChar[0]=='0'&&'0'<=*a&&*a<='7'){//如果第一个字符为0且第二个字符为0~7,则为八进制数

nowChar[a_long]=*a;

*a++;

a_long++;

while(*a!

=NULL&&(('0'<=*a&&*a<='7')||*a=='.')){

nowChar[a_long]=*a;//一直将此八进制数完全读入,若为浮点型的,则加以标记

if(*a=='.')

doc=1;

*a++;

a_long++;

}

nowChar[a_long]='\0';

if(doc)//输入的八进制数是浮点型的

Prints(nowChar,9,a_long);//则将其具体的类型属性定为9

else//输入的十六进制数是整型的

Prints(nowChar,2,a_long);//则将其具体的类型属性定义为2

continue;

}

//对十进制数的判断及处理

else{

while(*a!

=NULL&&(('0'<=*a&&*a<='9')||*a=='.')){

nowChar[a_long]=*a;//一直将此十进制数完全读入,若为浮点型的,则加以标记

if(*a=='.')

doc=1;

*a++;

a_long++;

}

nowChar[a_long]='\0';

if(doc)//输入的十进制数是浮点型的

Prints(nowChar,8,a_long);//则将其具体的类型属性定为8

else//输入的十进制数是整型的

Prints(nowChar,1,a_long);//则将其具体的类型属性定义为1

continue;

}

}//完成了对数值的判断及处理

//对字符的判断及处理

else{

nowChar[a_long]=*a;

*a++;

a_long++;

//判断输入的字符是否为运算符或其他的分隔符

switch(nowChar[0])

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1