- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                PL0源代码(C语言版)
                    
                         /*PL/0 编译系统C版本头文件 pl0.h*/
# define norw 13        //a number of reserved word         /*关键字个数*/ 
# define txmax 100      //length of identifier table         /*名字表容量*/
# define nmax  14       //max number of digits in numbers         /*number的最大位数*/
# define al 10           //length of identifier        /*符号的最大长度*/
# define amax 2047      //maximum address         /*地址上界*/
# define levmax 3         //max depth of block nesting       /*最大允许过程嵌套声明层数[0,lexmax]*/
# define cxmax 200      //size of code array        /*最多的虚拟机代码数*/
/*符号*/
enum symbol{
	 nul,    ident,     number,     plus,     minus,
	 times,   slash,   oddsym,   eql,     neq, //slash斜线 
lss,     leq,      gtr,     geq,     lparen, //leq :less than or equal to; gtr: great than;lparen:left parenthesis
rparen,  comma,   semicolon,period,  becomes,//comma逗号 semicolon分号 period句号 becomes赋值号 
beginsym, endsym, ifsym,    thensym,  whilesym,
writesym, readsym,  dosym,  callsym,  constsym,
varsym,  procsym,
};
#define symnum 32
/*-------------*/
enum object{   //object为三种标识符的类型 
   constant,
   variable,
   procedur,
};
/*--------------*/
enum fct{   //fct类型分别标识类PCODE的各条指令
lit, opr,  lod,  sto,  cal,  inte,  jmp,  jpc,  //书本P23 
};
#define fctnum 8
/*--------------*/
struct instruction   //指令 
{
  enum fct f;  //功能码 
  int l;     //层次差 
  int a;      //P23
};
FILE * fas;  //输出名字表 
FILE * fa;   //输出虚拟机代码 
FILE * fa1;  //输出源文件及其各行对应的首地址 
FILE * fa2;  //输出结果 
bool tableswitch;       //显示名字表与否  
bool listswitch;        //显示虚拟机代码与否 
char ch;                //获取字符的缓冲区,getch使用 
enum symbol sym;        //当前符号 
char id[al+1];          //当前ident,多出一个字节用于存放0 
int  num;               //当前number 
int cc,ll;              //getch使用的计数器,cc表示当前字符(ch)的位置 
int cx;                 //虚拟机代码指针,取值范围[0,cxmax-1]
char line[81];          //读取行缓冲区 
char a[al+1];           //临时符号,多出的一个字节用于存放0 
struct instruction code[cxmax];   //存放虚拟机代码的数组 
char word[norw][al];              //保留字
enum symbol wsym[norw];           //保留字对
                
原创力文档
                        

文档评论(0)