?? userfun.cpp
字號:
#include "globals.h"
#include "string.h"
#include "userfun.h"
#include "iostream.h"
char * userfun::getRoot(char * filename)
{
/*
char * point=strchr (filename, '.');
char * root="";
if (point == NULL)
{
strcat(filename,".txt");
}
for(char * p=filename;p<point;p++)
{
strcat(root,);
}
*/
char * root=filename;
return root;
}
void userfun::printTokenlist(ChainNodeType *tokenlist)
{
ChainNodeType *currentP=tokenlist;
char lex[20];
do
{
switch (currentP->Token.Lex)
{
/* 單詞token為保留字,將保留字詞元以指定格式寫入列表文件listing */
case PROGRAM:
case PROCEDURE:
case TYPE:
case VAR:
case IF:
case THEN:
case ELSE:
case FI:
case INTEGER:
case CHAR:
case WHILE:
case DO:
case ENDWH:
case BEGIN:
case END:
case READ:
case WRITE:
case ARRAY:
case OF:
case RECORD:
case RETURN:
strcpy(lex,"reserved word:");
break;
/* 單詞token為特殊符號:ASSIGN (賦值),將":="寫入文件listing */
case ASSIGN: strcpy(lex,"ASSIGN"); break;
/* 單詞token為特殊符號:LT (小于),將"<"寫入文件listing */
case LT: strcpy(lex,"LT"); break;
/* 單詞token為特殊符號:EQ (等于),將"="寫入文件listing */
case EQ: strcpy(lex,"EQ");break;
/* 單詞token為特殊符號:LPAREN (左括號),將"("寫入文件listing */
case LPAREN: strcpy(lex,"LPAREN"); break;
/* 單詞token為特殊符號:RPAREN (右括號),將")"寫入文件listing */
case RPAREN: strcpy(lex,"RPAREN"); break;
/* 單詞token為特殊符號:SEMI (分號),將";"寫入文件listing */
case SEMI: strcpy(lex,"SEMI"); break;
/* 單詞token為特殊符號:PLUS (加號),將"+"寫入文件listing */
case PLUS: strcpy(lex,"PLUS"); break;
/* 單詞token為特殊符號;MINUS (減號),將"-"寫入文件listing */
case MINUS: strcpy(lex,"MINUS"); break;
/* 單詞token為特殊符號:TIMES (乘號),將"*"寫入文件listing */
case TIMES: strcpy(lex,"TIMES"); break;
/* 單詞token為特殊符號:OVER (除號),將"/"寫入文件listing */
case OVER: strcpy(lex,"OVER"); break;
case DOT: strcpy(lex,"DOT"); break;
case COMMA: strcpy(lex,"COMMA"); break;
case LMIDPAREN: strcpy(lex,"LMIDPAREN"); break;
case RMIDPAREN: strcpy(lex,"RMIDPAREN"); break;
case UNDERANGE: strcpy(lex,"UNDERANGE"); break;
/* 單詞token為簿記單詞符號:ENDFILE (文件結尾),將EOF寫入文件listing */
case ENDFILE:strcpy(lex,"ENDFILE"); break;
/* 單詞token為多字符單詞符號:NUM (數字),將數值寫入文件listing */
case INTC:
strcpy(lex,"NUM, val=");
break;
case CHARC:
strcpy(lex,"INCHAR, char=");
break;
/* 單詞token為多字符單詞符號:ID (標識符),將標識符名寫入文件listing */
case ID:
strcpy(lex,"ID, name=");
break;
/* 單詞token為簿記單詞符號:ERROR (錯誤),將錯誤信息寫入文件listing */
case ERROR:
strcpy(lex,"ERROR:");
break;
/* 單詞token為其他未知單詞,未知信息寫入文件listing,此種情況不應發生 */
default:
strcpy(lex,"Unknown token:");
break;
}
cout<<currentP->Token.lineshow<<":"<<lex<<" "<<currentP->Token.Sem<<endl;
currentP=currentP->nextToken;
}
while (currentP!=NULL);
}
void userfun::ChainToFile(ChainNodeType *Chainhead,char * root)
{
int num=1;
ChainNodeType *currentP=Chainhead;
/*創建一個新的文件,以存儲Token序列*/
strcat(root,".scn"); //詞法分析結果文件的擴展名
FILE *fp;
fp=fopen(root,"wb+");
if (fp==NULL)
{ cout<<"cannot create file Tokenlist!"<<endl;
Error = TRUE;
//exit(0);
}
fp=fopen(root,"ab"); /*按追加方式打開文件*/
if (fp==NULL)
{ cout<<"cannot open file Tokenlist!"<<endl;
Error = TRUE;
//exit(0);
}
/*從表頭到表尾,依次將所有的Token寫入文件*/
do
{ fwrite(currentP,TOKENLEN,1,fp);
currentP=currentP->nextToken;
num++;
}
while (currentP!=NULL);
cout<<"成功!"<<endl;
fclose(fp); /*關閉文件*/
}
/******************************************************/
/* 函數名 printTree */
/* 功 能 把語法樹輸出,顯示在屏幕上 */
/* 說 明 該函數運用了宏來定義增量減量的縮進 */
/******************************************************/
void userfun::printTree(treeNode * tree)
{ int i;
/* 增量縮進宏,每次進入語法樹節點都進行增量縮進 */
/* 靜態變量indentno在函數printTree中 *
* 用于存儲當前子樹縮進格數,初始為0 */
static indentno = 0;
/** 增量/減量縮進宏定義 **/
#define INDENT indentno+=4
#define UNINDENT indentno-=4
INDENT;
/* 函數參數給定語法樹節點指針tree非NULL(空) */
while (tree != NULL)
{
/*打印行號*/
if(tree->lineno==0)
for(int i=0;i<9;i++)
cout<<" ";
else
switch((int)(tree->lineno / 10))
{
case 0:
cout<<"line:"<<tree->lineno;
for( i=0;i<3;i++)
cout<<" ";
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
cout<<"line:"<<tree->lineno;
for(i=0;i<2;i++)
cout<<" ";
break;
default:
cout<<"line:"<<tree->lineno;
cout<<" ";
}
/* 打印相應的空格,進行縮進 */
for (i=0;i<indentno;i++)
cout<<" ";
switch ( tree->nodekind)
{ case ProK :
cout<<"ProK ";
break;
case PheadK:
{
cout<<"PheadK ";
cout<<tree->name[0]<<" ";
}
break;
case DecK:
{ cout<<"DecK ";
if (tree->attr.ProcAttr.paramt==varparamType )
cout<<"var param: ";
if (tree->attr.ProcAttr.paramt==valparamType)
cout<<"value param: ";
switch(tree->kind.dec)
{ case ArrayK:
{
cout<<"ArrayK ";
cout<<tree->attr.ArrayAttr.up<<" ";
cout<<tree->attr.ArrayAttr.low<<" ";
if (tree->attr.ArrayAttr.childtype == CharK)
cout<<"Chark ";
else if( tree->attr.ArrayAttr.childtype == IntegerK)
cout<<"IntegerK ";
};break;
case CharK:
cout<<"CharK ";break;
case IntegerK:
cout<<"IntegerK ";break;
case RecordK:
cout<<"RecordK ";break;
case IdK:
cout<<"IdK ";
cout<<tree->attr.type_name<<" ";
break;
default:
cout<<"error1!";
Error = TRUE;
};
if (tree->idnum !=0)
for (int i=0 ; i <= (tree->idnum);i++)
{
cout<<tree->name[i]<<" ";
}
else
{
cout<<"wrong!no var!"<<endl;
Error = TRUE;
}
} break;
case TypeK:
cout<<"TypeK ";break;
case VarK:
cout<<"VarK ";
if(tree->table[0]!=NULL)
cout<<tree->table[0]->attrIR.More.VarAttr.off<<" "<<tree->table[0]->attrIR.More.VarAttr.level<<" ";
break;
case ProcDecK:
cout<<"ProcDecK ";
cout<<tree->name[0]<<" ";
if(tree->table[0]!=NULL)
cout<<tree->table[0]->attrIR.More.ProcAttr.mOff<<" "<<tree->table[0]->attrIR.More.ProcAttr.nOff<<" "<<tree->table[0]->attrIR.More.ProcAttr.level<<" ";
break;
case StmLK:
cout<<"StmLk ";break;
case StmtK:
{ cout<<"StmtK ";
switch (tree->kind.stmt)
{ case IfK:
cout<<"If ";break;
case WhileK:
cout<<"While ";break;
case AssignK:
cout<<"Assign ";
break;
case ReadK:
cout<<"Read ";
cout<<tree->name[0]<<" ";
if(tree->table[0]!=NULL)
cout<<tree->table[0]->attrIR.More.VarAttr.off<<" "<<tree->table[0]->attrIR.More.VarAttr.level<<" ";
break;
case WriteK:
cout<<"Write ";break;
case CallK:
cout<<"Call ";
cout<< tree->name[0]<<" ";
break;
case ReturnK:
cout<<"Return ";break;
default:
cout<<"error2! ";
Error = TRUE;
}
};break;
case ExpK:
{ cout<<"ExpK ";
switch (tree->kind.exp)
{ case OpK:
{ cout<<"Op ";
switch(tree->attr.ExpAttr.op)
{ case EQ: cout<< " ="; break;
case LT: cout<< " <"; break;
case PLUS: cout<< " +"; break;
case MINUS:cout<< " -"; break;
case TIMES:cout<< " *"; break;
case OVER: cout<< " /"; break;
default:
cout<< "error3!"; break;
Error = TRUE;
}
if(tree->attr.ExpAttr.varkind==ArrayMembV)
{
cout<< "ArrayMember ";
cout<< tree->name[0]<<" ";
}
};break;
case ConstK:
cout<< "Const ";
switch(tree->attr.ExpAttr.varkind)
{
case IdV:
cout<< "Id ";
cout<< tree->name[0]<<" ";
break;
case FieldMembV:
cout<< "FieldMember ";
cout<< tree->name[0]<<" ";
break;
case ArrayMembV:
cout<< "ArrayMember ";
cout<< tree->name[0]<<" ";
break;
default:
cout<< "var type error!";
Error = TRUE;
}
cout<< tree->attr.ExpAttr.val<<" ";
break;
case VariK:
cout<< "Vari ";
switch(tree->attr.ExpAttr.varkind)
{
case IdV:
cout<< "Id ";
cout<< tree->name[0]<<" ";
break;
case FieldMembV:
cout<< "FieldMember ";
cout<< tree->name[0]<<" ";
break;
case ArrayMembV:
cout<< "ArrayMember ";
cout<< tree->name[0]<<" ";
break;
default:
cout<< "var type error!";
Error = TRUE;
}
if(tree->table[0]!=NULL)
cout<< tree->table[0]->attrIR.More.VarAttr.off<<" "<<tree->table[0]->attrIR.More.VarAttr.level<<" ";
break;
default:
cout<< "error4!";
Error = TRUE;
}
};break;
default:
cout<< "error5!";
Error = TRUE;
}
cout<<endl;
/* 對語法樹結點tree的各子結點遞歸調用printTree過程 *
* 縮進寫入列表文件listing */
for (i=0;i<MAXCHILDREN;i++)
printTree(tree->child[i]);
/* 對語法樹結點tree的兄弟節點遞歸調用printTree過程 *
* 縮進寫入列表文件listing */
tree = tree->sibling;
}
/* 減量縮進宏,每次退出語法樹節點時減量縮進 */
UNINDENT;
}
/********************************************************/
/* 函數名 PrintOneLayer */
/* 功 能 打印符號表的一層 */
/* 說 明 有符號表打印函數PrintSymbTable調用 */
/********************************************************/
void userfun::PrintOneLayer(int level,SymbTable **scope)
{
SymbTable *t= scope[level];
cout<<"\n-------SymbTable in level" <<level<<"---------"<<endl;
while (t!=NULL)
{ /*輸出標識符名字*/
cout<<t->idName<<": ";
AttributeIR *Attrib = &(t->attrIR );
/*輸出標識符的類型信息,過程標識符除外*/
if (Attrib->idtype!=NULL) /*過程標識符*/
switch(Attrib->idtype->kind)
{case intTy : cout<<"intTy "; break;
case charTy: cout<<"charTy "; break;
case arrayTy: cout<<"arrayTy "; break;
case recordTy:cout<<"recordTy ";break;
default : cout<<"error type! "; break;
}
/*輸出標識符的類別,并根據不同類型輸出不同其它屬性*/
switch(Attrib->kind)
{case typeKind :
cout<<"typekind "; break;
case varKind :
cout<<"varkind ";
cout<<"level="<<Attrib->More.VarAttr.level<<" ";
cout<<"Offset="<< Attrib->More.VarAttr.off<<" ";
switch(Attrib->More.VarAttr.access)
{ case dir : cout<<"dir "; break;
case indir: cout<<"indir ";break;
default :cout<<"errorkind "; break;
}
break;
case procKind:
cout<<"funckind ";
cout<<"Level="<<Attrib->More.ProcAttr.level<<" ";
cout<<"Noff="<<Attrib->More.ProcAttr.nOff<<" ";
break;
default :cout<<"error ";
}
cout<<endl;
t = t->next;
}
}
/********************************************************/
/* 函數名 PrintSymbTable */
/* 功 能 打印生成的符號表 */
/* 說 明 */
/********************************************************/
void userfun::PrintSymbTable(SymbTable **scope)
{ /*層數從0開始*/
int level=0;
while (scope[level]!=NULL)
{ userfun::PrintOneLayer(level,scope);
level++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -