• 大小: 45KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-07-31
  • 语言: C/C++
  • 标签: 编译原理  C0  PL/0  

资源简介

本实验是根据张素琴的编译原理第二版的PL/0实验改写的C语言编译器。

资源截图

代码片段和文件信息

/* 
Windows 下c语言PL/0编译程序
在Visual C++ 6.0和Visual C.NET上运行通过
使用方法:
运行后输入PL/0源程序文件名
回答是否输出虚拟机代码
回答是否输出名字表
fa.tmp输出虚拟机代码
fa1.tmp输出源文件及其各行对应的首地址
fa2.tmp输出结果
fas.tmp输出名字表
*/

#include 
#include “c0.h“
#include “string.h“
/* 解释执行时使用的栈 */
#define stacksize 500 
int main()
{
init(); /* 初始化 */
fas=fopen(“fas.tmp““w“);
fa1=fopen(“fa1.tmp““w“);
printf(“请输入要编译的c0程序所在的文件:“);
fprintf(fa1“Input file? “);
scanf(“%s“fname); /* 输入文件名 */
fin=fopen(fname“r“);
if(fin)
{
fprintf(fa1“%s\n“fname);
printf(“是否输出虚拟机代码?(Y/N)“); /* 是否输出虚拟机代码 */
scanf(“%s“fname);
listswitch=(fname[0]==‘y‘||fname[0]==‘Y‘);
printf(“是否输出名字表?(Y/N)“); /* 是否输出名字表 */
scanf(“%s“fname);
tableswitch=(fname[0]==‘y‘||fname[0]==‘Y‘);
err=0;
cc=cx=ll=0;
ch=‘ ‘;
kk=al-1; //al是字符的最大长度 13

if(-1!=getsym())
{
fa=fopen(“fa.tmp““w“);
fa2=fopen(“fa2.tmp““w“);

if(-1==block(000)) /* 调用编译程序 */
{
fclose(fa);
fclose(fa1);
fclose(fin);
printf(“\n“);
return 0;
}
fclose(fa);
fclose(fa1);
if(sym!=rbparen)error(9);
if(err==0)
{
interpret(); /* 调用解释执行程序 */
}
else
{
printf(“Errors in c0 program“);
}
}
fclose(fin);
}
else
{
printf(“Can‘t open file!\n“);
fprintf(fa1“Can‘t open file!\n“);
fclose(fa1);
}
fclose(fas);
printf(“\n“);
return 0;
}




/*在适当的位置显示错误*/
void error(int n)
{
char space[81];

space[cc-1]=0; /* 出错时当前符号已经读完,所以cc-1 */ 
printf(“****%s!%d\n“spacen);
fprintf(fa1“****%s!%d\n“spacen);
err++;

}

/* 词法分析,获取一个符号 */
int getsym()
{
int ijk;
while(ch==‘ ‘||ch==10||ch==9) /* 忽略空格、换行和TAB */
{
getchdo;
}
if(ch>=‘a‘&&ch<=‘z‘)
{
/* 名字或保留字以a..z开头 */
k=0;
do
{
if(k {
a[k]=ch;
k++;
}
getchdo;
}
while(ch>=‘a‘&&ch<=‘z‘||ch>=‘0‘&&ch<=‘9‘);
a[k]=0;//ASCII码0表示停止
strcpy(ida);//id为当前ident
i=0;
j=norw-1;//norw为关键字个数9个
do /* 搜索当前符号是否为保留字 */
{
k=(i+j)/2;
if(strcmp(idword[k])<=0)j=k-1;
if(strcmp(idword[k])>=0)i=k+1;
}
while(i<=j);
if(i-1>j)sym=wsym[k]; 
else sym=ident; /* 搜索失败则,是名字或数字 */
}
else
{
if(ch>=‘0‘&&ch<=‘9‘)
{ /* 检测是否为数字:以0..9开头 */
k=0;
num=0;
sym=number;
do
{
num=10*num+ch-‘0‘;
k++;
getchdo;
}
while(ch>=‘0‘&&ch<=‘9‘); /* 获取数字的值 */
k--;
if(k>nmax)error(30);//nmax表示数字最大位数14
}
else
{
if(ch==‘=‘) /* 检测赋值符号 */
{
sym=becomes;
getchdo;

}
else
{
if(ch==‘<‘) /* 检测小于或小于等于符号 */
{
getchdo;
if(ch==‘=‘)
{
sym=leq;//小于等于
getchdo;
}
else
{
sym=lss;//小于
}
}
else
{
if(ch==‘>‘) /* 检测大于或大于等于符号 */
{
getchdo;
if(ch==‘=‘)
{
sym=geq;//大于等于
getchdo;
}
else
{
sym=gtr;//大于
}
}
else

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3555  2015-01-04 19:43  c0.h

     文件      23596  2015-01-08 11:44  c0.c

     文件        258  2015-01-04 17:56  c0.1.txt

     文件     204866  2015-01-08 10:28  c0.exe

----------- ---------  ---------- -----  ----

               232275                    4


评论

共有 条评论