编译原理课程设计报告词法语法分析器.docx

上传人:b****6 文档编号:5604409 上传时间:2022-12-28 格式:DOCX 页数:17 大小:212KB
下载 相关 举报
编译原理课程设计报告词法语法分析器.docx_第1页
第1页 / 共17页
编译原理课程设计报告词法语法分析器.docx_第2页
第2页 / 共17页
编译原理课程设计报告词法语法分析器.docx_第3页
第3页 / 共17页
编译原理课程设计报告词法语法分析器.docx_第4页
第4页 / 共17页
编译原理课程设计报告词法语法分析器.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

编译原理课程设计报告词法语法分析器.docx

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

编译原理课程设计报告词法语法分析器.docx

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

编译原理课程设计

CourseDesignofCompiling

(课程代码3273526)

半期题目:

词法和语法分析器

实验学期:

大三第二学期

学生班级:

2014级软件四班

学生学号:

18

学生姓名:

何华均

任课教师:

丁光耀

信息科学与技术学院

 

课程设计1-C语言词法分析器

1.题目

C语言词法分析

2.内容

选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集,不用处理c语言的所有单词符号。

将解析到的单词符号对应的二元组输出到文件中保存

可以将扫描缓冲区与输入缓冲区合成一个缓冲区,一次性输入源程序后就可以进行预处理了

3.设计目的

掌握词法分析算法,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解

4.设计环境(电脑语言环境)

语言环境:

C语言

CPU:

i7HQ6700

内存:

8G

5.概要设计(单词符号表,状态转换图)

词法分析器的结构

词法分析程序的功能:

输入:

所给文法的源程序字符串。

输出:

二元组(syn,token或sum)构成的序列。

词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词.

为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:

1)ch存放最新读进的源程序字符

2)strToken存放构成单词符号的字符串

3)Buffer字符缓冲区

4)structkeyType存放保留字的符号和种别

源程序

输入缓冲区

预处理子程序

扫描缓冲区1

扫描缓冲区2

词法分析子程序

返回一个单词

调用

数据

 

待分析的简单词法

(1)保留字

break、case、char、const、int、do、while…

(2)运算符和界符

=、+、-、*、/、%、,、;、(、)、、#

各种单词符号对应的种别码

单词符号

种别码

单词符号

种别码

ID

0

sizeof

24

INT

1

static

25

auto

2

struct

26

break

3

switch

27

case

4

typedef

28

char

5

union

29

const

6

unsigned

30

continue

7

void

31

default

8

volatile

32

do

9

while

33

double

10

=

34

else

11

+

35

enum

12

-

36

extern

13

*

37

float

14

/

38

for

15

%

39

goto

16

40

if

17

;

41

int

18

42

long

19

43

register

20

44

return

21

clear

45

short

22

#

46

signed

23

lettet(letter|digit)*

47

dightdight*

48

状态转换图

6.详细设计(数据结构,子程序)

算法思想:

首先设置3个变量:

①strToken用来存放构成单词符号的字符串;②ch用来字符;③structkeyType用来存放单词符号的种别码。

扫描子程序主要部分流程如下图所示。

子程序结构:

子程序名

功能

GETCHAR()

读一个字符到ch中

GETBC()

读一个非空白字符到ch中

CONCAT()

把CHAR中字符连接到strToken之后

LETTER()

判断CHAR中字符是否为字母

DIGIT()

判断ch中字符是否为数字

RESERVE()

用strToken中的字符串查找保留字表,并返回保留字种别码,若返回零,则非保留字

RETRACT()

把CHAR中字符回送到缓冲区

7.程序清单

eyname)==0)

returnKey[i].value;

return0;

}

voidRetract()

alue;

}

elseif(ch>='0'&&ch<='9'){

ConCat();

GetChar();

while(Digit()){

ConCat();

GetChar();

}

Retract();

strcpy,strToken);

=1;

}

else{

ConCat();

strcpy,strToken);

=Reserve();

}

returntempkey;

}

/*

主函数

*/

intmain(){

行结果

E:

/作业/编译原理/

运行结果

九、实验体会

通过本次次法分析设计实验,我加深了对词法分析过程的理解。

并在实际的设计过程深入的了解了编译原理思想。

对编译原理课程有了更深的理解

课程设计二:

设计简单的语法分析器

一、题目

设计简单的语法分析器

二、设计内容

用算符优先分析方法设计一个分析解释程序,对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。

三、设计目的

了解掌握算符优先分析的基本方法、内容;

四、设计环境

语言环境:

C语言

CPU:

i7HQ6700

内存:

8G

五、概要设计

设计思路

语法分析的任务:

把单词符号作为基本单位,分析程序是否为合法的程序.

算符优先分析法是自下而上的语法分析方法,即根据文法,对输入字串进行归约,若能正确地归约为文法的初始符号,则表示输入字串是合法的.主要研究对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。

文法表示:

S→v=E|E|clear

E→E+T|E-T|T

T→T*F|T/F|F

F→(E)|v|c

单词种别码设计

符号

种别码

=

1

2

+

3

-

4

*

5

/

6

7

8

v

9

c

10

clear

11

#

12

N

13

 

六、详细设计

变量及函数说明

变量及函数名

表示内容及操作

intpriority[NUM][NUM]

优先关系矩阵

structWordType

单词种别码结构

structVarWord

变量表中的元素结构

mainStack

归约栈

wordStack

单词串

GetwordStack()

输入串转化成单词串

GetWord()

从单词串中取单词

ClearwordStack()、ClearmainStack()

清空单词串和归约栈

CheckvarTable(chara[])

查看变量在变量表中的位置

AddvarTable(VarWorda)

变量表添加变量

InitmainStack()

初始化归约栈

AddmainStack(WordTypea)

归约栈添加

Handle()

归约处理程序

MainHandle()

归约子程序

七、程序清单

eyname)==0)

returnKey[i].value;

return0;

}

voidRetract()alue;

}

elseif(ch>='0'&&ch<='9'){

ConCat();

GetChar();

while(Digit()){

ConCat();

GetChar();

}

Retract();

strcpy,strToken);

=1;

}

else{

ConCat();

strcpy,strToken);

=Reserve();

}

returntempkey;

}

 

boolGetwordStack(){

inti;

=0;

keyTypetemp;

while(strlen(buffer)){

temp=ReturnWord();ord,;

[].value=10;

}

elseif==0)ord,;

[].value=9;

}

else{

for(i=0;i

if(strcmp,wordType[i].word)==0)arname)==0)

returni;

elseif(i==M-1)

return-1;

}

/*

添加变量

*/

voidAddvarTable(VarWorda){

[]=a;

++;

}

/*

初始化归约栈

*/

voidInitmainStack()

{

[0]=wordType[12];

=1;

}

/*

添加归约栈

*/

voidAddmainStack(WordTypea)

{

[]=a;

++;

}

/*

归约

*/

boolHandle()

{

inti;

alue==10){

[-1].value=13;

}

alue==9){

[-1].value=13;

i=CheckvarTable[-1].word);

if(i<0){

printf("\n变量%s未定义!

",[-1].word);

returnfalse;

}

else

strcpy[-1].word,[i].value);

}

alue==1){

if[-3].value==9){

i=CheckvarTable[-3].word);

if(i<0){

VarWordtemp;

strcpy,[-3].word);

strcpy,[-1].word);

=true;

AddvarTable(temp);

}

else

strcpy[i].value,[-1].word);

strcpy[-3].word,[-1].word);

[-3].value=13;

}

elseif[-3].value==13)

strcpy[-3].word,[-1].word);

=-2;

}

alue==3){

inta,b;

a=atoi[-1].word);

b=atoi[-3].word);

a=a+b;

itoa(a,[-3].word,10);

=-2;

}

elseif[-2].value==5){

inta,b;

a=atoi[-1].word);

b=atoi[-3].word);

a=a*b;

itoa(a,[-3].word,10);

=-2;

}

alue==2&&[-1].value==13&&[-2].value==12){

printf("\n表达式的值为%s",[-1].word);

=0;

}

alue==12&&[0].value==12)

=-2;

returntrue;

}

boolMainHandle(){

while

if(priority[[-1].value][[0].value]!

=1)

AddmainStack(GetWord());

else{

if{

ord,[i].value);

Handle();

}

break;

}

if

MainHandle();

returntrue;

}

/*

主函数

*/

intmain(){

intok=1;

WordTypetemp;

intii=0;

while(ok){

printf("\n");

printf("输入第%d语句串:

",++ii);

scanf("%s",buffer);

printf("单词串:

");

if(!

GetwordStack())

return0;

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

printf("(%s,%d)",[i].word,[i].value);

printf("\n当前归约栈:

");

InitmainStack();

MainHandle();

}

printf("结束\n");

return0;

}

八、运行结果

九、实验体会

通过本次语法分析设计实验,我加深了对语法分析过程的理解。

并在实际的设计过程深入的了解了编译原理思想。

对编译原理课程有了更深的理解

 

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

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

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

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