国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現詞法分析器

2020-01-26 13:32:49
字體:
來源:轉載
供稿:網友

本文實例為大家分享了C++實現詞法分析器的具體代碼,供大家參考,具體內容如下

 /*************Written By Zzg************/      /*******Date : 11,25,2017********/ #include <iostream>#include <stdlib.h>#include <stdio.h> using namespace std;string KEYWORD[15]={"if","else","void","return","while","then","for","do",   //關鍵字          "int","char","double","float","case","cin","cout"};char SEPARATER[8]={';',',','{','}','[',']','(',')'};  //分隔符char OPERATOR[8]={'+','-','*','/','>','<','=','!'};   //運算符char FILTER[4]={' ','/t','/r','/n'};          //過濾符const int IDENTIFIER=100;     //標識符值const int CONSTANT=101;      //常數值const int FILTER_VALUE=102;    //過濾字符值  /**判斷是否為關鍵字**/bool IsKeyword(string word){  for(int i=0;i<15;i++){    if(KEYWORD[i]==word){      return true;    }  }  return false;}/**判斷是否為分隔符**/bool IsSeparater(char ch){  for(int i=0;i<8;i++){    if(SEPARATER[i]==ch){      return true;    }  }  return false;} /**判斷是否為運算符**/bool IsOperator(char ch){  for(int i=0;i<8;i++){    if(OPERATOR[i]==ch){      return true;    }  }  return false;}/**判斷是否為過濾符**/bool IsFilter(char ch){  for(int i=0;i<4;i++){    if(FILTER[i]==ch){      return true;    }  }  return false;}/**判斷是否為大寫字母**/bool IsUpLetter(char ch){  if(ch>='A' && ch<='Z') return true;  return false;}/**判斷是否為小寫字母**/bool IsLowLetter(char ch){  if(ch>='a' && ch<='z') return true;  return false;}/**判斷是否為數字**/bool IsDigit(char ch){  if(ch>='0' && ch<='9') return true;  return false;}/**返回每個字的值**/template <class T>int value(T *a,int n,T str){ for(int i=0;i<n;i++){ if(a[i]==str) return i+1; } return -1;}/**詞法分析**/void analyse(FILE * fpin){  char ch=' ';  string arr="";  while((ch=fgetc(fpin))!=EOF){    arr="";    if(IsFilter(ch)){}       //判斷是否為過濾符    else if(IsLowLetter(ch)){    //判斷是否為關鍵字      while(IsLowLetter(ch)){  arr += ch;  ch=fgetc(fpin);      }  //fseek(fpin,-1L,SEEK_CUR);  if(IsKeyword(arr)){        printf("%3d  ",value(KEYWORD,15,arr));  cout<<arr<<" 關鍵字"<<endl;  }  else      {        printf("%3d  ",IDENTIFIER);        cout<<arr<<" 標識符"<<endl;      }    }    else if(IsDigit(ch)){      //判斷是否為數字      while(IsDigit(ch)||(ch=='.'&&IsDigit(fgetc(fpin)))){        arr += ch;        ch=fgetc(fpin);      }      fseek(fpin,-1L,SEEK_CUR);      printf("%3d  ",CONSTANT);      cout<<arr<<" 整形數"<<endl;    }    else if(IsUpLetter(ch)||IsLowLetter(ch)||ch=='_'){      while(IsUpLetter(ch)||IsLowLetter(ch)||ch=='_'||IsDigit(ch)){        arr += ch;        ch=fgetc(fpin);      }      fseek(fpin,-1L,SEEK_CUR);      printf("%3d  ",CONSTANT);      cout<<arr<<" 標識符"<<endl;    }    else switch(ch){    case '+':    case '-':    case '*':    case '/':    case '>':    case '<':    case '=':    case '!':      {        arr += ch;        printf("%3d  ",value(OPERATOR,8,*arr.data()));        cout<<arr<<" 運算符"<<endl;        break;      }    case ';':    case ',':    case '(':    case ')':    case '[':    case ']':    case '{':    case '}':      {       arr += ch;       printf("%3d  ",value(SEPARATER,8,*arr.data()));       cout<<arr<<" 分隔符"<<endl;       break;      }    default :cout<<"/""<<ch<<"/":無法識別的字符!"<<endl;    }  } }int main(){  char inFile[40];  FILE *fpin;  cout<<"請輸入源文件名(包括路徑和后綴):";  while(true){    cin>>inFile;    if((fpin=fopen(inFile,"r"))!=NULL)      break;    else{      cout<<"文件名錯誤!"<<endl;      cout<<"請輸入源文件名(包括路徑和后綴):";    }   }  cout<<"------詞法分析如下------"<<endl;  analyse(fpin);  return 0;}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 怀仁县| 乐都县| 茶陵县| 鹰潭市| 镇坪县| 无极县| 梓潼县| 南部县| 炉霍县| 浦北县| 绿春县| 东海县| 叙永县| 商水县| 永仁县| 阜宁县| 东明县| 蓬溪县| 宾川县| 布拖县| 江津市| 龙山县| 崇左市| 永泰县| 囊谦县| 淮滨县| 临洮县| 石棉县| 华宁县| 大田县| 青海省| 鱼台县| 灌云县| 都昌县| 怀集县| 阿拉善右旗| 措勤县| 金沙县| 石林| 京山县| 阳山县|