如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
5.9说明语句的翻译5.9.1类型说明语句的翻译类型说明的属性翻译文法Varable→iden{$$=Entry($1);/*变量在符号表中序号*/VarList[$$].CAT=SimVar;/*种属为简单变量*/VarList[$$].IsPointer=0;/*指针标志*/VarList[$$].ADDR=NULL;/*尚未分配内存空间,下同*/}|‘*’iden/*指针*/{$$=Entry($1);/*变量在符号表中序号*/VarList[$$].CAT=SimVar;/*种属为简单变量*/VarList[$$].IsPointer=1;/*指针标志*/VarList[$$].ADDR=NULL;}|ArrayVar{$$=$1;}ArrayMSG→iden[number..number{$$=Entry($1);VarList[$$].CAT=Array;/*种属为数组*/VarLIst[$$].IsPointer=0;VarList[$$].ADDR->DIM=1;/*记录维数;下面为内情向量申请空间,并填入第一维下标信息,其中,前两个单元(下标为[0]和[1])用来存放a、C之值(此时暂不填写),n值可由DIM保存,因此不必另存。*/VarList[$$].ADDR->Vector=malloc(5*sizeof(int));VarList[$$].ADDR->Vector[2]=$3;/*第一维下界*/VarList[$$].ADDR->Vector[3]=$5;/*第一维上界*/VarList[$$].ADDR->Vector[4]=$5-$3+1/*第一维界差*/}|*iden[number..number/*指针数组*/{$$=Entry($1);VarList[$$].CAT=Array;/*种属为数组*/VarList[$$].IsPointer=1;VarList[$$].ADDR->DIM=1;/*记录维数.下面的填写工作与上一产生式相同,注释略*/VarList[$$].ADDR->Vector=malloc(5*sizeof(int));VarList[$$].ADDR->Vector[2]=$4;/*第一维下界*/VarList[$$].ADDR->Vector[3]=$6;/*第一维上界*/VarList[$$].ADDR->Vector[4]=$6-$4+1/*第一维界差*/}|ArrayMSG,number..number{intdim=VarList[$$].ADDR->DIM+1;$$=$1;VarList[$$].ADDR->DIM++;/*维数加1*//*下面增加向量空间,记录新一维的信息*/VarList[$$].ADDR->Vector=realloc(VarList[$$].ADDR->Vector,(3*dim+2)*sizeof(int));/*下面记录当前维的下、上界及界差*/VarList[$$].ADDR->Vector[3*dim-1]=$3;VarList[$$].ADDR->Vector[3*dim]=$5;VarList[$$].ADDR->Vector[3*dim+1]=$5-$3+1;}ArrayVar→ArrayMSG]{/*传递数组名在表中序号*/$$=$1;FillArrMSG_C($$);/*计算并填写数组内情向量的C值*/}Type→int{$$.Type=INT;}|real{$$.Type=REAL;}|boolean{$$.Type=BOOL;}|SelfDef{$$.Type=$1.Type;}DefVarable→TypeVarable{FillVarType($2,$1.Type);$$.Type=$1.Type;}|DefVarable,Varable{FillVarType($3,$1.Type);$$.Type=$1.Type;}在上面的属性翻译文法中,我们引入了两个辅助函数voidFillVarType(intNO,intTYPE)和voidFillArrMSG_C(intNO)第一个函数完成将类型信息TYPE填写到符号表中的第NO项之类型(type)域的工作;第二个函数计算并填写符号表中第NO登记项ADDR所指示的内情向量中的C(CONSTPART)值。非终结符SelfDef用于描述用户自定义数据类型,其文法定义将在5.9.2节中讨论,这里,我们只需知道它具有一个属性Type(用大于零的整型数表示)。对于简单数据类型(如real、int等),我们规定用负整数表示;为了便于阅读,这里使用了助记符(常量定义)。另外