资源简介
带说明文档的编译原理课程设计,PL0语言可看成是Pascal [1] 语言的子集,它的编译程序是一个编译解释执行系统。
代码片段和文件信息
#include
#include
#include“PL0.h“
#include
//运行时的数据栈大小,在interpret函数中出现
#define stacksize 500
/*********************************************************************************
** 在看源程序之前,请始终记住 **
** sym表示的是当前字符串的类型, **
** num表示的数字, **
** id中存放的是字符串, **
** 记住这点在看源程序的时候非常重要。 **
** 另外,还要记住的是nxtlev数组中存放的是后继符号集 **
**********************************************************************************/
int main()
{
bool nxtlev[symnum];//这个数组表示的是当前语句的后继符号集合,一共有32个
printf(“Input pl/0 file?“);//输入文件的路径
scanf(“%s“ fname);
fin = fopen(fname “r“);//以只读打开文件,fin文件指针
if (fin)
{
printf(“List object code? (Y/N)“);
scanf(“%s“ fname);
listswitch = (fname[0] == ‘y‘ || fname[0] == ‘Y‘);//listswitch用于列举代码
printf(“List symbol table? (Y/N)“);
scanf(“%s“ fname);
tableswitch = (fname[0] == ‘y‘ || fname[0] == ‘Y‘);//tableswitch表示是否输出table表
//该表类似于22页的表
fa1 = fopen(“fa1.tmp“ “w“);//以可写方式打开文件,对于本程序其实是新建一个文件,fa1文件中存储的是源程序
fprintf(fa1 “Input pl/0 file?“);//将“Input pl/0 file?“输入文件中
fprintf(fa1 “%s\n“ fname);//同上
init(); //初始化
err = 0;
cc = cx = ll = 0;
ch = ‘ ‘;
if (-1 != getsym())
{
//如果程序开始是对的,则往下执行
//fa存放的是模拟程序的代码
//fas存放的是table表中的数据
fa = fopen(“fa.tmp“ “w“);//以可写形式打开
fas = fopen(“fas.tmp“ “w“);//同上
addset(nxtlev declbegsys statbegsys symnum);//symnum=32,初始化后继符号集一共有32个,即nxtlev数组
nxtlev[period] = true;//整个程序可以只有一个‘.‘,即程序是空的也可以
//block是编译程序的主程序,是分程序的分析处理过程,其里面调用了大部分程序
//耐心看
//请记住在block程序开始的时候,只读取了源程序的一个语句单位
/*调用编译程序*/
if (-1 == block(0 0 nxtlev))
{
//当程序出错的时候,则关闭以下文件,并退出程序
fclose(fa);//fa输出虚拟机代码
fclose(fa1);//输出源文件及其各行对应的首地址
fclose(fas);//输出名字表
fclose(fin);
printf(“\n“);
return 0;
}
fclose(fa);
fclose(fa1);
fclose(fas);
//如果在源程序的结尾没有‘.‘,则报错
if (sym != period)
{
error(9);
}
//err=0表示源程序没有错误
if (err == 0)
{
fa2 = fopen(“fa2.tmp“ “w“);//打开fa2文件,依次执行里面的语句,输出源程序结果
interpret(); //模拟计算机执行源程序
fclose(fa2);
}
else
{
printf(“Errors in pl/0 program“); //如果源程序有错的话,会这样
}
}
fclose(fin);
}
else
{
printf(“Can‘t open file! \n“);
}
printf(“\n“);
system(“pause“);
return 0;
}
/* 初始化*/
void init()
{
int i;
/*设置单字符符号*/
for (i = 0; i <= 255; i++)
{
ssym[i] = nul;//nul为0,将ssym初始化为0
}
//ssym大小为256,可以表示所有的ASCLL码,enum symbol枚举
ssym[‘+‘] = plus;
ssym[‘-‘] = minus;
ssym[‘*‘] = times;
ssym[‘/‘] = slash;
ssym[‘(‘] = lparen;
ssym[‘)‘] = rparen;
ssym[‘=‘] = eql;
ssym[‘‘] = comma;
ssym[‘.‘] = period;
ssym[‘#‘] = neq;
ssym[‘;‘] = semicolon;
ssym[‘[‘] = lbracket; /*添加左括号 [ */
ssym[‘]‘] = rbracket; /*添加右括号 ] */
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 211 2017-07-14 09:46 对PL0语言及其编译器进行扩充和修改\测试文件\test1.txt
文件 194 2017-07-14 16:48 对PL0语言及其编译器进行扩充和修改\测试文件\test2.txt
文件 211 2017-07-14 16:50 对PL0语言及其编译器进行扩充和修改\测试文件\test3.txt
文件 40496 2017-07-14 09:42 对PL0语言及其编译器进行扩充和修改\源程序\pl0.cpp
文件 6200 2017-07-13 09:23 对PL0语言及其编译器进行扩充和修改\源程序\pl0.h
文件 141596 2018-05-13 19:33 对PL0语言及其编译器进行扩充和修改\编译原理课程设计说明书.docx
目录 0 2018-05-13 19:32 对PL0语言及其编译器进行扩充和修改\测试文件
目录 0 2018-05-13 19:32 对PL0语言及其编译器进行扩充和修改\源程序
目录 0 2018-05-13 19:34 对PL0语言及其编译器进行扩充和修改
----------- --------- ---------- ----- ----
188908 9
- 上一篇:关于信噪比的计算,高斯白噪声
- 下一篇:随机信号分析常建平课后答案
相关资源
- 编译原理大作业 完整编译器
- 编译原理课程设计——简单编译器
- 编译原理--词法分析器+语法分析器 源
- pl0语法分析器
- 编译原理 三地址代码生成器
- 编译原理实验报告+源代码 预测分析法
- LL(1)分析过程模拟
- 编译原理实验常工院版
- 编译原理FOR循环语句的翻译程序设计
- LR(0)完整的语法分析方法(拓广文
- OUC编译原理全部实验
- 编译原理上机源代码LR语法分析器
- 编译原理LR0分析代码完整
- 哈工大编译原理实验三语义分析实验
- 编译原理实验报告,词法分析,语法
- 算符优先分析程序的设计可趁设计
- 山东大学编译原理实验
- 编译原理语法分析实验报告
- 编译原理-语法分析-LL1
- 编译原理优先算法代码,及详细实验
- 编译原理 课后习题答案 陈意云 张昱
- 编译原理语法树的实现
- 编译原理实验MiniPascal编译器设计 Fl
- 子集构造法NFA的确定化
- 程序设计语言 编译原理 第三版 国防
- 编译原理First集Follow集求解
- 云南大学软件学院编译原理实验1-5
- 山东科技大学编译原理课程设计
- 编译原理 实现TINY+编译器 课程实验报
- 广工编译原理历年真题及答案
评论
共有 条评论