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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? graph.cpp

?? 智能的詞法分析
?? CPP
字號:
#include<iostream>
#include<map>
#include<set>
#include "declarant.h"
#include "Graph.h" 
using namespace std;

/********直接由初態(tài)里加一條邊到終態(tài),比如說加{,}等****/ 
int Graph::add_wedge(const char& c,const string& returnid)
{
  wedge* p =new wedge;
  p->c = c;
  p->state = ++statenum; 
  p->next = G[1] ;
  G[1] = p; 
  Gend.insert(statenum);
  MAP[statenum]=returnid;
  return 0; 
}

/****從文件中輸入圖,并進行合并****/ 
int Graph::inputG(char* path,const string& s)
{
  FILE* fp= fopen(path,"r");
  if(fp==NULL)
  {
    cout<<"open error"<<endl;    
    exit(1);            
  }
  else
  {
    int num = 0;  //這次輸入的圖的狀態(tài)數(shù) 
    fscanf(fp,"%d",&num);
  //  cout<<num<<endl; 
    int start = 0; //初態(tài) 
    fscanf(fp,"%d",&start);
  //  cout<<start<<endl;
    Gstart.insert(start+statenum); //加入初態(tài) 
    
    // 輸入終態(tài) 
    int end;
    fscanf(fp,"%s",buff); 
    char* p=buff; 
    while(*p)
    {         
       sscanf(p,"%d,",&end);
   //    cout<<end<<endl; 
       p+=2;  
       MAP.insert(pair< int,string >(end+statenum,s)); //每個終態(tài)對應(yīng)的類型 
       Gend.insert(end+statenum);          
    } 
   // 輸入圖 
      int first=0; 
      while(fscanf(fp,"%d",&first)!=EOF)
      { 
         fscanf(fp,"%s",buff); 
      //   printf("%s\n",buff);
         p=buff; 
         first+=statenum; 
         while(*p)
         {
           wedge* s1 = new wedge; 
           sscanf(p,"%c,%d,",&s1->c,&s1->state);
 //          cout<<s1->c<<"  "<<s1->state<<endl;
           s1->state+=statenum; 
           p+=4; 
           wedge* temp=G[first];           
           G[first]=s1; 
           s1->next=temp;        
         } 
                                                                
      }   
    statenum+=num; // 總狀態(tài)數(shù)增加 
  }    
  return 0;  
}

/*****釋放圖資源*****/ 
int Graph::freeG()
{
  map<int,wedge* > :: iterator it; 
  for(it=G.begin(); it!=G.end();it++)
  {
     for(wedge* p=it->second; p; p = it->second)                    
     {
        it->second = p->next;
        delete p;           
     }                 
  }         
  return 0;    
} 

/****輸出圖****/ 
int Graph::dispalyG()
{ 
    
   FILE* fp=fopen("Graph.txt","w"); 
   //先輸出總共有幾個狀態(tài)
   fprintf(fp,"%d\n",statenum); 
   // 先輸出初態(tài),初態(tài)一行 
   set<int>::iterator it; 
   for(it=Gstart.begin();it!=Gstart.end();it++) 
   fprintf(fp,"%d,",*it);
   fprintf(fp,"\n");
    
   // 輸出終態(tài),終態(tài)一行 
   for(set<int>::iterator it=Gend.begin(); it!=Gend.end();it++)
   {
     fprintf(fp,"%d,",*it);                                                
   } 
   
   fprintf(fp,"\n"); 
   // 輸出鄰接表
  map<int, wedge* >:: iterator m_iter;
  for(m_iter=G.begin();m_iter!= G.end(); m_iter++)
  { //沒有出度的表頭不輸出 
    if(m_iter->second) 
    fprintf(fp,"%d\n",m_iter->first);                                
    for(wedge* p=m_iter->second; p!=NULL; p=p->next)
    { 
      fprintf(fp,"%c,%d,",p->c,p->state);                  
    }          
    fprintf(fp,"\n");                  
  } 
    fclose(fp);
    return 0;       
} 

/*****輸入源代碼******/ 
int Graph::input_code(char* filename) 
{
   FILE* fp;
   if((fp=fopen(filename,"r"))==NULL)
   {
     perror("打開文件錯誤\n");
     exit(1);                             
   }
   else
   {
      while(fgets(buff, 1000, fp ))
      {
         //puts(buff); 
         linenum++;
       //  cout<<linenum<<endl; 
         match();                              
      }
      display_token();     
   } 
    
 return 0;    
}

/*****定義該類對象時必須執(zhí)行的*****/ 
int Graph::run()
{  
    
   Graph::inputG("relop.txt","relop");
   Graph::inputG("num.txt","num"); 
   Graph::inputG("id.txt","id");
   add_wedge('=',"="); 
   add_wedge('{',"{"); 
   add_wedge(';',";"); 
   add_wedge(',',",");
   add_wedge('(',"(");
   add_wedge('}',"}");
   add_wedge(')',")");
   add_wedge('+',"+");
   add_wedge('-',"-");
   add_wedge('*',"*");    
   token.insert(pair<string,vector<string> >("relop",vector<string>()));  //關(guān)系運算符 
   token.insert(pair<string,vector<string> >("num",vector<string>())); // 正整數(shù) 
   token.insert(pair<string,vector<string> >("id",vector<string>()));  //標(biāo)識符 
   token.insert(pair<string,vector<string> >("reserve",vector<string>())); //關(guān)鍵字 
   token.insert(pair<string,vector<string> >("invalid",vector<string>())); //非法字符 
   token.insert(pair<string,vector<string> >("{",vector<string>()));
   token.insert(pair<string,vector<string> >("}",vector<string>()));
   token.insert(pair<string,vector<string> >("(",vector<string>()));
   token.insert(pair<string,vector<string> >(")",vector<string>()));
   token.insert(pair<string,vector<string> >("+",vector<string>()));
   token.insert(pair<string,vector<string> >("-",vector<string>()));
   token.insert(pair<string,vector<string> >("*",vector<string>())); 
   token.insert(pair<string,vector<string> >("=",vector<string>()));
   // 以下是輸入關(guān)鍵字 
   isReserve.insert("int");
   isReserve.insert("printf");
   isReserve.insert("return");
   isReserve.insert("if"); 
   isReserve.insert("else"); 
   isReserve.insert("long"); 
   isReserve.insert("switch"); 
   isReserve.insert("case"); 
   isReserve.insert("break"); 
   isReserve.insert("for"); 
   isReserve.insert("char"); 
   isReserve.insert("return"); 
   isReserve.insert("continue"); 
   isReserve.insert("default");
   isReserve.insert("do");
   isReserve.insert("while");
   isReserve.insert("short");
   isReserve.insert("main");
   isReserve.insert("include");
   input_code("coder.txt");
    
   return 0; 
} 
/****輸出關(guān)鍵字的集合*****/ 
int Graph::display_set()
{
  set<string> :: iterator it = isReserve.begin();
  for(;it!=isReserve.end();it++)
  cout<<*it<<endl;    
} 

/***獲得token通過字符串的起點和終點下標(biāo)和終態(tài)位置******/ 
int Graph::getToken(int last_ac_state,int start,int end,int flag)
{ 
   FILE* fp=fopen("token.txt","a");  
   char temp[50];
   if(end-start==0||end-start==1) 
   {
     memcpy(temp,buff+start,end-start+1);
     temp[end-start+1] = '\0';
   } 
   else
   { 
     memcpy(temp,buff+start,end-start);
     temp[end-start] = '\0';
   } 
   string s = temp; //匹配出來的那個串 
   cout<<s<<endl;  
  
 if(flag) //合法字符  
 {   
    if( isReserve.find(s) != isReserve.end() ) // 表示找到的是關(guān)鍵字   
   {
     vector<string>& t = token["reserve"];
     for(int i=0;i<t.size();i++)
     if(t[i]== s) //以經(jīng)存在了 
     {
       fclose(fp);  
       return 0; 
     } 
     //否則加入 
     t.push_back(s);   
     fclose(fp); 
     return 0;                           
   } 
    //不是關(guān)鍵字就在 MAP是找, 
   map<int, string>::iterator it = MAP.find(last_ac_state); 
   if(it == MAP.end() )
   {
     perror("did find"); 
     fclose(fp); 
     return 1;  
   }
   else
   {   //it->second是last_ac_state屬于什么類別 
     vector<string>& t=token[it->second];
     for(int i=0;i<t.size();i++)
     if(t[i]==s) //以經(jīng)存在了 
     { 
       fclose(fp);  
       return 0; 
     } 
     t.push_back(s);
   
   }
 }
 else  //非法字符 
 {
    cout<<s<<"  is  invalid in line"<<linenum<<endl; 
    fprintf(fp,"%s is invalid in line %d \n",s.c_str(),linenum);  
    vector<string>& t=token["invalid"];
     for(int i=0;i<t.size();i++)
     if(t[i]==s) //以經(jīng)存在了 
     { 
       fclose(fp);  
       return 0; 
     } 
   
    t.push_back(s);       
 }  
  fclose(fp); 
  return 0; 
} 

/***看start經(jīng)過c能否到達一個狀態(tài),
能 返回到達的那個狀態(tài),不能返回 0****/ 
int Graph::isok(const char& c,int start)
{ 
  for(wedge* p = G[start]; p ; p=p->next)
  if(p->c == c) return p->state;
  return 0;     
} 

/*****對輸入串進行匹配,關(guān)鍵字先按標(biāo)示符處理*****/ 
int Graph::match()
{  
    int advance=0; //向前讀的指針  
    int last_ac_state=0;  //匹配中的最后一個終態(tài)
    int last_ac_char_position=0;   //匹配中的最后一個字符 
    int flag=0;   //表示未能匹配成功 
  for(int i=0; buff[i]; i=++advance)
  {  
    if(buff[i]==' '||buff[i]=='\n')continue; //濾出空格和回車 
    
     last_ac_state=0;  //匹配中的最后一個終態(tài)
     last_ac_char_position=0;   //匹配中的最后一個字符 
     flag=0;   //表示未能匹配成功 
     for(set<int>::iterator myset=Gstart.begin(); myset!=Gstart.end()&&!flag; myset++)
    {//開始結(jié)點遍歷,
      int stateA = *myset; //前一個狀態(tài)  
      int stateB=0;   //后一個狀態(tài), 
       for(int j=i;buff[j];j++) //串在移動 
       {  
          stateB= isok(buff[j],stateA); 
          advance=j; 
          if(Gend.find(stateA) != Gend.end()) //stateA是終態(tài)的話
          {
              last_ac_state=stateA;
              last_ac_char_position=j;
              flag=1; //表示以找到匹配的了                       
          } 
          
            if(stateB==0) //表示走不下去了            
              break;                
            else
            stateA=stateB; //往前走了一步                                
       }                         
                  
    } 
   if(last_ac_state)  
   { 
     getToken(last_ac_state,i,last_ac_char_position,flag);  
     advance = last_ac_char_position ;    
   } 
   if(flag) //匹配成功的時候要返回退一格 
   advance--;  
   else 
   getToken(last_ac_state,i,advance,flag);                                                 
  } 
 return 0; 
}

/*****輸出token****/ 
int Graph::display_token()
{
  FILE* fp=fopen("token.txt","a"); 
  map<string , vector<string> >:: iterator it=token.begin();
  for(;it!=token.end();it++)
  {//  cout<<it->first<<endl; 
    int len=it->second.size(); 
    vector<string>& v=it->second; 
    for(int i=0;i<len;i++)
    {
     // cout<<v[i]<<" ------------------ "<<it->first<<endl;
      fprintf(fp,"%s -------------------- %s\n",v[i].c_str(),it->first.c_str());       
    }                                                  
  } 
  fclose(fp); 
  return 0;    
} 

/****析構(gòu)函數(shù)****/ 
Graph::~Graph()
{
  Graph::freeG();              
               
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产区一区| 亚洲三级在线播放| 亚洲国产欧美在线| 97国产一区二区| 国产女主播视频一区二区| 久久国产免费看| 亚洲情趣在线观看| 不卡在线观看av| 国产校园另类小说区| 久久99国产精品成人| 91九色最新地址| 一区二区在线看| 色女孩综合影院| 亚洲精选一二三| 91黄视频在线观看| 亚洲国产一区二区三区青草影视| 成人自拍视频在线观看| 精品人在线二区三区| 久久国产欧美日韩精品| 欧美精品一区在线观看| 国产精品伊人色| 欧美精彩视频一区二区三区| 懂色av噜噜一区二区三区av| 亚洲欧美怡红院| 一本到三区不卡视频| 一区二区免费在线播放| 欧美日韩国产小视频在线观看| 亚洲一区二区三区爽爽爽爽爽| 在线观看日韩高清av| 天天综合网天天综合色| 日韩亚洲欧美高清| 国产成人亚洲精品狼色在线 | 色综合天天狠狠| 一卡二卡三卡日韩欧美| 欧美色手机在线观看| 久久精品国产99国产精品| 国产欧美日韩在线| www.一区二区| 亚洲第一主播视频| 欧美精品一区二区三区蜜桃视频| 国内国产精品久久| 欧美韩国一区二区| 色8久久精品久久久久久蜜| 婷婷丁香久久五月婷婷| 久久久影视传媒| 91高清在线观看| 免费人成精品欧美精品| 欧美国产日韩a欧美在线观看| 91免费视频观看| 日韩在线播放一区二区| 国产色一区二区| 在线观看av不卡| 国产剧情av麻豆香蕉精品| 亚洲欧美视频在线观看视频| 欧美一区二区在线免费观看| 成人精品在线视频观看| 日韩电影免费在线观看网站| 欧美国产日本韩| 欧美精品第1页| 久久综合中文字幕| 91一区二区在线观看| 精品制服美女久久| 亚洲已满18点击进入久久| 26uuu精品一区二区在线观看| 一本色道久久综合亚洲aⅴ蜜桃 | 欧美视频在线播放| 欧美96一区二区免费视频| 中文字幕亚洲精品在线观看| 欧美一区二区三区播放老司机| 成人av在线资源网站| 日韩成人伦理电影在线观看| 最新热久久免费视频| 久久久青草青青国产亚洲免观| 欧美性三三影院| 99免费精品视频| 国产精品正在播放| 欧美a级一区二区| 亚洲一区二区三区爽爽爽爽爽| 欧美国产日产图区| 亚洲精品一线二线三线无人区| 欧美人妇做爰xxxⅹ性高电影| 色婷婷综合久色| 国产a精品视频| 秋霞国产午夜精品免费视频| 亚洲欧美韩国综合色| 国产精品免费看片| 久久精品亚洲国产奇米99| 6080日韩午夜伦伦午夜伦| 色婷婷精品大视频在线蜜桃视频| 成人动漫av在线| 国产成人av电影在线观看| 精品无码三级在线观看视频| 免费高清成人在线| 石原莉奈一区二区三区在线观看| 一二三区精品视频| 亚洲男女毛片无遮挡| 亚洲欧洲av在线| 国产精品家庭影院| 1000精品久久久久久久久| 136国产福利精品导航| 日韩欧美电影一二三| 欧美三级电影一区| 欧美色视频一区| 亚洲欧美电影院| 一区二区三区在线不卡| 亚洲欧美视频在线观看视频| 悠悠色在线精品| 亚洲福利视频一区| 亚洲成人久久影院| 天天爽夜夜爽夜夜爽精品视频| 亚洲成人动漫在线免费观看| 婷婷久久综合九色国产成人| 奇米一区二区三区| 国产美女精品一区二区三区| 国产精品一级在线| 丁香天五香天堂综合| 成人精品视频网站| 波多野结衣视频一区| 欧亚一区二区三区| 欧美一区二区三区性视频| 26uuu色噜噜精品一区二区| 国产精品美女久久久久久| 亚洲天堂免费看| 日韩高清不卡一区二区| 国产在线国偷精品免费看| www.在线欧美| 欧美日韩日日夜夜| 精品国产精品一区二区夜夜嗨| 国产欧美日产一区| 亚洲国产精品天堂| 麻豆成人av在线| 国产伦精品一区二区三区免费迷| 国产a精品视频| 韩国三级电影一区二区| 国产精品18久久久久久久网站| 风间由美一区二区av101| 91老师片黄在线观看| 日韩你懂的电影在线观看| 国产精品久久久久久久午夜片 | 亚洲精品在线网站| 国产精品久久久一本精品| 婷婷成人激情在线网| 成人在线一区二区三区| 欧美日韩综合一区| 久久精品免费看| 成人午夜私人影院| 欧美一区二区三区免费| 国产精品第一页第二页第三页| 日韩精品高清不卡| 波多野结衣亚洲一区| 日韩情涩欧美日韩视频| 18成人在线视频| 韩国女主播一区二区三区| 欧美视频一区在线| 国产精品久久久久天堂| 亚洲成人激情av| 国产成人精品aa毛片| 欧美日本在线看| 中文字幕制服丝袜成人av| 久久成人精品无人区| 91国模大尺度私拍在线视频| 国产亚洲一区字幕| 日本不卡一二三区黄网| 欧美影视一区在线| 国产精品欧美一级免费| 精品一区二区三区日韩| 欧美日韩在线播放三区四区| 国产精品全国免费观看高清| 国产一区视频导航| 日韩三区在线观看| 五月天激情综合| 色综合天天综合网国产成人综合天| 性久久久久久久| 在线免费一区三区| 亚洲免费在线观看| 成人app软件下载大全免费| 久久综合久色欧美综合狠狠| 亚洲一级电影视频| 本田岬高潮一区二区三区| 天堂久久一区二区三区| 99久久精品免费精品国产| 337p粉嫩大胆色噜噜噜噜亚洲 | 午夜精品福利视频网站| 色视频一区二区| 亚洲大片在线观看| 欧美精品一卡两卡| 美女免费视频一区二区| 日韩欧美成人一区二区| 九一九一国产精品| 精品久久久影院| 国产99久久久国产精品潘金网站| 亚洲国产精品国自产拍av| 91社区在线播放| 亚洲午夜电影网| 精品播放一区二区| 风间由美一区二区三区在线观看| 亚洲视频网在线直播| 欧美亚洲综合另类| 久久精品国产久精国产| 国产精品看片你懂得|