编译原理课件-PL0编译程序
- 格式:ppt
- 大小:774.01 KB
- 文档页数:118


《编译原理》(实验部分)
实验3_PL0语法分析
一、实验目的
加深和巩固对于语法分析的了解和掌握;给出PL/0文法规范,要求编写PL/0语言的语法分析程序。
二、实验设备
1、PC 兼容机一台;操作系统为WindowsWindowsXP。
2、Visual C++ 6.0 或以上版本, Windows 2000 或以上版本,汇编工具(在Software 子目录下)。
三、实验原理
PL/O语言的编译程序,是用高级语言PASCAL语言书写的。整个编译过程是由一些嵌套及并列的过程或函数完成。语法分析是由过程BLOCK完成。采用自顶向下的递归子程序法。所产生的目标程序为假象栈式计算机的汇编语言。对目标程序的执行是由PASCAL语言书写的解释程序进行的。
四、实验步骤
实验代码
int lp=0;
int rp=0;
#define getsymdo if(-1==getsym()) return -1
#define expressiondo() if(-1==expression()) return -1
#define termdo() if(-1==term()) return -1
#define factordo() if(-1==factor()) return -1
int expression();
//语法分析
int factor() {
if(sym!=ident &&sym!=number&&sym!=lparen)
{
err++;
if(err==1) printf("语法错误: \n");
printf("error----Factor Needs Ident or Number or
Lparen\n");
}
if ((sym == ident) || (sym == number) || (sym == lparen))
{
if (sym == ident)
北华航天工业学院
《编译原理》课程实验报告
课程实验题目: 递归下降子程序实验
作者所在系部: 计算机科学与工程系
作者所在专业: 计算机科学与技术
作者所在班级: xxxx
作 者 学 号: xxxxx _
作 者 姓 名 : xxxx
指导教师姓名: xxxxx
完 成 时 间 : 2011年3月28日
一、实验目的
通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的优缺点。
二、实验内容及要求
1.针对算术表达式文法:E→TE’
E’ → +TE’|ε
T→FT’
T’ →*FT’ |ε
F→(E) |i
为其编写递归下降子程序,判定某个算术表达式是否正确:如j+k*m,j*k+m
输入:其输入数据应该为词法分析器输出的记号形式:i+i*i,i*i+i
输出:分析结果:算术表达式结构正确或结构错误。
三、实验程序设计说明
1.实验方案设计
各个函数之间的调用关系如下图所示:
2.程序源代码
源代码如下:
#include
#include #include
#include
char a[10];
int lookahead=0;
void E1();
void T();
void T1();
void F();
void E()
{
printf("E->TE'\n");
T();
编译原理课内试验内容和要求
对PL/0作以下修改扩充:
(1)增加单词:保留字 ELSE,FOR,TO,DOWNTO,RETURN
运算符 *=,/=,++,--,&,||,!
(2)修改单词:不等号# 改为 <>
(3)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。
要求和说明
(1)提交实验报告和光盘
(各班统一制作一张光盘,每人的目录名:xx姓名,xx是学号末2位)。
(2)在程序运行界面突出显示:
设计者的班级、学号和姓名;
开始调试时间;
完成调试时间。
(3)实验报告内容
1)概述: 源、目标语言,实现工具(平台),运行平台
2)结构设计说明
各功能模块描述
3)主要成分描述
① 符号表
② 运行时存储组织和管理
③ 语法分析方法
④ 中间代码表示
4)测试用例
5)开发过程和完成情况
(4)光盘内含:
① 扩充后的PLO编译程序的源程序文件和可执行程序文件;
② 测试用例的PL0语言源程序和编译运行结果;
③ 实验报告文档(令需交打印文档一份)。
(5)成绩分五档:优,良,中,及格和不及格。
根据完成的程序和报告的质量评定成绩。
如果有下列情况,则视情节严重程度,成绩下降若干档次,直至不及格:
光盘文件含有病毒或者内容不能正确读出;
抄袭、复制别人程序或文档;
未能按时提交报告和光盘文件。
附件1 小组成员:
程序清单
#include<>
#include<>
#include<>
void error(int n);
void getsym();
"。\n");
break;
case 10:printf("语句之间漏了\";\"。\n");
break;
case 11:printf("标识符未说明。\n");
break;
case 12:printf("赋值语句中,赋值号左部标识符属性应是变量。\n");
break;
case 13:printf("赋值语句左部标识符后应是赋值号\":=\"。\n");
break;
case 14:printf("call后应为标识符。\n");
break;
case 15:printf("call后标识符属性应为过程。\n");
break;
case 16:printf("条件语句中丢了\"then\"。\n");
break;
case 17:printf("丢了\"end\"或\";\"。\n");
break; case 18:printf("while型循环语句中丢了\"do\"。\n");
break;
case 19:printf("语句后的符号不正确。\n");
break;
case 20:printf("应为关系运算符。\n");
break;
case 21:printf("表达式内标识符属性不能是过程。\n");
break;
case 22:printf("表达式中漏掉右括号\")\"。\n");
break;
case 23:printf("因子后的非法符号。\n");