"编译原理实验报告1:PL/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函数的实现,可以准确地识别各种类型的单词,并进行相应的处理。这对于后续的语法分析和代码生成步骤有着重要的意义。在实验过程中,我们也遇到了一些问题和挑战,如错误处理和符号表管理等,但通过不断的调试和优化,我们最终成功完成了实验目标。期望通过这次实验,我们对编译原理的相关知识有了更深入的理解,并能够在实践中灵活运用。
2022-08-08 上传
2022-08-04 上传
2022-08-08 上传
2022-10-20 上传
2021-12-09 上传
2022-08-08 上传
2022-08-08 上传
lirumei
- 粉丝: 72
- 资源: 301
最新资源
- 高清艺术文字图标资源,PNG和ICO格式免费下载
- mui框架HTML5应用界面组件使用示例教程
- Vue.js开发利器:chrome-vue-devtools插件解析
- 掌握ElectronBrowserJS:打造跨平台电子应用
- 前端导师教程:构建与部署社交证明页面
- Java多线程与线程安全在断点续传中的实现
- 免Root一键卸载安卓预装应用教程
- 易语言实现高级表格滚动条完美控制技巧
- 超声波测距尺的源码实现
- 数据可视化与交互:构建易用的数据界面
- 实现Discourse外聘回复自动标记的简易插件
- 链表的头插法与尾插法实现及长度计算
- Playwright与Typescript及Mocha集成:自动化UI测试实践指南
- 128x128像素线性工具图标下载集合
- 易语言安装包程序增强版:智能导入与重复库过滤
- 利用AJAX与Spotify API在Google地图中探索世界音乐排行榜