《编译原理》课程(语法分析)实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》课程
实验报告
题目语法分析
专业计算机科学与技术
班级
学号
姓名
指导教师签名
华东理工大学信息学院计算机系
2013年5月8日
一. 实验序号:《编译原理》第二次实验
二. 实验题目:语法分析
三. 实验日期:2013.4-2013.5
四. 实验环境(操作系统,开发语言)
操作系统:Windows
开发语言:C
五. 实验内容(实验要求)
a)将复合语句语法中的“begin”改为“{”,“end”改为“}”。
b)将赋值语句的语法改为“赋值语句必须以分号;结束”。
c)将条件语句语法中的“条件”前增加“(”,“条件”后增加“)”但删除
“then”
d)“语句”语法中增加if-else语句:
if (<条件>) <语句> else <语句>
六. 实验体会(请手写,不能打印)(包括收获、心得体会、存在的问题及解决问题的
方法、建议等)
七. 实验结果(运行结果截图,关键源程序)
复合语句更改后的程序:
int CompoundStatement(int i)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"OB");
AWordIndex++;
StatementParsing(i+1);
while (ResultofWordTable[AWordIndex].W_Type==SEMICOLON)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"SEMICOLOM");
AWordIndex++;
StatementParsing(i+1);
}
if (ResultofWordTable[AWordIndex].W_Type==CB)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"CB");
AWordIndex++;
return 1;
}else
return 0;
}
赋值语句以分号结尾:
int AssignmentStatement(int i)
{ PrintParsing(ResultofWordT able[AWordIndex],i,"IDENTIFIER");
AWordIndex++;
if (ResultofWordTable[AWordIndex].W_Type==BECOMES)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"BECOMES");
AWordIndex++;
Expression(i+1);
if (ResultofWordTable[AWordIndex].W_Type==SEMICOLON)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"SEMICOLON");
AWordIndex++;
return 1;
}else
return 0;
}else
return 0;
}
条件语句修改后:
int ConditionalStatement(int i)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"IF");
AWordIndex++;
if (ResultofWordTable[AWordIndex].W_Type==LPAREN)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"LPAREN");
AWordIndex++;
Conditional(i);
if (ResultofWordTable[AWordIndex].W_Type==RPAREN)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"RPAREN");
AWordIndex++;
StatementParsing(i+1);
if (ResultofWordTable[AWordIndex].W_Type==ELSE)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"ELSE");
AWordIndex++;
StatementParsing(i+1);
return 1; }
}else
return 0;
}else
return 0;
}
其他一些程序代码:
主函数:
int main(int , char* )
{ FILE *fp;
if((fp=fopen(FILE_NAME,"r"))==NULL)
printf( "Can’t open the file!\n" );
if((fp=fopen(FILE_RESULT,"w+"))==NULL)
printf( " Can’t open the file!\n" );
char ch; //定义读到的每个字符
ch = fgetc(fp); //从文件中读入一个字符
while(ch != EOF) //按读入字符逐个输出在屏幕中
{ putchar(ch);
ch = fgetc(fp);
}
Initialize(); //初始化
printf("----------- Parsing Analysis!------------\n");
printf("Index Rows Word Analysis\n");
ParsingAnalysisFunction(Index);
printf("-------------------END------------------\n");
getchar();
return 0;
}
分程序分析:
int BlockParsing(int i)
{ PrintParsing(ResultofWordTable[AWordIndex],i-1,"BlockParsing");
if(ResultofWordTable[AWordIndex].W_Type==CONST){
PrintParsing(ResultofWordTable[AWordIndex],i,"CONST");
AWordIndex++;
PrintParsing(ResultofWordTable[AWordIndex],i,"oneConstantParsing");
oneConstantParsing(i+1); //常量声明分析
}
if(ResultofWordTable[AWordIndex].W_Type==VAR){
PrintParsing(ResultofWordTable[AWordIndex],i,"VAR");
AWordIndex++;
PrintParsing(ResultofWordTable[AWordIndex],i,"oneVarParsing");
oneVariableParsing(i+1); //变量声明分析
}
while(ResultofWordT able[AWordIndex].W_Type==PROCEDURE){ PrintParsing(ResultofWordTable[AWordIndex],i,"PROCEDURE");
AWordIndex++;
PrintParsing(ResultofWordTable[AWordIndex],i,"oneProcesureParsing");
ProcedureParsing(i+1); //过程声明分析
}
StatementParsing(i);
return 1;
}
过程调用语句:
int ProcedureCall(int i)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"CALL");
AWordIndex++;
if (ResultofWordTable[AWordIndex].W_Type==IDENTIFIER)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"IDENTIFIER");
AWordIndex++;
return 1;
}else
return 0;
}
循环语句分析:
int LoopStatement(int i)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"WHILE");
AWordIndex++;
Conditional(i);
if (ResultofWordTable[AWordIndex].W_Type==DO)
{ PrintParsing(ResultofWordTable[AWordIndex],i,"DO");
AWordIndex++;
StatementParsing(i+1);
return 1;
}else
return 0;
}
实验结果截图:。