资源简介
本实验是根据张素琴的编译原理第二版的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
相关资源
- 北邮-编译原理-词法分析
- 现代编译原理-C语言描述
- 编译原理实验报告+代码+使用说明
- 编译原理课程设计-C语言子集编译器
- 赋值语句翻译c语言实现四元式
- 编译原理用C++消除左递归
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- C语言实现51单片机和ADC0809芯片的AD模
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- 山东大学编译原理实验源代码c++版
- 简单函数绘图语言的解释器
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 嵌入式技术基础与实践.pdf
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- MFC42UD.libMFCd42UD.libMFCN42UD.libMFC042UD.li
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
- 温度检测控制系统:51单片机与adc08
评论
共有 条评论