編譯原理c++簡單詞法分析器
阿新 • • 發佈:2019-01-06
簡單詞法分析程式
編譯原理課程詞法分析程式,自己c++寫的比較簡單功能實現,需要的使用者可以在此基礎上進行自己思路的擴充修改。功能:讀取一個自己設定路徑下的txt檔案中程式碼,然後將分析結果儲存在另外一個自己設定路徑下txt檔案中,下附加程式碼:
/* Name: 詞法分析器 Copyright: Author: ycc Date: 24/03/17 11:24 Description: 詞法分析器用於讀取txt文字,其中每一個不同的單詞都必須以空格隔開 */ #include<iostream> #include<fstream> using namespace std; int main() { char a[200]; string b[200]; static int j=0; int i; int count; int flag; ifstream infile("C:/Users/Y/Desktop/new.txt ",ios::in);//載入自己設定路徑輸入檔案 ofstream outfile("C:/Users/Y/Desktop/old.txt",ios::out);//載入自己設定路徑輸出檔案 for(i=0;i<200;i++) { a[i]=infile.get();//輸入檔案讀取到陣列a[]中 } for(i=0;i<200;i++)//開始進行陣列a[]內字元識別 { switch(a[i]) { case '('://識別符號( { b[j]=a[i]; outfile<<"<1,"<<b[j]<<">"<<endl; } ;break; case ')'://識別符號) { b[j]=a[i]; outfile<<"<2,"<<b[j]<<">"<<endl; } ;break; case '+': { if(a[i+1]=='=')//識別符號+= { b[j]=a[i]; b[j]+=a[i+1]; i++; outfile<<"<3,"<<b[j]<<">"<<endl; } else if(a[i+1]=='+')//識別符號++ { b[j]=a[i]; b[j]+=a[i+1]; i++; outfile<<"<22,"<<b[j]<<">"<<endl; } else//識別符號+ { b[j]+=a[i]; outfile<<"<4,"<<b[j]<<">"<<endl; } };break; case '-': { if(a[i+1]=='=')//識別符號-= { b[j]=a[i]; b[j]+=a[i+1]; i++; outfile<<"<5,"<<b[j]<<">"<<endl; } else if(a[i+1]=='-')//識別符號-- { b[j]=a[i]; b[j]+=a[i+1]; i++; outfile<<"<23,"<<b[j]<<">"<<endl; } else//識別符號- { b[j]+=a[i]; outfile<<"<6,"<<b[j]<<">"<<endl; } };break; case '*': { if(a[i+1]=='=')//識別符號*= { b[j]=a[i]; b[j]+=a[i+1]; i++; outfile<<"<7,"<<b[j]<<">"<<endl; } else//識別符號* { b[j]+=a[i]; outfile<<"<8,"<<b[j]<<">"<<endl; } };break; case '/': { if(a[i+1]=='=')//識別符號 /= { b[j]=a[i]; b[j]+=a[i+1]; i++; outfile<<"<9,"<<b[j]<<">"<<endl; } else if(a[i+1]=='/')////識別符號 // { while(a[i+2]!='\n') { i++; }outfile<<"<10(1),"<<"註釋"<<">"<<endl; } else////識別符號 / { b[j]+=a[i]; outfile<<"<10,"<<b[j]<<">"<<endl; } };break; case ';'://識別符號 ; { b[j]=a[i]; outfile<<"<11,"<<b[j]<<">"<<endl; };break; case '<': { if(a[i+1]=='=')//識別符號<= { b[j]=a[i]; b[j]+=a[i+1]; i++; outfile<<"<12,"<<b[j]<<">"<<endl; } else//識別符號 < { b[j]+=a[i]; outfile<<"<13,"<<b[j]<<">"<<endl; } };break; case '>': { if(a[i+1]=='=')//識別符號 >= { b[j]=a[i]; b[j]+=a[i+1]; i++; outfile<<"<14,"<<b[j]<<">"<<endl; } else//識別符號 > { b[j]+=a[i]; outfile<<"<15,"<<b[j]<<">"<<endl; } };break; case '=': { if(a[i+1]=='=')//識別符號 == { b[j]=a[i]; b[j]+=a[i+1]; i++; outfile<<"<16,"<<b[j]<<">"<<endl; } else//識別符號 = { b[j]+=a[i]; outfile<<"<17,"<<b[j]<<">"<<endl; } };break; } if (a[i]==' '||a[i]=='\n') //識別符號空格及換行 { j++; } if(a[i]>='0'&&a[i]<='9'||a[i]=='.')//識別小數及整數 { b[j]+=a[i]; if(a[i+1]==' '||a[i+1]=='\n')//識別小數,下面語句進行位數控制 { if(a[i-1]=='.'||a[i-2]=='.'||a[i-3]=='.'||a[i-4]=='.'||a[i-5]=='.'||a[i-6]=='.') outfile<<"<18(1),"<<b[j]<<">"<<endl; else outfile<<"<18,"<<b[j]<<">"<<endl;//識別整數 } } if(a[i]>='a'&&a[i]<='z') //關鍵字識別,自己新增需要的關鍵字 { b[j]+=a[i]; if(a[i+1]==' '||a[i+1]=='\n') { if(b[j]=="while") outfile<<"<19(1),"<<b[j]<<">"<<endl; else if(b[j]=="int") outfile<<"<19(2),"<<b[j]<<">"<<endl; else if(b[j]=="float") outfile<<"<19(3),"<<b[j]<<">"<<endl; else if(b[j]=="do") outfile<<"<19(4),"<<b[j]<<">"<<endl; else if(b[j]=="public") outfile<<"<19(5),"<<b[j]<<">"<<endl; else if(b[j]=="void") outfile<<"<19(6),"<<b[j]<<">"<<endl; else if(b[j]=="if") outfile<<"<19(7),"<<b[j]<<">"<<endl; else outfile<<"<19,"<<b[j]<<">"<<endl;//識別自定義變數 } } if(a[i]==':') { if(a[i+1]=='=')//識別符號 := { b[j]=a[i]; b[j]+=a[i+1]; outfile<<"<20,"<<b[j]<<">"<<endl; i++; } else//識別符號 : { b[j]+=a[i]; outfile<<"<21,"<<b[j]<<">"<<endl; } } } cout<<"編譯完畢"; //dos介面顯示,則詞法識別成功 outfile.close();//關閉檔案 infile.close();//關閉檔案 return 0; }
結果顯示效果如下(我是兩個一起截圖的):