• 大小: 146KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-07-05
  • 语言: 其他
  • 标签: 编译原理  

资源简介

带说明文档的编译原理课程设计,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


评论

共有 条评论