"编译原理实验报告1:PL/0语言词法分析及关键字识别"

需积分: 0 0 下载量 192 浏览量 更新于2024-01-26 收藏 209KB DOCX 举报
编译原理实验报告1 实验题目:PL/0 语言编译器 学号: 日期:5.27 班级:17.4 姓名: Email:623581439@qq.com 一、实验环境 硬件环境:个人电脑 软件环境:C 二、实验说明 本项目是一个PL/0语言编译器,实现了词法分析功能。具体文件夹的作用如下: - test文件夹为完整项目 - input文件夹为输入 - pl0文件夹存放词法分析输出 - table文件夹存放符号表输出 - parse文件夹存放语法树输出 - code文件夹存放中间代码输出 - vm文件夹存放虚拟机输入输出 - 运行截图文件夹存放示例程序运行截图 三、实验内容 本实验是针对PL/0语言建立一个词法分程序。要求识别关键字(关键字表已给出)、标识符、常量。为方便处理,设置了三个全局变量:SYM、ID、NUM。 - SYM用于存放每个单词的类别,为内部编码的表示形式 - ID用于存放用户定义的标识符的值,即标识符字符串的机内表示 - NUM用于存放用户定义的数值 四、GETSYM函数的任务和实现 GETSYM函数需要完成以下任务: 1. 滤掉单词间的空格 2. 识别关键字,使用查关键字表的方法进行识别。当单词是关键字时,将对应的类别放在SYM变量中。例如,IF的类别为IFSYM,THEN的类别为THENSYM。 3. 识别标识符,标识符的类别为IDENT 4. 识别常量,常量的类别为NUM 具体实现过程如下: void GETSYM() { // 滤掉单词间的空格 while (isspace(ch)) { ch = getchar(); } // 识别关键字 if (isalpha(ch)) { int i = 0; while (isalnum(ch) || ch == '_') { token[i++] = ch; ch = getchar(); } token[i] = '\0'; // 查找token是否为关键字 for (int j = 0; j < KEYWORD_NUM; j++) { if (strcmp(token, keywords[j]) == 0) { SYM = keyword_type[j]; return; } } // 不是关键字则为标识符 SYM = IDENT; return; } // 识别常量 if (isdigit(ch)) { int i = 0; while (isdigit(ch)) { token[i++] = ch; ch = getchar(); } token[i] = '\0'; NUM = atoi(token); SYM = NUM; return; } // 识别其他符号 switch (ch) { case ';': SYM = SEMICOLON; break; // 其他符号处理... default: // 错误处理... break; } ch = getchar(); } 通过GETSYM函数的实现,我们可以实现对PL/0语言的词法分析。在获取每一个单词时,滤掉了空格,识别了关键字、标识符和常量,并存放在相应的全局变量中。 综上所述,通过本次实验我们成功构建了一个PL/0语言编译器,并实现了词法分析的功能。通过GETSYM函数的实现,可以准确地识别各种类型的单词,并进行相应的处理。这对于后续的语法分析和代码生成步骤有着重要的意义。在实验过程中,我们也遇到了一些问题和挑战,如错误处理和符号表管理等,但通过不断的调试和优化,我们最终成功完成了实验目标。期望通过这次实验,我们对编译原理的相关知识有了更深入的理解,并能够在实践中灵活运用。