小型编译程序的设计与实现文档格式.docx
《小型编译程序的设计与实现文档格式.docx》由会员分享,可在线阅读,更多相关《小型编译程序的设计与实现文档格式.docx(42页珍藏版)》请在冰豆网上搜索。
![小型编译程序的设计与实现文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/25/057c88e9-0d6c-464d-ba66-d614ddc52c4c/057c88e9-0d6c-464d-ba66-d614ddc52c4c1.gif)
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
a»
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