小型编译程序的设计与实现文档格式.docx

上传人:b****3 文档编号:14838628 上传时间:2022-10-25 格式:DOCX 页数:42 大小:123.69KB
下载 相关 举报
小型编译程序的设计与实现文档格式.docx_第1页
第1页 / 共42页
小型编译程序的设计与实现文档格式.docx_第2页
第2页 / 共42页
小型编译程序的设计与实现文档格式.docx_第3页
第3页 / 共42页
小型编译程序的设计与实现文档格式.docx_第4页
第4页 / 共42页
小型编译程序的设计与实现文档格式.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

小型编译程序的设计与实现文档格式.docx

《小型编译程序的设计与实现文档格式.docx》由会员分享,可在线阅读,更多相关《小型编译程序的设计与实现文档格式.docx(42页珍藏版)》请在冰豆网上搜索。

小型编译程序的设计与实现文档格式.docx

6

保留字end

a

7

赋值语句

semicoIon

8

a.»

j

e

9

布尔表达式

Jinghao

10

“#”

S

11

语句

L

12

复合语句

Tempsy

15

临时变量

EA

18

Band(即布尔表达式中的

bA

EO

19

Bor(即布尔表达式中的BV

Plus

34

“+”

Times

36

“*”

Becomes

38

“:

=”赋值

Op_and

39

“1»

and

Op_or

40

or

Op_not

41

not

Rop

42

关系运算符

Lparent

48

“(”

Rparent

49

Ident

56

变量

Intconst

57

整常量

#include"

string.h"

#defineACC-2

/************************/

#definesy_if0

#definesy_then1

#definesy_else2

#definesy_while3

#definesy_begin4

#definesy_do5

#definesy_end6

#definea7

#definesemicoIon8

#definee9

#definejinghao10

#defineS11

#defineL12

#definetempsy15

#defineEA18/*Eand*/

#defineE019/Eor*/

#defineplus34

#definetimes36

#definebecomes38

#defineop_and39

#defineop_or40#defineop_not41

#definerop42

#defineIparent48

#definerparent49

#defineident56

#defineintconst57

1.2变量及数据结构说明

编译程序中涉及到的变量及数据结构说明如下:

charch='

\0:

/*从字符缓冲区读取当前字符*/

intcount=O;

/*词法分析结果缓冲区计数器*/

staticcharspelling[10]={"

"

};

/*存放识别的字*/

staticcharline[81]={"

/*一行字符缓冲区,最多80个字

符*/

char*pline;

/*字符缓冲区指针*/

staticcharntab1[100][10];

/*变量名表,共100项,每项长

度10*/

structntab

{

inttc;

/*真值*/

intfc;

/*假值*/

}ntab2[200];

/*在布尔表达式E中保存有关布尔变量的真、假

值*/

intlabel=0;

/*指向ntab2的指针*/

structrwords{

charsp[10];

intsy;

/*保留字表的结构,用来与输入缓冲区中的单词进行匹配*/

structrwordsreswords[10]={{"

if"

sy_if},

{"

do"

sy_do},

else"

sy_else},

while"

sy_while},

then"

sy_then},

begin"

sy_begin},

end"

sy_end},

and"

op_and},

or"

op_or},

not"

op_not}};

/*保留字表初始化,大小为10*/

structaa{

intsy1;

/*存放单词的种别编码*/

intpos;

/*存放单词自身的值*/

}buf[1000],/*词法分析结果缓冲区*/

n,/*读取二元式的当前字符*/

n1,/*当前表达式中的字符*/

E,/*非终结符*/

sstack[100],/*算术或布尔表达式加工处理使用的符号栈*/

ibuf[100],/*算术或布尔表达式使用的缓冲区*/stack[1000];

/*语法分析加工处

理使用的符号栈*/

structaaoth;

/*四元式中的空白位置*/

structfourexp{

charop[10];

structaaarg1;

structaaarg2;

intresult;

}fexp[200];

/*四元式的结构定义*/

intssp=0;

/*指向sstack栈指针*/

structaa*pbuf=buf;

/*指向词法分析缓冲区的指针*/

intnlength=0;

/*词法分析中记录单词的长度*/

inttt1=0;

/*变量名表指针*/

char*cfile;

/*源程序文件,~为结束符*/

intInum=0;

/*源程序行数记数*/

intsign=0;

/*sign=1为赋值语句;

=2为while语句;

=3为if语句*/

/*******************************************************/

intnewt=0;

/*临时变量计数器*/

intnxq=100;

/*nxq总是指向下一个将要形成的四元式地址,*/

/*每次执行gen()时,地址自动增1*/

intlr;

/*扫描LR分析表1过程中保存的当前状态值*/

intlr1;

/*扫描LR分析表2或表3所保存的当前状态值*/

intsp=0;

/*查找LR分析表时状态栈的栈顶指针*/

intstack1[100];

/*状态栈1定义*/

intsp仁0;

/*状态栈1的栈顶指针*/

intnum=O;

/*算术或布尔表达式缓冲区指针*/

struct11{

intnxql;

/*记录下一条四元式的地址*/

inttc1;

/*真值链*/

intfc1;

/*假值链*/

}labelmark[10];

/*记录语句嵌套层次的数组,*/

/*即记录嵌套中每层的布尔表达式E的首地址*/

intlabeltemp[10];

/*即记录每层else之前的四元式地址*/

intpointmark=-1,/*labelmark数组指针*/

pointtemp=-1;

/*labeltemp数组指针*/

1.3主函数main()

voidmain(

cfile=fopen("

pas.dat"

"

r"

;

/*打开C语言源文件*/

readch(;

/*从源文件读一个字符*/

scan(;

/*词法分析*/

disp1(;

disp3(;

stack[sp].pos=0;

stack[sp].sy1=-1;

/*初始化状态栈*/

stack1[sp1]=0;

/*初始化状态栈1*/

oth.sy1=-1;

readnu(;

/*从二元式读入一个符号*/

lrparse(;

/*

语法语义分析产生四兀式*/

getch(;

 

disp2(;

printf("

\n

程序运行结束!

\n"

1.4词法分析函数说明

(1)读取函数readline(、readch(

词法分析包含从源文件读取字符的操作,但频繁的读文件会影响程序执行效率,故实际上是从源程序文件“pas.dat”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行readch()从输入缓冲区获得的;

若缓

冲区已被读空,则再执行readline()从pas.dat中读取下一行至输入缓冲区。

readline(

charchi;

pline=line;

ch1=getc(cfile;

while(ch1!

='

\n'

&

&

!

feof(cfile

*pline=ch1;

pline++;

pline='

\O'

}

readch(

if(ch=='

readline(;

Inum++;

ch=*pline;

(2)扫描函数scan(

扫描函数scan()的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。

scan(

inti;

while(ch!

'

/*'

是源程序结束符号*/

switch(ch

case'

:

break;

a'

case'

b'

c'

d'

e'

casef:

g'

h'

i'

j'

k'

caseT:

m'

n'

o'

p'

q'

r'

s'

t'

u'

v'

w'

x'

y'

z'

:

/*保留字和标识符中的字母只能是小写字母*/

identifier(;

/*识别保留字和标识符*/

O'

1'

2'

3'

4'

5'

6'

7'

8'

case9:

number(;

/*识别整常数*/

<

buf

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

当前位置:首页 > PPT模板 > 商务科技

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

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