}stFunc;
vector
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)