1. 程式人生 > >編譯原理c++簡單詞法分析器

編譯原理c++簡單詞法分析器

 簡單詞法分析程式

        編譯原理課程詞法分析程式,自己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; 
} 


結果顯示效果如下(我是兩個一起截圖的)