没有合适的资源?快使用搜索试试~ 我知道了~
C++ 代码解析(词法分析、语法分析).pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 182 浏览量
2022-11-04
08:26:40
上传
评论
收藏 424KB PDF 举报
温馨提示
试读
21页
。。。
资源推荐
资源详情
资源评论
C++ 代码解析(词法分析、语法分析)
很久以前就想写个 C++ 的类解析器了,终于花了一晚上时间,写了一个 C++ 头
文件和 CPP 文件的解析。其实跟我上篇“编译原理”的文章说的一样,词法分析和语
法分析最基本就是一堆 if-else 或者 switch-case。不要被什么有穷自动机吓倒了。。。
下面的代码是一个基本的词法和语法分析,能工作,但现在这个实验品,肯
定不会很完善,请各位看官见谅。
能解析出来所包含的头文件、类名(输入.h 文件可以解析出类名)、函数
名等,需要的功能自己再加吧。
程序我直接一个 main 函数写下来的,完全 C 风格,不用跟我讲什么分函数、
分类之类的话,我也知道,后期我在代码上会分好,不过不一定贴上来了,要分你可
以自己分一下,如果能共享出来给我学习一下,那更感谢了。
我这个程序就是让你看看一个词法分析和一个语法分析的最简单的写法,同
时也实现一些有点用的功能。
下面就是这个程序代码,能直接拷贝编译运行的。代码也有注释,逻辑比较清楚
了。
// CodeParser.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <conio.h>
#include <vector>
#include <string>
#include <map>
using namespace std;
// 符号表
enum eType
{
Symbol
};
map<string, eType> 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<string> 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')
{
剩余20页未读,继续阅读
资源评论
G11176593
- 粉丝: 6678
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功