编译原理课程设计报告词法语法分析器Word文件下载.docx

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

编译原理课程设计报告词法语法分析器Word文件下载.docx

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

编译原理课程设计报告词法语法分析器Word文件下载.docx

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

词法分析程序可以单独为一个程序;

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

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

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

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

3)Buffer字符缓冲区

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

源程序

输入缓冲区

预处理子程序

扫描缓冲区1

扫描缓冲区2

词法分析子程序

返回一个单词

调用

数据

待分析的简单词法

(1)保留字

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

(2)运算符和界符

=、+、-、*、/、%、,、;

、(、)、、#

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

单词符号

种别码

种别码

ID

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{

=Reserve();

returntempkey;

/*

主函数

*/

intmain(){

行结果

E:

/作业/编译原理/

运行结果

九、实验体会

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

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

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

课程设计二:

设计简单的语法分析器

一、题目

二、设计内容

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

若存在错误,提示错误相关信息。

三、设计目的

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

四、设计环境

五、概要设计

设计思路

语法分析的任务:

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

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

文法表示:

S→v=E|E|clear

E→E+T|E-T|T

T→T*F|T/F|F

F→(E)|v|c

单词种别码设计

符号

v

c

N

六、详细设计

变量及函数说明

变量及函数名

表示内容及操作

intpriority[NUM][NUM]

优先关系矩阵

structWordType

单词种别码结构

structVarWord

变量表中的元素结构

mainStack

归约栈

wordStack

单词串

GetwordStack()

输入串转化成单词串

GetWord()

从单词串中取单词

ClearwordStack()、ClearmainStack()

清空单词串和归约栈

CheckvarTable(chara[])

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

AddvarTable(VarWorda)

变量表添加变量

InitmainStack()

初始化归约栈

AddmainStack(WordTypea)

归约栈添加

Handle()

归约处理程序

MainHandle()

归约子程序

七、程序清单

eyname)==0)

voidRetract()alue;

boolGetwordStack(){

inti;

=0;

keyTypetemp;

while(strlen(buffer)){

temp=ReturnWord();

ord,;

[].value=10;

elseif==0)ord,;

[].value=9;

else{

for(i=0;

i<

NUM;

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)

归约

boolHandle()

alue==10){

[-1].value=13;

alue==9){

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<

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)

=-2;

alue==3){

inta,b;

a=atoi[-1].word);

b=atoi[-3].word);

a=a+b;

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

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

a=a*b;

alue==2&

[-1].value==13&

[-2].value==12){

printf("

\n表达式的值为%s"

=0;

alue==12&

[0].value==12)

returntrue;

boolMainHandle(){

while

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

=1)

AddmainStack(GetWord());

if{

ord,[i].value);

Handle();

break;

if

MainHandle();

returntrue;

intok=1;

WordTypetemp;

intii=0;

while(ok){

\n"

);

输入第%d语句串:

++ii);

scanf("

%s"

buffer);

单词串:

if(!

GetwordStack())

return0;

for(inti=0;

i++)

(%s,%d)"

[i].word,[i].value);

\n当前归约栈:

InitmainStack();

MainHandle();

printf("

结束\n"

八、运行结果

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

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

当前位置:首页 > 高等教育 > 管理学

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

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