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

2014-11-24 12:36:27 · 作者: · 浏览: 2
ring paramList;

}stFunc;

vector vecFunc; // 解析出函数

for(int i = 0; i < vecWords.size(); i++)

{

if(vecWords[i] == "#include" )

{

// 语法分析会随着词法分析结果而变化

//if(i > 0)

//{

// // 没被注释掉的头文件

// if(vecWords[i-1] != "//")

// {

// vecHeader.push_back(vecWords[i+1]);

// }

//}

vecHeader.push_back(vecWords[i+1]);

}

else if(vecWords[i] == "(")

{

// 前面是函数名, 后面是参数

if(i > 0)

{

if(g_mapSymbol.find(vecWords[i-1]) != g_mapSymbol.end())

{

// 说明是标准标示词,不是函数

continue;

}

stFunc f;

f.funcName = vecWords[i-1];

string strParamList = "(";

while(vecWords[i++] != ")")

{

if(vecWords[i] == "(")

{

strParamList += "(";

while(vecWords[i++] != ")")

{

strParamList += " ";

strParamList += vecWords[i];

}

}

strParamList += " ";

strParamList += vecWords[i];

}

f.paramList = strParamList;

vecFunc.push_back(f);

}

}

else if(vecWords[i] == "()")

{

// 前面是函数名, 中间无参数

if(i > 0)

{

stFunc f;

f.funcName = vecWords[i-1];

f.paramList = "";

vecFunc.push_back(f);

}

}

else if(vecWords[i] == "class")

{

// 后一个是类名

string strClass = vecWords[i+1];

vecClass.push_back(strClass);

}

}

// Grammar 写入文件

if ((fpIn= fopen("d:\\grammar.txt","w+"))== NULL)

{

printf("Cannot open infile.\n");

exit(0);

}

// 头文件

for(int i = 0; i < vecHeader.size(); i++)

{

char szBuf[500];

memset(szBuf, 0, 500);

sprintf(szBuf, "%d. %s \n", i, vecHeader[i].c_str());

fwrite(szBuf, strlen(szBuf), 1, fpIn);

}

fwrite("\n\n\n", 2, 1, fpIn);

// 类名

for(int i = 0; i < vecClass.size(); i++)

{

char szBuf[500];

memset(szBuf, 0, 500);

sprintf(szBuf, "%d. %s \n", i, vecClass[i].c_str());

fwrite(szBuf, strlen(szBuf), 1, fpIn);

}

fwrite("\n\n\n", 2, 1, fpIn);

// 函数

for(int i = 0; i < vecFunc.size(); i++)

{

char szBuf[500];

memset(szBuf, 0, 500);

sprintf(szBuf, "%d. %s %s \n", i, vecFunc[i].funcName.c_str(), vecFunc[i].paramList.c_str());

fwrite(szBuf, strlen(szBuf), 1, fpIn);

//printf("%d. %s\n", i, vecWords[i].c_str());

}

fclose(fpIn);

// 解析完成

printf("解析完成...\n");

printf("词法分析结果: d:\\words.txt 语法分析结果: d:\\grammar.txt, 请输入任何键结束...\n");

getch();

return 0;

}

自己执行就可以看到了,如果有什么问题,可以在下面提问

转载请注明:出自 一雨田的专栏(http://blog.csdn.net/dylgsy)