电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx
《电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。
intfadr;
intladr;
intparameter;
boolparameterIsDefined;
}proRecord;
/**********文法产生式如下**********
A:
程序A->
B
B:
分程序B->
beginC;
Mend
C:
说明与句表C->
DC'
C'
->
;
|ε
D:
说明语句D->
E|J
E:
变量说明E->
integerF
F:
变量F->
G
G:
标识符G->
HG'
G'
|IG'
H:
字母H->
a|...|z|A|...|Z
I:
数字I->
0|1|...|9
J:
函数说明J->
integerfunctionG(K);
L
K:
参数K->
F
L:
函数体L->
M:
执行语句表M->
NM'
M'
N:
执行语句N->
O|P|Q|W
O:
读语句O->
read(F)
P:
写语句P->
write(F)
Q:
赋值语句Q->
F:
=R
R:
算术表达式R->
SR'
R'
-SR'
S:
项S->
TS'
S'
*TS'
T:
因子T->
F|U|Z
U:
常数U->
V
V:
无符号整数V->
IV'
V'
W:
条件语句W->
ifXthenNelseN
X:
条件表达式X->
RYR
Y:
关系运算符Y->
<
|<
=|>
|>
=|=|<
>
Z:
函数调用Z->
G(R)
**********************************/
voidA();
voidB();
voidC();
voidC_();
voidD();
voidE();
voidF();
voidG();
voidJ();
voidK();
voidL();
voidM();
voidM_();
voidN();
voidO();
voidP();
voidQ();
voidR();
voidR_();
voidS();
voidS_();
voidT();
voidU();
voidW();
voidX();
voidY();
voidZ();
/*初始化函数:
从输入文件读取数据,建立各个文件,初始化全局变量*/
boolinit(intargc,char*argv[]);
/*结束处理函数,将var和pro数组中的元素输出到相应文件,填充输出文件*/
boolfinal();
/*错误处理函数,参数分别为行号、错误码和错误符号*/
boolerror(intlineNum,interrNum,constchar*sign);
/*获得所处目录路径,包括最后斜杠,或者为空*/
voidgetPath(char*in,char*out);
/*获得文件名,不包括扩展*/
voidgetFilename(char*in,char*out);
/*获得下一符号,true表示已到队尾,false表示还未到队尾*/
boolnextToken();
/*获得当前符号的下一字符,true表示已到'
\0'
*/
boolnextChar();
/*判断变量是否已存在*/
boolisVarExisted(char*vname,char*vproc,boolvkind);
/*判断过程是否已存在,参数为过程名*/
boolisProExisted(char*vname);
/*获得下一符号,指针不变*/
intgetNextToken();
charinput[MAX_COUNT][17];
//存放输入文件所有符号的数组
intkind[MAX_COUNT];
intinputCount;
//输入符号的数量
intpToken;
//指向当前输入符号
intpChar;
//指向当前输入符号中的当前字符
varRecordcurrentVar;
//存放当前变量的信息
proRecordcurrentPro;
//存放当前过程的信息
intlineNum;
//当前行号
varRecordvar[MAX_COUNT];
//存放变量名表项数组
proRecordpro[MAX_COUNT];
//存放过程名表项数组
intvarCount;
//变量的数量
intproCount;
//过程的数量
FILE*inFile;
//输入文件句柄
FILE*outFile;
//输出文件句柄
FILE*errFile;
//错误文件句柄
FILE*varFile;
//变量文件句柄
FILE*proFile;
//过程文件句柄
/*主函数*/
intmain(intargc,char*argv[])
{
if(init(argc,argv))
{
A();
final();
}
return0;
}
boolinit(intargc,char*argv[])
if(argc!
=2)
returnfalse;
else
char*inFilename=argv[1];
charoutFilename[MAX_COUNT]="
"
charerrFilename[MAX_COUNT]="
charvarFilename[MAX_COUNT]="
charproFilename[MAX_COUNT]="
charfilename[MAX_COUNT]="
charpath[MAX_COUNT]="
//获得文件名(不包括扩展名)和路径
getFilename(inFilename,filename);
getPath(inFilename,path);
//生成输出文件全部路径
strcat(outFilename,path);
//strcat(outFilename,"
\\"
);
strcat(outFilename,filename);
strcat(outFilename,"
.dys"
//生成错误文件全部路径
strcat(errFilename,path);
//strcat(errFilename,"
strcat(errFilename,filename);
strcat(errFilename,"
.err"
//生成变量文件全部路径
strcat(varFilename,path);
//strcat(varFilename,"
strcat(varFilename,filename);
strcat(varFilename,"
.var"
//生成过程文件全部路径
strcat(proFilename,path);
//strcat(proFilename,"
strcat(proFilename,filename);
strcat(proFilename,"
.pro"
//打开文件句柄
if((inFile=fopen(inFilename,"
r"
))&
&
(outFile=fopen(outFilename,"
w"
(errFile=fopen(errFilename,"
(varFile=fopen(varFilename,"
(proFile=fopen(proFilename,"
)))
{
//初始化单词指针、字符指针、行号、层次
inputCount=0;
pToken=0;
pChar=0;
lineNum=1;
//level=0;
//当前层次
//varCountInPro=0;
strcpy(currentPro.pname,"
currentPro.plev=0;
currentPro.varNum=0;
currentPro.parameter=-1;
varCount=0;
proCount=0;
//读取输入文件内容,初始化input数组
while(!
feof(inFile))
{
charstringOfLine[MAX_COUNT];
if(fgets(stringOfLine,MAX_COUNT,inFile))
{
charlineString[20]="
strncpy(lineString,stringOfLine,19);
char*kindString=strrchr(lineString,'
'
kind[inputCount]=atoi(kindString+1);
charstring[17]="
strncpy(string,stringOfLine,16);
char*lastString=strrchr(string,'
strcpy(input[inputCount],lastString+1);
inputCount++;
}
}
returntrue;
}
else
fclose(inFile);
fclose(outFile);
fclose(errFile);
fclose(varFile);
fclose(proFile