编译原理实验编译器综合报告附源代码docxWord格式文档下载.docx
- 文档编号:14868314
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:18
- 大小:21.14KB
编译原理实验编译器综合报告附源代码docxWord格式文档下载.docx
《编译原理实验编译器综合报告附源代码docxWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验编译器综合报告附源代码docxWord格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
voidstaBlock(int•nChain);
//语旬块
voidstaString(int*nChain);
//ifi句串
voidsta(int*nChain);
//ifi句
voidfuzhi();
//賦值语句
voidtiaojianfint*nChain);
//条件语句
voidxunhuan();
//循环语句
char*E{);
//Expresiion表达式
char*T();
//Term项
char*F();
//Factor因子
char•newTemp();
//l1动生成临时变址
voidbackpatch(intp,intt);
//回填
intmerge(intpl,intp2);
//合并pl和p2
voidemit(char*res,char*numl,char*op,char*num2);
//生成四元式
截图说明:
综合输入:
(赋值,循环,条件。
结合,口己定义即可)
Pleaseinputyoursourcestring:
nainO
do<
if<
l*2<
3*4>
x-5;
y-6;
>
whilo<
7*8<
9*10>
b-12
tt
t
<
1
♦
2
T1
3
4
12
if
T1<
T2
goto
5
-1
7
S
■
X
b
6
y
8
T3
H
9
10
T4
T3<
11
a
Press
any
key1
;
ocontinue.
源代码:
//•♦**♦*******编译器
//
//***Erin***
//*"
软件工程0801班"
*
//***HUST***
〃*******!
***♦・・・・・・********I******・
#include<
stdio.h>
string.h>
math.h>
stdlib.h>
charprog[80];
〃存放所有输入字符
chartoken[8};
//存放词组
charch;
〃单个字符
intsyn,p,m,n,i;
〃syn:
种别编码
doublesum;
intcount;
intisSignal;
//是否带正负号(0不带,1负号,2正号)
intisError;
intisDecimal;
//是否是小数
doubledecimal;
〃小数
intisExp;
〃是否是指数
intindex;
〃指数算
intisNegative;
〃是否带负号
doubletemp;
inttemp2;
intrepeat;
〃是否连续出现+,-
intnextq;
intkk;
〃临时变址的标号
intntc,nfc,nnc,nnb,nna;
char»
rwtab[9)={"
main"
"
int"
float"
double"
char"
if"
else"
do"
while"
};
struct{
charresult[10];
〃字符串(字符数组)
chararglflO];
charopera[10];
chararg2[10];
}fourCom(20];
〃结构体数组
//扫描
voidlrparser();
voidstaBlock(int*nChain);
//语句块
〃语句串
〃语句
〃赋值语句
voidtiaojian(int*nChain);
char*E();
//Term项
char・newTemp();
〃f|动生成临时变虽
〃回填
〃合并pl和p2
voidemit(char*佗s,char*numl,char*op,char*num2);
〃生成四元式
voidmain()
{
P=0;
count=0;
isDecimal=O;
index=O;
repeat=O;
kk=O;
printf("
\nPleaseinputyoursourcestring:
\n"
);
do{
ch=getchar();
prog[p++]=ch;
}while(ch!
='
#'
isError=0;
scanner();
lrparser();
for(i=l;
i<
nextq;
i++)//循环输出四元式
\t%5s
\n%d\t"
i);
(%5s%5s%5s
)\n"
/fourCom[i].argl,fourCom[i].opera,fourCom[i].arg2/fourCom(i].result);
}
}voidIrparserf)
intnChain;
nfc=ntc=l;
nextq=l;
if(syn==l)//main
if(syn==26)//(
if(syn==27)//)scanner();
staBlockf&
nChain);
else
printfC*缺少右括号W);
}else
printfC缺少左括号\n"
缺少main\n"
//<语句块>:
:
{'
<语句串>'
}'
voidstaBlock(int*nChain)//语句块{
if(syn==28)//{
staString(nChain);
〃backpatch(*nChain,nextq);
if(syn==29)//}
scanner。
〃读下一个else
printfC缺少}号\“);
printff1缺少{号\岸);
//<语句串>:
:
=<语句〉{;
<语句>};
voidstaString(int*nChain)//语句串{
sta(nChain);
backpatch(*nChain,nextq);
while(syn==31)//;
sta(nChain);
//backpatch(*nChain,nextq-l);
voidstafint*nChain)〃语句
if(syn==10)
{fuzhi();
//*nChain=O;
elseif(syn==6)//if
{tiaojian(nChain);
elseif(syn==8)//doxunhuan();
//<
条件语句A>
if(<
条件>
)<
语句块〉
voidtiaojian(int*nChain)
charres[10],numl[10Lnum2[10],op[10];
intnChainTemp;
条件a>
表达式>
关系运算符>
表达式〉
if(syn==6)//if
〃strcpy(numl,E());
if(syn==26)//(
strcpyfnuml^O);
if((syn<
=37)&
&
(syn>
=32)){
switch(syn)
case32:
strcpy(op,"
"
break;
case33:
="
case34:
strcpy(op/'
break;
case35:
strcpy(op,“<="
case36:
strcpy(op,"
=="
case37:
!
default:
error"
strcpy(num2,E());
strcat(numl,op);
strcat(numl,num2);
//nfc=nextq+l;
ntc=nextq;
//记住if语句位置emit("
0"
“if”,numl,"
goto"
nfc=nextq;
//if中表达式为假
〃第一个0已回填backpatch(ntc,nextq);
〃ntc链接的所有四元式都回填nextq}
if(syn==27)//)
staBlockf&
nChainTemp);
//语句块*nChain=merge(nChainTemp,nfc);
〃<循环语句>:
=do<语句块>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 编译器 综合 报告 源代码 docx