TEST语言 -语法分析,词法分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告
实验名称:分析调试语义分析程序
TEST抽象机模拟器完整程序
保证能用!!!!!
一、实验目的
通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。
二、实验设计
程序流程图
extern int TESTScan(FILE *fin,FILE *fout);
FILE *fin,*fout; //用于指定输入输出文件的指针
int main()
{
char szFinName[300];
char szFoutName[300];
printf("请输入源程序文件名(包括路径):");
scanf("%s",szFinName);
printf("请输入词法分析输出文件名(包括路径):");
scanf("%s",szFoutName);
if( (fin = fopen(szFinName,"r")) == NULL)
{
printf("\n打开词法分析输入文件出错!\n");
return 0;
}
if( (fout = fopen(szFoutName,"w")) == NULL)
{
printf("\n创建词法分析输出文件出错!\n");
return 0;
}
int es = TESTScan(fin,fout);
fclose(fin);
fclose(fout);
if(es > 0)
printf("词法分析有错,编译停止!共有%d个错误!\n",es);
else if(es == 0)
{
printf("词法分析成功!\n");
int es = 0;
es = TESTparse(szFoutName); //调语法分析
if(es== true) printf("语法分析成功!\n");
else printf("语法分析错误!\n");
}
else
printf("词法分析出现未知错误!\n");
}
Parse.cpp
#include
#include
#include
#include
#include
// function
bool TESTparse();
bool compound_Stat();
bool program();
bool statement();
bool expression_stat();
bool expression();
bool bool_expr();
bool additive_expr();
bool term();
bool factor();
bool if_stat();
bool while_stat();
bool for_stat();
bool write_stat();
bool read_stat();
bool declaration_stat();
bool declaration_list();
bool statement_list();
bool compound_stat();
char token[20],token1[40]; //token保存单词符号,token1保存单词值FILE *fp; //用于指向输入文件的指针
int EsLine = 0;
typedef struct
{
int es;
int line;
}EsInf;
std::vector
//语法分析程序
void ProcessError(int es)
{
EsInf temp;
temp.es = es;
temp.line = EsLine;
StackEs.push_back(temp);
}
bool ReadFile(char *tok, char *tok1)
{
if(feof(fp))
return false;
fscanf(fp,"%s\t%s\n",tok,tok1);
printf("%s\t%s\n",tok,tok1);
EsLine++;
return true;
}
bool TESTparse(char *pFileName)
{
bool es = true;
if((fp=fopen(pFileName,"r"))==NULL)
{
printf("\n打开%s错误!\n",pFileName);
return false;
}
else
program();
if(!feof(fp))
ProcessError(9);
fclose(fp);
printf("=====语法分析结果!=====\n");
if(StackEs.size() == 0)
{
printf("语法分析成功!\n");
return true;
}
else
{
int i;
for(i = 0; i < StackEs.size(); i++)
{
printf("在第%d行",StackEs[i].line);
switch(StackEs[i].es)
{