编译原理c++简单词法分析器

来源:互联网 发布:美工面试问题及答案 编辑:程序博客网 时间:2024/06/03 20:19

    简单词法分析程序

        编译原理课程词法分析程序,自己c++写的比较简单功能实现,需要的用户可以在此基础上进行自己思路的扩充修改。功能:读取一个自己设定路径下的txt文件中代码,然后将分析结果保存在另外一个自己设定路径下txt文件中,下附加代码:

/*Name: 词法分析器 Copyright: Author: ycc Date: 24/03/17 11:24Description: 词法分析器用于读取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; } 


结果显示效果如下(我是两个一起截图的)



原创粉丝点击