电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx

上传人:b****1 文档编号:13924467 上传时间:2022-10-15 格式:DOCX 页数:34 大小:21.38KB
下载 相关 举报
电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx_第1页
第1页 / 共34页
电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx_第2页
第2页 / 共34页
电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx_第3页
第3页 / 共34页
电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx_第4页
第4页 / 共34页
电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx

《电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。

电子科技大学计算机学院编译原理实验语法分析Word文档下载推荐.docx

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

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

当前位置:首页 > 高等教育 > 医学

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

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