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

2014-11-24 12:36:27 · 作者: · 浏览: 0

很久以前就想写个C++ 的类解析器了,终于花了一晚上时间,写了一个C++ 头文件和CPP文件的解析。其实跟我上篇“编译原理”的文章说的一样,词法分析和语法分析最基本就是一堆if-else 或者switch-case。不要被什么有穷自动机吓倒了。。。

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

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

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

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

下面就是这个程序代码,能直接拷贝编译运行的。代码也有注释,逻辑比较清楚了。

// CodeParser.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include

#include

#include

#include

#include

#include

#include

using namespace std;

// 符号表

enum eType

{

Symbol

};

map g_mapSymbol;

enum eCharFlag

{

noFlag,

explain

};

eCharFlag g_charFlag = noFlag;

int _tmain(int argc, _TCHAR* argv[])

{

// 输入常用标识符

g_mapSymbol["if"] = Symbol;

// 获取输入

int i=0,j=0,k=0;

char oneChar;

char fname[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("Cannot open infile.\n");

exit(0);

}

//int 0i;

// 分析文件

oneChar=fgetc(fp);

char oneWord[256]={0};

int nBuf = 0;

vector vecWords;

while (oneChar!=EOF)

{

if(nBuf == 0)

{

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

{

}

else if(oneChar == '(' || oneChar == '{')

{

oneWord[nBuf++] = oneChar;

string strWord = oneWord;

vecWords.push_back(strWord);

nBuf = 0;

g_charFlag = noFlag;

memset(oneWord, 0, 256);

//continue;

}

else if(oneChar == ')' || oneChar == '}')

{

oneWord[nBuf++] = oneChar;

string strWord = oneWord;

vecWords.push_back(strWord);

nBuf = 0;

g_charFlag = noFlag;

memset(oneWord, 0, 256);

//continue;

}

else if(oneChar >= '0' && oneChar <= '9')

{

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

return -1;*/

oneWord[nBuf++] = oneChar;

}

else if(oneChar >= 'a' && oneChar <= 'z')

{

oneWord[nBuf++] = oneChar;

}

else if(oneChar >= 'A' && oneChar <= 'Z')

{

oneWord[nBuf++] = oneChar;

}

else if(oneChar == '#')

{

oneWord[nBuf++] = oneChar;

}

else if(oneChar == ':')

{

// 界限符号

oneWord[nBuf++] = oneChar;

}

else if(oneChar == '/')

{

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

// 或者是路径描述

oneWord[nBuf++] = oneChar;

g_charFlag = explain;

}

else if(oneChar == '(')

{

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

oneWord[nBuf+