天津理工大学编译原理实验一Word文档下载推荐.docx
- 文档编号:16676051
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:33
- 大小:56.36KB
天津理工大学编译原理实验一Word文档下载推荐.docx
《天津理工大学编译原理实验一Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《天津理工大学编译原理实验一Word文档下载推荐.docx(33页珍藏版)》请在冰豆网上搜索。
#defineDO264
#defineDOUBLE265
#defineELSE266
#defineENUM267
#defineEXTERN268
#defineFLOAT269
#defineFOR270
#defineGOTO271
#defineIF272
#defineINT273
#defineLONG274
#defineREGISTER275
#defineRETURN276
#defineSHORT277
#defineSIGNED278
#defineSIZEOF279
#defineSTATIC280
#defineSTRUCT281
#defineSWITCH282
#defineTYPEDEF283
#defineUNION284
#defineUNSIGNED285
#defineVOLATILE286
#defineWHILE287
//运算符
#definePLUS288//+
#defineMINUS289//-
#defineMUL290//*
#defineDIV291///
#defineREMAIN292//%
#defineGREATER293//>
#defineLESS294//<
#defineEQUAL295//=
#defineMISTAKE296//!
#defineAND297//&
#defineOR298//|
#definePP299//++
#defineMM300//--
#defineEE301//==
#defineGE302//>
=
#defineLE303//<
#defineMISE304//!
#defineAA305//&
&
#defineOO306//||
#definePE307//+=
#defineMINUSE308//-=
#defineMULE309//*=
#defineDIVE310///=
#definePOW311//^
//界符
#defineSEMIC312//;
#defineCOMMA313//,
#defineMULANNO_L314///*
#defineMULANNO_R315//*/
#defineBRACE_L316//{
#defineBRACE_R317//}
#defineBRAKET_L318//(
#defineBRAKET_R319//)
#defineMIDBRA_L320//[
#defineMIDBRA_R321//]
#defineONE_ANNO322////
//标识符和常量符
#defineTAG400
#defineCONINT401
#defineCONFLOAT402
#defineCONCHAR403
#defineCONSTRING404
//转义字符和字符串
#defineCA500
#defineCB501
#defineCF502
#defineCN503
#defineCR504
#defineCT505
#defineCV506
#defineCBSL507
#defineCQUE508
#defineCDQM509
#defineCQM510
#defineZERO511
usingnamespacestd;
typedefstructVariate{//变量标识符
intid;
charname[50];
}Variate;
typedefstructConstant{//常量
}Constant;
typedefstructSign{
charname[100];
intsym;
charattr[100];
}Sign;
constchar*keywordTable[]={"
include"
"
auto"
break"
case"
char"
const"
continue"
"
default"
do"
double"
else"
enum"
extern"
float"
for"
goto"
if"
int"
long"
register"
return"
short"
signed"
sizeof"
static"
struct"
switch"
typedef"
union"
unsigned"
volatile"
while"
"
##"
};
//##作用是判断是否结束
constchar*operateTable[]={"
+"
-"
*"
/"
%"
>
<
="
!
|"
++"
--"
"
=="
||"
+="
-="
*="
/="
^"
constchar*borderTable[]={"
;
/*"
*/"
{"
}"
("
)"
["
]"
//"
constcharchangeList[12]={'
a'
'
b'
f'
n'
r'
t'
v'
\\'
?
'
\'
0'
FILE*in;
FILE*Out;
FILE*Error;
intline=1;
//用于输出错误的行数或者其他情况。
默认值是从1开始,为第一行
charbuf[bufsize];
//存储读取的一行的字符串
charfirchar;
//头文件下第一个字符
charChar;
intstart=0;
intVariateNum=0;
//记录变量的个数,减去1
intConstantNum=0;
//记录常量的个数
intSignNum=0;
//记录标记的个数
intnotation=1;
//记录是否找到多行注释的另一半*/,默认值是1即为有另一半
intisNotation=0;
//判断是否是在注释行内0不是,1单行注释2多行注释
boollast=false;
intlate=0;
Variatevar;
Constantcon;
Signsign;
VariateVarArr[bufsize];
ConstantConArr[bufsize];
SignSigArr[bufsize];
//获取读取的文件本行的第一个字符,直到找到一个非空格字符
chargetfirstc(FILE*in)
{
charch=fgetc(in);
//fgetc()函数的作用是读取文件的当前行的一个字符,返回读取的字符
while(ch=='
'
||ch=='
\n'
\t'
)
{
if(ch=='
{
line++;
fputc('
Out);
//向输出的文本文件中打印换行
}
ch=fgetc(in);
}
returnch;
}
//处理读取的本行内容
voiddealhead(char*buf)
charch[10];
charcha;
charstr[bufsize];
inti=0;
intj=0;
inttemp=0;
while(i<
bufsize)//找到include<
并保存
if(buf[i]!
='
buf[i]!
\0'
if(temp==0)
{
if(buf[i]=='
i'
temp=1;
elseif(buf[i]=='
d'
temp=2;
else
{
fprintf(Error,"
Line:
%d\tformatiswrong!
Without'
\n"
line);
break;
}
}
if(temp==1)
ch[j]=buf[i];
j++;
ch[j]='
elseif(temp==2)
if(buf[i+1]=='
i++;
i++;
if(temp==1)
intindex=0;
fputc('
#'
while(buf[index]!
if(buf[index]!
fputc(buf[index],Out);
index++;
if(strcmp(ch,"
include<
)==0)
{
//因为上面程序没进行++就直接break所以这里就需要加1到下一个角标
while((cha=buf[i])!
)
i++;
if(cha=='
fprintf(Error,"
%d\tincludeendwithout'
break;
}
else
fprintf(Error,"
%d\tincludeformatiswrong\n"
elseif(temp==2)
define"
)!
=0)
i++;
while((cha=buf[i])=='
//fprintf(Error,"
i++;
if(buf[i]!
if(!
(isalpha(buf[i])))
%d\tdefineformatiswrong\n"
//此处意思是define后必须有变量名称
else
//在上面的break之前已经进行过i++;
所以这里可以直接用
while(!
isalpha(buf[i]))
%d\tdefinewithoutvatiateandname!
intindex=0;
intspace=0;
//计算在上一个字母之后第几次遇到空格
while(buf[index]!
if(buf[index]!
fputc(buf[index],Out);
space=0;
}
space++;
if(space==1&
index!
=0)
fputc('
index++;
//处理头文件
charhead(FILE*in)
charch;
if(late==0)
ch=getfirstc(in);
ch=firchar;
//即为#
fgets(buf,bufsize,in);
//fgets()读取in文件当前一行的内容为bufsize-1个字符的内容
intlen=strlen(buf);
buf[len-1]='
dealhead(buf);
//这条语句执行完毕后且找到'
就说明这行结束
line++;
//判断关键字
intkeyword(char*str)
inti;
for(i=0;
keywordTable[i]!
i++)
if(strcmp(str,keywordTable[i])==0)
returni+256;
//返回关键字对应的值
return-1;
//处理字母
voiddealAlpha()
charstr[50];
Variatevar;
Signsign;
intkey;
//记录字符串str对应的值。
str[0]=firchar;
for(i=start;
isalpha(buf[i])||isdigit(buf[i]);
i++)
str[i-start+1]=buf[i];
//将本行的第一个字符串赋值给str
str[i-start+1]='
start=i;
firchar=buf[start];
key=keyword(str);
if(key==-1)
{//说明不是关键字,是标识符。
即为变量,函数名一类的
var.id=VariateNum;
strcpy(var.name,str);
VarArr[VariateNum]=var;
VariateNum++;
sign.sym=TAG;
sprintf(sign.attr,"
%d"
var.id);
//暂时不知道什么用处
strcpy(sign.name,str);
SigArr[SignNum]=sign;
SignNum++;
else//说明是关键字
sign.sym=key;
strcpy(sign.attr,"
);
//sign.attr="
是不正确的,attr的长度大,后面的不能忽略
//判断是否在常量表里
intInConTable(char*name)
i<
ConstantNum;
if(strcmp(name,ConArr[i].name)==0)
returnConArr[i].id;
//处理数字
voiddealDigit()
intsymbol;
charword[100];
Constantconstant;
word[0]=firchar;
isdigit(buf[i]);
i++)
word[i-start+1]=buf[i];
if(buf[i]=='
.'
if(!
isdigit(buf[i]))
%d\tunavailabefloat\n"
return;
word[i-start]='
for(;
isdigit(buf[i]);
word[i-start+1]='
id=InConTable(word);
/**不在常量表里,新加项**/
if(id==-1)
constant.id=ConstantNum;
strcpy(constant.name,word);
ConArr[ConstantNum]=constant;
ConstantNum++;
id=constant.id;
sign.sym=CONFLOAT;
sprintf(sign.attr,"
id);
//changeinttostring
strcpy(sign.name,word);
SigArr[SignNum]=sign;
SignNum++;
else
firchar=buf[start];
constant.id=ConstantNum;
sign.sym=CONINT;
}
//处理注释
voiddealNotation()
charstr[3];
str[0]='
/'
str[2]='
if(buf[start]=='
)//确定是单行注释。
isNotation=1;
Signsign;
str[1]='
inti;
for(i=0;
borderTable[i]!
if(strcmp(str,borderTable[i])==0)
sign.sym=i+288;
break;
else//多行注释
isNotation=2;
*'
Signsign1,sign2;
intst;
sign1.sym=i+312;
strcpy(sign1.name,str);
strcpy(sign1.attr,"
SigArr[SignNum]=sign1;
if(Char!
fputc(Char,Out);
intlen;
len=strlen(buf);
charc=Char;
for(start=0;
start<
len;
start++)//将多行注释/*之前的非注释部分以及/*先进行输出
if(c=='
buf[start]=='
fputc('
else
fputc(buf[start],Out);
c=buf[start];
start++;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 天津 理工大学 编译 原理 实验