论文百事通 设为主页 会员登录 |  免费注册
代写论文 代发表论文 定制论文 毕业设计定制 期刊目录 黄金会员  
加入收藏 设为首页 |  收藏本站
首页 | 计算机 | 建筑工程 | 医药学 | 经济类 | 文学 | 英语 | 其它类别论文 | 计算机毕业设计 | 课程设计 | 毕业系统演示 | 投稿中心 | 下载中心 | 留言板
  查找论文

扩展PL0编译程序-编译原理课程设计

作者:论文百事通  来源:lwbst.com    【2006-09-19】    编辑:Admin

一.实验要求。
1.扩展一维数组 var 变量名[上界:下界]
2.扩展IF。。。ELSE
3.扩展++,--
4.扩展+=,-=
5.扩展Repeat。。。Untill(DoWhile)

二.实验分析。

  1. 扩充语句的语法描述图。

A++和A—的语法描述图:

编译课程设计

++A和—A的语法描述图:

语句:编译课程设计1

REPEAT UNTIL的语法描述图:

语句:编译课程设计1

+=和-=语法描述图:

语句:编译课程设计1


三.详细设计

  1. 扩展一维数组 var 变量名[上界:下界]
    1.  在SYMBOL和SYMOUT中添加LEPA, RIPA, DPT,ARRAYSYM和"LEPA", "RIPA", "DPT", "ARRAYSYM"分别表示符号[,],:,ARRAY.,
    2. 由于SYMBOL和SYMOUT中个数的增加,所以把有关i的判别由34改为43.
      1. 在VarDeclaration中添加的代码如下:

  void VarDeclaration(int LEV,int &TX,int &DX) {
int low,high,i;
if (SYM==IDENT)  {
GetSym();
if (SYM==LEPA) {
ENTER(ARRAY,LEV,TX,DX);
GetSym();
if (SYM==NUMBER) {
low=NUM;  GetSym();
if (SYM==DPT) GetSym();
else Error(45);   //在定义数组中缺少了:
if (SYM==NUMBER) {
high=NUM; GetSym();
if (SYM==RIPA) { TABLE[TX].bp.LOW=low;
TABLE[TX].bp.HIGH=high;
DX=DX+(high-low+1);
}  //SYM==NUMBER时遇到]的情形
else Error(43);  }  //if (SYM==NUMBER)
else if (SYM==IDENT) {
i=POSITION(ID,TX); //查找标识符在名字表中的位置
if (i==0) Error(11);
else
if (TABLE[i].KIND==CONSTANT)  high=TABLE[i].VAL;
else Error(46);  //定义数组时上界不合符要求
}  //  else if (SYM==IDENT)
else Error(46);
GetSym();
if (SYM==RIPA) {  TABLE[TX].bp.LOW=low;
TABLE[TX].bp.HIGH=high;
DX=DX+(high-low+1);
GetSym();
}  //SYM==IDENT时遇到]的情形
}  //  if (SYM==NUMBER)
else if (SYM==IDENT) {
i=POSITION(ID,TX);    //查找标识符在名字表中的位置
if (i==0) Error(11);
else
if (TABLE[i].KIND==CONSTANT)  low=TABLE[i].VAL;
else Error(47);  //定义数组时下界不合符要求
GetSym();
if (SYM==DPT) GetSym();
else Error(45);   //在定义数组中缺少了:
if (SYM==NUMBER) {
high=NUM; GetSym();
if (SYM==RIPA) { TABLE[TX].bp.LOW=low;
TABLE[TX].bp.HIGH=high;
DX=DX+(high-low+1);
}  //SYM==NUMBER时遇到]的情形
else Error(43);    }  //if (SYM==NUMBER)
else if (SYM==IDENT) {
i=POSITION(ID,TX); //查找标识符在名字表中的位置
if (i==0) Error(11);
else
if (TABLE[i].KIND==CONSTANT)  high=TABLE[i].VAL;
else Error(46);  //定义数组时上界不合符要求
}  //  else if (SYM==IDENT)
GetSym();
if (SYM==RIPA) {  TABLE[TX].bp.LOW=low;
TABLE[TX].bp.HIGH=high;
DX=DX+(high-low+1);
GetSym();
}  //SYM==IDENT时遇到]的情形
else Error(43);    }  //SYM==IDENT
else Error(47); }//if (SYM==LEPA)
else if (SYM==SEMICOLON || SYM==COMMA)
{ ENTER(VARIABLE,LEV,TX,DX);}
}
else Error(4);
} /*VarDeclaration()*/

    1. void FACTOR(SYMSET FSYS, int LEV, int &TX)中添加的代码如下:

 case ARRAY : GEN(LIT,LEV-TABLE[i].bp.LEVEL,TABLE[i].bp.LOW);
GEN(LIT,LEV-TABLE[i].bp.LEVEL,TABLE[i].bp.HIGH);
GetSym();
if (SYM==LEPA) {  GetSym();
if (SYM==NUMBER) GEN(LIT,0,NUM);
else if (SYM==IDENT) { int t;
t=POSITION(ID,TX);
if (t==0) Error(11);
else
if (TABLE[t].KIND==CONSTANT)
GEN(LIT,0,TABLE[t].VAL);
Else if (TABLE[t].KIND==VARIABLE)

GEN(LOD,LEV-TABLE[t].vp.LEVEL,TABLE[t].vp.ADR);
else Error(48);  //数组中的下标表示不正确
} //if (sym==ident)
else Error(48);
GetSym();
if (SYM==RIPA)  {
GEN(LAD,LEV-TABLE[i].bp.LEVEL,TABLE[i].bp.ADR);
GetSym();  }
}  //if (sym==lepa)
else Error(43);
break;   //把某一数组中的数入栈
case PROCEDUR: Error(21); break;
}
}
else
if (SYM==NUMBER) { //为数字
if (NUM>AMAX) { Error(31); NUM=0; }
GEN(LIT,0,NUM); GetSym();
}
else    //为表达式
if (SYM==LPAREN || SYM==LEPA) {  //为左括号或左方括号
GetSym(); EXPRESSION(SymSetAdd(RPAREN,FSYS),LEV,TX);
if (SYM==RPAREN || SYM==RIPA) GetSym();    //为右括号或右方括号
else Error(22);
}

    1. void STATEMENT(SYMSET FSYS,int LEV,int &TX)添加如下语句:

               else if (TABLE[i].KIND==ARRAY) {  GetSym();
GEN(LIT,LEV-TABLE[i].bp.LEVEL,TABLE[i].bp.LOW);
GEN(LIT,LEV-TABLE[i].bp.LEVEL,TABLE[i].bp.HIGH);
if (SYM==LEPA) {
GetSym();
if (SYM==NUMBER) GEN(LIT,0,NUM);
else if (SYM==IDENT) { int t;
t=POSITION(ID,TX);
if (t==0) Error(11);
else
if (TABLE[t].KIND==CONSTANT)
GEN(LIT,0,TABLE[t].VAL);
else if (TABLE[t].KIND==VARIABLE)

GEN(LOD,LEV-TABLE[t].vp.LEVEL,TABLE[t].vp.ADR);
else Error(48);  //数组中的下标表示不正确
} //if (sym==ident)
else Error(48);
GetSym();
if (SYM==RIPA)  {
GetSym();  }
else Error(43);
SYMBOL SOP;   /*对数组中某一个数进行赋值运算*/
SOP=SYM;    //在赋值语句中添加<标识符>+=/-=<表达式>

6.在void ENTER(OBJECTS K, int LEV, int &TX, int &DX)添加的代码如下:

     case ARRAY:
TABLE[TX].bp.LEVEL=LEV; TABLE[TX].bp.ADR=DX; DX++;
break;

 

 

  本课程设计包含完整源程序、可执行程序、设计文档。

 上一篇:推销员旅行问题求解-人工智能课程设计
 下一篇:数据结构课程设计报告-程序分析
本文版权归本站所有,欢迎转载。转载该文章时,请注明“来源:论文百事通 Http://www.lwbst.com”。
 
Copyright (C) 2008 Lwbst.com, All Rights Reserved 版权所有 论文百事通