C++ 代码解析词法分析语法分析.docx

上传人:b****8 文档编号:9387607 上传时间:2023-05-18 格式:DOCX 页数:20 大小:17.47KB
下载 相关 举报
C++ 代码解析词法分析语法分析.docx_第1页
第1页 / 共20页
C++ 代码解析词法分析语法分析.docx_第2页
第2页 / 共20页
C++ 代码解析词法分析语法分析.docx_第3页
第3页 / 共20页
C++ 代码解析词法分析语法分析.docx_第4页
第4页 / 共20页
C++ 代码解析词法分析语法分析.docx_第5页
第5页 / 共20页
C++ 代码解析词法分析语法分析.docx_第6页
第6页 / 共20页
C++ 代码解析词法分析语法分析.docx_第7页
第7页 / 共20页
C++ 代码解析词法分析语法分析.docx_第8页
第8页 / 共20页
C++ 代码解析词法分析语法分析.docx_第9页
第9页 / 共20页
C++ 代码解析词法分析语法分析.docx_第10页
第10页 / 共20页
C++ 代码解析词法分析语法分析.docx_第11页
第11页 / 共20页
C++ 代码解析词法分析语法分析.docx_第12页
第12页 / 共20页
C++ 代码解析词法分析语法分析.docx_第13页
第13页 / 共20页
C++ 代码解析词法分析语法分析.docx_第14页
第14页 / 共20页
C++ 代码解析词法分析语法分析.docx_第15页
第15页 / 共20页
C++ 代码解析词法分析语法分析.docx_第16页
第16页 / 共20页
C++ 代码解析词法分析语法分析.docx_第17页
第17页 / 共20页
C++ 代码解析词法分析语法分析.docx_第18页
第18页 / 共20页
C++ 代码解析词法分析语法分析.docx_第19页
第19页 / 共20页
C++ 代码解析词法分析语法分析.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C++ 代码解析词法分析语法分析.docx

《C++ 代码解析词法分析语法分析.docx》由会员分享,可在线阅读,更多相关《C++ 代码解析词法分析语法分析.docx(20页珍藏版)》请在冰点文库上搜索。

C++ 代码解析词法分析语法分析.docx

C++代码解析词法分析语法分析

C++代码解析(词法分析、语法分析)

 

很久以前就想写个C++的类解析器了,终于花了一晚上时间,写了一个C++头文件和CPP文件的解析。

其实跟我上篇“编译原理”的文章说的一样,词法分析和语法分析最基本就是一堆if-else或者switch-case。

不要被什么有穷自动机吓倒了。

 

   下面的代码是一个基本的词法和语法分析,能工作,但现在这个实验品,肯定不会很完善,请各位看官见谅。

 

   能解析出来所包含的头文件、类名(输入.h文件可以解析出类名)、函数名等,需要的功能自己再加吧。

 

   程序我直接一个main函数写下来的,完全C风格,不用跟我讲什么分函数、分类之类的话,我也知道,后期我在代码上会分好,不过不一定贴上来了,要分你可以自己分一下,如果能共享出来给我学习一下,那更感谢了。

 

   我这个程序就是让你看看一个词法分析和一个语法分析的最简单的写法,同时也实现一些有点用的功能。

 

 

 

下面就是这个程序代码,能直接拷贝编译运行的。

代码也有注释,逻辑比较清楚了。

 

 

//CodeParser.cpp:

Definestheentrypointfortheconsoleapplication. 

// 

 

#include"stdafx.h" 

 

#include 

#include 

#include 

#include 

 

#include 

#include 

#include 

usingnamespacestd; 

 

//符号表 

enumeType 

   Symbol 

}; 

mapg_mapSymbol; 

 

enumeCharFlag 

   noFlag, 

   explain 

}; 

 

eCharFlagg_charFlag=noFlag; 

 

int_tmain(intargc,_TCHAR*argv[]) 

   //输入常用标识符 

   g_mapSymbol["if"]=Symbol; 

 

   //获取输入 

   inti=0,j=0,k=0; 

   charoneChar; 

   charfname[200]; 

   memset(fname,0,200); 

   printf("请输入要打开的文件名:

\n"); 

   scanf("%s",fname); 

 

   //for测试 

   //strcpy(fname,"d:

\\1.cpp"); 

 

   //打开文件 

   FILE*fp; 

   if((fp=fopen(fname,"r"))==NULL) 

   { 

       printf("Cannotopeninfile.\n"); 

       exit(0);  

   } 

 

   //int0i; 

 

   //分析文件 

   oneChar=fgetc(fp); 

   charoneWord[256]={0}; 

   intnBuf=0; 

   vectorvecWords; 

   while(oneChar!

=EOF) 

   { 

       if(nBuf==0) 

       { 

           if(oneChar==''||oneChar=='\n'||oneChar=='\t') 

           { 

 

           } 

           elseif(oneChar=='('||oneChar=='{') 

           { 

               oneWord[nBuf++]=oneChar; 

               stringstrWord=oneWord; 

               vecWords.push_back(strWord); 

               nBuf=0; 

               g_charFlag=noFlag; 

               memset(oneWord,0,256); 

               //continue; 

           } 

           elseif(oneChar==')'||oneChar=='}') 

           { 

               oneWord[nBuf++]=oneChar; 

               stringstrWord=oneWord; 

               vecWords.push_back(strWord); 

               nBuf=0; 

               g_charFlag=noFlag; 

               memset(oneWord,0,256); 

               //continue; 

           } 

           elseif(oneChar>='0'&&oneChar<='9') 

           { 

               /*printf("error,不可以数字打头");

               return-1;*/ 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar>='a'&&oneChar<='z') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar>='A'&&oneChar<='Z') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='#') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar==':

') 

           { 

               //界限符号 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='/') 

           { 

               //注释的开始,找第二根横线 

               //或者是路径描述 

               oneWord[nBuf++]=oneChar; 

               g_charFlag=explain; 

           } 

           elseif(oneChar=='(') 

           { 

               //函数的开始,找第二个括号 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar==')') 

           { 

               //函数的结束 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='{') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='}') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar==';') 

           { 

               //语句结束符 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='~') 

           { 

               //析构函数符 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='\"') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='=') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='_') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='?

') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           else 

           { 

               //printf("未处理情况:

%c",oneChar); 

               oneWord[nBuf++]=oneChar; 

           } 

       } 

       else 

       { 

           if(oneChar==''||oneChar=='\t'||oneChar=='\n') 

           { 

               if(g_charFlag!

=explain) 

               { 

                   stringstrWord=oneWord; 

                   vecWords.push_back(strWord); 

                   nBuf=0; 

                   g_charFlag=noFlag; 

                   memset(oneWord,0,256); 

               } 

               elseif(g_charFlag==explain&&oneChar=='\n') 

               { 

                   //如果是注释状态,则碰到回车才截断 

                   stringstrWord=oneWord; 

                   vecWords.push_back(strWord); 

                   nBuf=0; 

                   g_charFlag=noFlag; 

                   memset(oneWord,0,256); 

               } 

           } 

           elseif(oneChar=='('||oneChar=='{') 

           { 

               //oneWord[nBuf++]  =oneChar; 

               stringstrWord=oneWord; 

               vecWords.push_back(strWord); 

               nBuf=0; 

               g_charFlag=noFlag; 

               memset(oneWord,0,256); 

               continue; 

           } 

           elseif(oneChar==')'||oneChar=='}') 

           { 

               //oneWord[nBuf++]  =oneChar; 

               stringstrWord=oneWord; 

               vecWords.push_back(strWord); 

               nBuf=0; 

               g_charFlag=noFlag; 

               memset(oneWord,0,256); 

               continue; 

           } 

           //elseif(oneChar=='\n') 

           //{ 

           // //行末,处理一些情况,例如注释等 

           //} 

           elseif(oneChar>='0'&&oneChar<='9') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar>='a'&&oneChar<='z') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar>='A'&&oneChar<='Z') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='_') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar==':

') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='(') 

           { 

               //函数的开始,找第二个括号 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar==')') 

           { 

               //函数的结束 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='{') 

           { 

               oneWord[nBuf++]=oneChar; 

           }    

           elseif(oneChar=='}') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar==';') 

           { 

               //语句结束符 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='~') 

           { 

               //析构函数符 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='\"') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='*') 

           { 

               //定义指针 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='.') 

           { 

               //.h 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='=') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='/') 

           { 

               //如果是注释状态,等待一行结束 

               //if(g_charFlag==explain) 

               { 

                   //oneWord[nBuf++]  =oneChar; 

                   //stringstrWord=oneWord; 

                   //vecWords.push_back(strWord); 

                   //nBuf=0; 

                   ////g_charFlag=noFlag;     

                   //memset(oneWord,0,256); 

                   //oneWord[nBuf++]  =oneChar; 

               } 

               //else 

               { 

                   oneWord[nBuf++]=oneChar; 

               } 

           } 

           elseif(oneChar==',') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           elseif(oneChar=='?

') 

           { 

               oneWord[nBuf++]=oneChar; 

           } 

           else 

           { 

               oneWord[nBuf++]=oneChar; 

               //printf("未处理情况:

%c",oneChar); 

 

               //stringstrWord="未处理情况:

%s"; 

               //printf("error,未处理情况."); 

               //return-1; 

           } 

       } 

       oneChar=fgetc(fp); 

   } 

   fclose(fp); 

 

   //写入文件 

   FILE*fpIn; 

   if((fpIn=fopen("d:

\\words.txt","w+"))==NULL) 

   { 

       printf("Cannotopeninfile.\n"); 

       exit(0);  

   } 

     

   for(inti=0;i

   { 

       charszBuf[300]; 

       memset(szBuf,0,300); 

       sprintf(szBuf,"%d.%s\n",i,vecWord

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2