一.实验要求。
1.扩展一维数组 var 变量名[上界:下界]
2.扩展IF。。。ELSE
3.扩展++,--
4.扩展+=,-=
5.扩展Repeat。。。Untill(DoWhile)
二.实验分析。
- 扩充语句的语法描述图。
A++和A—的语法描述图:
++A和—A的语法描述图:
语句:
REPEAT UNTIL的语法描述图:
语句:
+=和-=语法描述图:
语句:
三.详细设计
- 扩展一维数组 var 变量名[上界:下界]
- 在SYMBOL和SYMOUT中添加LEPA, RIPA, DPT,ARRAYSYM和"LEPA", "RIPA", "DPT", "ARRAYSYM"分别表示符号[,],:,ARRAY.,
- 由于SYMBOL和SYMOUT中个数的增加,所以把有关i的判别由34改为43.
- 在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()*/
- 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);
}
- 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;