资源简介
编译原理(张素琴版)的PL/0编译程序的C语言代码,在目录中附有测试文本文件test.txt,该程序可用于编译原理的学习
代码片段和文件信息
/*
*录入:codecjw
*本程序有两文件:pl.c和pl.h
*pl/0语法请参考清大编译原理(张素琴版),压缩包中test.txt文件符合pl/0语法
*使用方法:
*运行后输入pl/0源程序文件名
*回答是否输出虚拟机代码
*回答是否输出名字表
*fa.tmp输出虚拟机代码
*fa1.tmp输出源文件及其各行对应的首地址
*fa2.tmp输出结果
*fas.tmp输出名字表
*特别说明:虚拟机代码的inte与int同效
*/
#include
#include“pl.h“
#include
#define stacksize 500
int main()
{
bool nxtlev[symnum];
printf(“input pl/0 file?“);
scanf(“%s“fname);
fin=fopen(fname“r“);
if(fin)
{
printf(“list object code?(Y/N)“);
scanf(“%s“fname);
listswitch=(fname[0]==‘y‘||fname[0]==‘Y‘);
printf(“list symbol table?(Y/N)“);
scanf(“%s“fname);
tableswitch=(fname[0]==‘y‘||fname[0]==‘Y‘);
fal=fopen(“fal.tmp““w“);
fprintf(fal“input pl/0 file?“);
fprintf(fal“%s\n“fname);
init();
err=0;
cc=cx=ll=0;
ch=‘ ‘;
if(-1!=getsym())
{
fa=fopen(“fa.tmp““w“);
fas=fopen(“fas.tmp““w“);
addset(nxtlevdeclbegsysstatbegsyssymnum);
nxtlev[period]=true;
if(-1==block(00nxtlev))
{
fclose(fa);
fclose(fal);
fclose(fas);
fclose(fin);
printf(“\n“);
return 0;
}
fclose(fa);
fclose(fal);
fclose(fas);
if(sym!=period)
{
error(9);
}
if(err==0)
{
fa2=fopen(“fa2.tmp““w“);
interpret();
fclose(fa2);
}
else
{
printf(“errors in pl/0 program“);
}
fclose(fin);
}
else
{
printf(“can‘t open file!\n“);
}
printf(“\n“);
return 0;
}
}
void init()
{
int i;
for(i=0;i<255;i++)
{
ssym[i]=nul;
}
ssym[‘+‘]=plus;
ssym[‘-‘]=minus;
ssym[‘*‘]=times;
ssym[‘/‘]=slash;
ssym[‘(‘]=lparen;
ssym[‘)‘]=rparen;
ssym[‘=‘]=eql;
ssym[‘‘]=comma;
ssym[‘.‘]=period;
ssym[‘#‘]=neq;
ssym[‘;‘]=semicolon;
strcpy(&(word[0][0])“begin“);
strcpy(&(word[1][0])“call“);
strcpy(&(word[2][0])“const“);
strcpy(&(word[3][0])“do“);
strcpy(&(word[4][0])“end“);
strcpy(&(word[5][0])“if“);
strcpy(&(word[6][0])“odd“);
strcpy(&(word[7][0])“procedure“);
strcpy(&(word[8][0])“read“);
strcpy(&(word[9][0])“then“);
strcpy(&(word[10][0])“var“);
strcpy(&(word[11][0])“while“);
strcpy(&(word[12][0])“write“);
wsym[0]=beginsym;
wsym[1]=callsym;
wsym[2]=constsym;
wsym[3]=dosym;
wsym[4]=endsym;
wsym[5]=ifsym;
wsym[6]=oddsym;
wsym[7]=procsym;
wsym[8]=readsym;
wsym[9]=thensym;
wsym[10]=varsym;
wsym[11]=whilesym;
wsym[12]=writesym;
strcpy(&(mnemonic[lit][0])“lit“);
strcpy(&(mnemonic[opr][0])“opr“);
strcpy(&(mnemonic[lod][0])“lod“);
strcpy(&(mnemonic[sto][0])“sto“);
strcpy(&(mnemonic[cal][0])“cal“);
strcpy(&(mnemonic[inte][0])“inte“);
strcpy(&(mnemonic[jmp][0])“jmp“);
strcpy(&(mnemonic[jpc][0])“jpc“);
for(i=0;i {
declbegsys[i]=false;
statbegsys[i]=false;
facbegsys[i]=false;
}
declbegsys[constsym]=true;
declbegsys[varsym]=true;
declbegsys[procsym]=true;
statbegsys[beginsym]=true;
statbegsys[callsym]=true;
statbegsys[ifsym]=true;
statbeg
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2009-03-23 00:10 pl
文件 19618 2008-06-03 16:47 pl\pl.c
文件 4291 2008-03-25 16:59 pl\pl.dsp
文件 529 2008-03-25 15:31 pl\pl.dsw
文件 3642 2008-03-25 16:28 pl\pl.h
文件 50176 2009-03-23 00:09 pl\pl.ncb
文件 57856 2009-03-23 00:09 pl\pl.opt
文件 1333 2009-03-23 00:09 pl\pl.plg
文件 59 2008-06-01 15:01 pl\test.txt
----------- --------- ---------- ----- ----
137504 9
相关资源
- 北邮-编译原理-词法分析
- 现代编译原理-C语言描述
- 编译原理实验报告+代码+使用说明
- 编译原理课程设计-C语言子集编译器
- 赋值语句翻译c语言实现四元式
- 编译原理用C++消除左递归
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- 山东大学编译原理实验源代码c++版
- 简单函数绘图语言的解释器
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
- C语言实现一个编译器-编译原理南开大
- 编译原理课程实验报告词法分析器及
- 编译原理与技术李文生:LR分析法C+
- C语言简化编译器前端 编译原理 LR1
评论
共有 条评论