亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? userfun.cpp

?? SNL語言編譯器源碼 小語言的編譯器C++實現 包括詞法分析
?? 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 + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品高潮呻吟| 国产91精品精华液一区二区三区 | 欧美日韩高清影院| 欧美mv和日韩mv的网站| 亚洲精品成a人| 国产一区二区伦理片| 99久久精品国产一区二区三区| 7777精品伊人久久久大香线蕉 | 久久99精品网久久| 日本久久一区二区| 国产目拍亚洲精品99久久精品| 日韩av一区二| 在线日韩一区二区| 国产精品福利电影一区二区三区四区| 久久精品国产一区二区| 色中色一区二区| 国产精品久久久久永久免费观看| 捆绑变态av一区二区三区| 日本道精品一区二区三区| 国产精品入口麻豆原神| 国产一区二区成人久久免费影院| 91精品国产色综合久久久蜜香臀| 亚洲靠逼com| kk眼镜猥琐国模调教系列一区二区| 91精品国产欧美一区二区| 亚洲高清免费视频| 欧美亚洲国产bt| 亚洲高清免费观看高清完整版在线观看| 成人动漫一区二区| 中文字幕国产一区| 懂色av一区二区夜夜嗨| 国产亚洲精品福利| 国产高清无密码一区二区三区| 日韩美女天天操| 久久99久久久久| 精品三级av在线| 国产剧情在线观看一区二区| 2欧美一区二区三区在线观看视频| 欧美96一区二区免费视频| 91精品国产高清一区二区三区 | av中文字幕亚洲| 国产日韩欧美高清在线| 大胆欧美人体老妇| 中文字幕一区二区三区在线播放| av福利精品导航| 亚洲激情网站免费观看| 欧美三级视频在线播放| 美女在线一区二区| 久久综合给合久久狠狠狠97色69| 国产尤物一区二区| 国产精品久久久久永久免费观看 | 国产一区二区三区香蕉| 久久美女高清视频| 99re8在线精品视频免费播放| 亚洲毛片av在线| 欧美日韩你懂的| 国产乱码一区二区三区| 国产精品久久精品日日| 欧美日韩在线播放一区| 久久国产精品色| 国产精品第四页| 欧美日韩国产美| 国产精品自产自拍| 亚洲第一搞黄网站| 日韩欧美另类在线| 91看片淫黄大片一级在线观看| 午夜不卡av在线| 国产欧美视频一区二区| 91福利视频在线| 国产一区免费电影| 亚洲一二三四区不卡| 久久综合九色综合欧美亚洲| 91浏览器入口在线观看| 精一区二区三区| 亚洲精品成人少妇| 国产日韩一级二级三级| 欧美日韩一区二区不卡| 国产精品亚洲人在线观看| 亚洲美女在线国产| 精品久久久久久久久久久久包黑料 | 国产凹凸在线观看一区二区| 夜夜爽夜夜爽精品视频| 欧美激情一区二区三区不卡| 欧美精品久久99久久在免费线 | 在线国产亚洲欧美| 国产精品一区二区久久精品爱涩| 一区二区欧美视频| 欧美国产精品劲爆| 精品sm在线观看| 欧美丰满嫩嫩电影| 在线影视一区二区三区| 播五月开心婷婷综合| 韩国视频一区二区| 婷婷开心激情综合| 日韩久久一区二区| 国产情人综合久久777777| 精品日韩一区二区| 7777精品伊人久久久大香线蕉完整版 | 一区二区三区av电影| 国产精品久久久久久久久免费樱桃| 日韩欧美一级二级三级| 欧美日韩国产高清一区二区三区| 99精品在线观看视频| 国产不卡在线视频| 国产一区二区三区电影在线观看| 亚洲va欧美va人人爽午夜| 一区二区欧美精品| 一区二区三区国产精华| 综合色中文字幕| 最新成人av在线| 亚洲视频精选在线| 中文字幕日韩一区| 国产精品传媒入口麻豆| 国产精品欧美久久久久无广告| 久久在线免费观看| 久久久久一区二区三区四区| 欧美精品一区二区在线观看| 欧美va亚洲va香蕉在线| 日韩欧美亚洲另类制服综合在线| 91精品国产综合久久香蕉的特点 | 中文字幕第一区第二区| 欧美videos大乳护士334| 欧美大片一区二区| 337p日本欧洲亚洲大胆精品| 久久久不卡网国产精品一区| 久久精品亚洲一区二区三区浴池| 久久亚洲春色中文字幕久久久| 久久女同性恋中文字幕| 欧美激情综合网| 亚洲精品乱码久久久久| 午夜精品一区二区三区电影天堂 | 亚洲第一狼人社区| 日韩电影在线免费观看| 久久精品噜噜噜成人88aⅴ| 国产主播一区二区三区| 东方aⅴ免费观看久久av| 色综合久久综合网| 欧美高清视频在线高清观看mv色露露十八 | 久久精品人人做人人爽人人| 亚洲国产成人午夜在线一区| 日韩久久一区二区| 首页国产丝袜综合| 国产在线观看一区二区| 91亚洲午夜精品久久久久久| 欧美日韩二区三区| 久久九九久久九九| 亚洲一区二区三区国产| 激情成人综合网| www.欧美日韩国产在线| 欧美一区二区美女| 国产精品网站在线播放| 午夜激情久久久| 大尺度一区二区| 91精品国产乱码| 亚洲视频香蕉人妖| 国产一区二区调教| 色天使色偷偷av一区二区| 欧美va亚洲va在线观看蝴蝶网| 最新不卡av在线| 精品写真视频在线观看| 91黄色小视频| 久久久精品影视| 香港成人在线视频| 99精品欧美一区二区三区综合在线| 欧美日韩大陆一区二区| 国产精品青草久久| 精品一区二区三区免费视频| 一本色道**综合亚洲精品蜜桃冫 | 亚洲欧美怡红院| 九一九一国产精品| 欧美三区在线观看| 国产精品护士白丝一区av| 蜜臀av性久久久久蜜臀aⅴ| 色欲综合视频天天天| 国产色产综合产在线视频| 婷婷久久综合九色国产成人| 99视频超级精品| 国产人久久人人人人爽| 久久99精品久久久| 7777精品久久久大香线蕉 | 日本色综合中文字幕| 在线观看精品一区| 亚洲色图制服丝袜| 国产91丝袜在线18| 精品国产一区二区三区久久影院 | 五月天中文字幕一区二区| 99精品国产一区二区三区不卡| 久久久蜜桃精品| 经典一区二区三区| 7777精品伊人久久久大香线蕉超级流畅 | 成人国产精品免费观看| 久久青草国产手机看片福利盒子| 日本一道高清亚洲日美韩| 欧美日韩在线直播| 亚洲六月丁香色婷婷综合久久| 99久久久国产精品| **网站欧美大片在线观看| 97久久久精品综合88久久| 日韩美女啊v在线免费观看| 不卡在线观看av|