国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 金华市| 满城县| 南阳市| 宁化县| 房产| 都匀市| 望奎县| 吉林省| 义乌市| 宜都市| 德钦县| 石城县| 哈密市| 井研县| 鹤岗市| 八宿县| 拜城县| 乌海市| 民乐县| 灵武市| 万年县| 宁远县| 曲水县| 鹤庆县| 临夏市| 晋宁县| 固阳县| 清镇市| 龙门县| 宁陵县| 伊金霍洛旗| 湖南省| 濮阳县| 凤城市| 察隅县| 福泉市| 华容县| 双辽市| 滁州市| 南丰县| 十堰市|