?? analyze.cpp
字號(hào):
/*如果不是主程序,則記錄此時(shí)偏移,用于下面填寫過程信息表的noff信息*/
else
savedOff = Off;
}
/************************************************************/
/* 函數(shù)名 procDec */
/* 功 能 該函數(shù)處理過程聲明的語義分析 */
/* 說 明 在當(dāng)前層符號(hào)表中填寫過程標(biāo)識(shí)符的屬性;在新層符號(hào) */
/* 表中填寫形參標(biāo)識(shí)符的屬性。 */
/************************************************************/
void procDecPart(TreeNode * t)
{
TreeNode * p =t;
SymbTable * entry = HeadProcess(t); /*處理過程頭*/
t = t->child[1];
/*如果過程內(nèi)部存在聲明部分,則處理聲明部分*/
while (t!=NULL)
{
switch ( t->nodekind )
{
case TypeK: TypeDecPart(t->child[0]); break ;
case VarK : VarDecPart(t->child[0]); break ;
/*如果聲明部分有函數(shù)聲明,則跳出循環(huán),先填寫noff和moff等信息,*
*再處理函數(shù)聲明的循環(huán)處理,否則無法保存noff和moff的值。 */
case ProcDecK: break;
default:
ErrorPrompt(t->lineno,"","no this node kind in syntax tree!");
break;
}
if(t->nodekind==ProcDecK)
break;
else
t=t->sibling ;
}
entry->attrIR.More.ProcAttr.nOff = savedOff;
entry->attrIR.More.ProcAttr.mOff = entry->attrIR.More.ProcAttr.nOff + entry->attrIR.More.ProcAttr.level+1;
/*過程活動(dòng)記錄的長度等于nOff加上display表的長度*
*diplay表的長度等于過程所在層數(shù)加一 */
/*處理程序的聲明部分*/
while(t!=NULL)
{
procDecPart(t);
t = t->sibling;
}
t = p;
Body(t->child[2]);/*處理Block*/
/*函數(shù)部分結(jié)束,刪除進(jìn)入形參時(shí),新建立的符號(hào)表*/
if ( Level!=-1)
DestroyTable();/*結(jié)束當(dāng)前scope*/
}
/************************************************************/
/* 函數(shù)名 HeadProcess */
/* 功 能 該函數(shù)處理函數(shù)頭的語義分析 */
/* 說 明 在當(dāng)前層符號(hào)表中填寫函數(shù)標(biāo)識(shí)符的屬性;在新層符號(hào) */
/* 表中填寫形參標(biāo)識(shí)符的屬性。其中過程的大小和代碼都 */
/* 需以后回填。 */
/************************************************************/
SymbTable * HeadProcess(TreeNode * t)
{
AttributeIR attrIr ;
int present = FALSE;
SymbTable * entry = NULL;
/*填屬性*/
attrIr.kind = procKind;
attrIr.idtype = NULL;
attrIr.More.ProcAttr.level = Level+1;
if(t!=NULL)
{
/*登記函數(shù)的符號(hào)表項(xiàng)*/
present = Enter(t->name[0],&attrIr,&entry);
t->table[0] = entry;
/*處理形參聲明表*/
}
entry->attrIR.More.ProcAttr.param = ParaDecList(t);
return entry;
}
/************************************************************/
/* 函數(shù)名 ParaDecList */
/* 功 能 該函數(shù)處理函數(shù)頭中的參數(shù)聲明的語義分析 */
/* 說 明 在新的符號(hào)表中登記所有形參的表項(xiàng),構(gòu)造形參表項(xiàng)的 */
/* 地址表,并有para指向其。 */
/************************************************************/
ParamTable * ParaDecList(TreeNode * t)
{
TreeNode * p = NULL;
ParamTable * Ptr1 = NULL;
ParamTable * Ptr2 = NULL;
ParamTable * head = NULL;
if(t!=NULL)
{
if(t->child[0]!=NULL)
p = t->child[0]; /*程序聲明節(jié)點(diǎn)的第一個(gè)兒子節(jié)點(diǎn)*/
CreatTable(); /*進(jìn)入新的局部化區(qū)*/
Off = 7; /*子程序中的變量初始偏移設(shè)為8*/
VarDecPart(p); /*變量聲明部分*/
SymbTable * Ptr0 = scope[Level];
while(Ptr0 != NULL) /*只要不為空,就訪問其兄弟節(jié)點(diǎn)*/
{
/*構(gòu)造形參符號(hào)表,并使其連接至符號(hào)表的param項(xiàng)*/
Ptr2 = NewParam();
if(head == NULL)
head = Ptr1 = Ptr2;
//Ptr0->attrIR.More.VarAttr.isParam = true;
Ptr2->entry = Ptr0;
Ptr2->next = NULL;
if(Ptr2 != Ptr1)
{
Ptr1->next = Ptr2;
Ptr1 = Ptr2;
}
Ptr0 = Ptr0->next;
}
}
return head; /*返回形參符號(hào)表的頭指針*/
}
/*******************執(zhí)行體部分的語義分析*********************/
/************************************************************/
/* 函數(shù)名 Body */
/* 功 能 該函數(shù)處理執(zhí)行體部分的語義分析 */
/* 說 明 TINY編譯系統(tǒng)的執(zhí)行體部分即為語句序列,故只需處理 */
/* 語句序列部分。 */
/************************************************************/
void Body(TreeNode * t)
{
if (t->nodekind==StmLK)
{
TreeNode * p = t->child[0];
while(p != NULL)
{
statement (p); /*調(diào)用語句狀態(tài)處理函數(shù)*/
p=p->sibling; /*依次讀入語法樹語句序列的兄弟節(jié)點(diǎn)*/
}
}
}
/************************************************************/
/* 函數(shù)名 statement */
/* 功 能 該函數(shù)處理語句狀態(tài) */
/* 說 明 根據(jù)語法樹節(jié)點(diǎn)中的kind項(xiàng)判斷應(yīng)該轉(zhuǎn)向處理哪個(gè)語句 */
/* 類型函數(shù)。 */
/************************************************************/
void statement (TreeNode * t)
{
switch(t->kind.stmt)
{
case IfK: ifstatment(t); break;
case WhileK: whilestatement(t); break;
case AssignK: assignstatement(t); break;
case ReadK: readstatement(t); break;
case WriteK: writestatement(t);break;
case CallK: callstatement(t); break;
case ReturnK: returnstatement(t); break;
default :
ErrorPrompt(t->lineno,"","statement type error!\n");
break;
}
}
/************************************************************/
/* 函數(shù)名 Expr */
/* 功 能 該函數(shù)處理表達(dá)式的分析 */
/* 說 明 表達(dá)式語義分析的重點(diǎn)是檢查運(yùn)算分量的類型相容性, */
/* 求表達(dá)式的類型。其中參數(shù)Ekind用來表示實(shí)參是變參 */
/* 還是值參。 */
/************************************************************/
TypeIR * Expr(TreeNode * t,AccessKind * Ekind)
{
int present = FALSE;
SymbTable * entry = NULL;
TypeIR * Eptr0 = NULL;
TypeIR * Eptr1 = NULL;
TypeIR * Eptr = NULL;
if(t!=NULL)
switch(t->kind.exp)
{
case ConstK:
Eptr = TypeProcess (t,IntegerK);
Eptr->kind = intTy;
if(Ekind!=NULL)
(*Ekind ) = dir; /*直接變量*/
break;
case VariK:
/*Var = id的情形*/
if(t->child[0]==NULL)
{
/*在符號(hào)表中查找此標(biāo)識(shí)符*/
present = FindEntry(t->name[0],&entry);
t->table[0] = entry;
if(present!=FALSE)
{ /*id不是變量*/
if (FindAttr(entry).kind!=varKind)
{
ErrorPrompt(t->lineno,t->name[0],"is not variable error!\n");
Eptr = NULL;
}
else
{
Eptr = entry->attrIR.idtype;
if (Ekind!=NULL)
(*Ekind) = indir; /*間接變量*/
}
}
else /*標(biāo)識(shí)符無聲明*/
{
ErrorPrompt(t->lineno,t->name[0],"is not declarations!\n");
}
}
else/*Var = Var0[E]的情形*/
{ if(t->attr.ExpAttr.varkind==ArrayMembV)
Eptr = arrayVar(t);
else /*Var = Var0.id的情形*/
if(t->attr.ExpAttr.varkind==FieldMembV)
Eptr = recordVar(t);
}
break;
case OpK:
/*遞歸調(diào)用兒子節(jié)點(diǎn)*/
Eptr0 = Expr(t->child[0],NULL);
if(Eptr0==NULL)
return NULL;
Eptr1 = Expr(t->child[1],NULL);
if(Eptr1==NULL)
return NULL;
/*類型判別*/
present = Compat(Eptr0,Eptr1);
if ( present != FALSE )
{
switch(t->attr.ExpAttr.op)
{
case LT:
case EQ:
Eptr = boolPtr;
break; /*條件表達(dá)式*/
case PLUS:
case MINUS:
case TIMES:
case OVER:
Eptr = intPtr;
break; /*算數(shù)表達(dá)式*/
}
if(Ekind !=NULL)
(*Ekind) = dir; /*直接變量*/
}
else
ErrorPrompt(t->lineno,"","operator is not compat!\n");
break;
}
return Eptr;
}
/************************************************************/
/* 函數(shù)名 arrayVar */
/* 功 能 該函數(shù)處理數(shù)組變量的下標(biāo)分析 */
/* 說 明 檢查var := var0[E]中var0是不是數(shù)組類型變量,E是不*/
/* 是和數(shù)組的下標(biāo)變量類型匹配。 */
/************************************************************/
TypeIR * arrayVar(TreeNode * t)
{
int present = FALSE;
SymbTable * entry = NULL;
TypeIR * Eptr0 = NULL;
TypeIR * Eptr1 = NULL;
TypeIR * Eptr = NULL;
/*在符號(hào)表中查找此標(biāo)識(shí)符*/
present = FindEntry(t->name[0],&entry);
t->table[0] = entry;
/*找到*/
if(present!=FALSE)
{
/*Var0不是變量*/
if (FindAttr(entry).kind!=varKind)
{
ErrorPrompt(t->lineno,t->name[0],"is not variable error!\n");
Eptr = NULL;
}
else/*Var0不是數(shù)組類型變量*/
if(FindAttr(entry).idtype!=NULL)
if(FindAttr(entry).idtype->kind!=arrayTy)
{
ErrorPrompt(t->lineno,t->name[0],"is not array variable error !\n");
Eptr = NULL;
}
else
{
/*檢查E的類型是否與下標(biāo)類型相符*/
Eptr0 = entry->attrIR.idtype->More.ArrayAttr.indexTy;
if(Eptr0==NULL)
return NULL;
Eptr1 = Expr(t->child[0],NULL);//intPtr;
if(Eptr1==NULL)
return NULL;
present = Compat(Eptr0,Eptr1);
if(present!=TRUE)
{
ErrorPrompt(t->lineno,"","type is not matched with the array member error !\n");
Eptr = NULL;
}
else
Eptr = entry->attrIR.idtype->More.ArrayAttr.elemTy;
}
}
else/*標(biāo)識(shí)符無聲明*/
ErrorPrompt(t->lineno,t->name[0],"is not declarations!\n");
return Eptr;
}
/************************************************************/
/* 函數(shù)名 recordVar */
/* 功 能 該函數(shù)處理記錄變量中域的分析 */
/* 說 明 檢查var:=var0.id中的var0是不是記錄類型變量,id是 */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -