中易网

简单编译器的实现

答案:4  悬赏:10  
解决时间 2021-02-18 03:30
输入:if程序语句,例如
if a>b then
m=n1*n2+n3/n4-n5
end if

输出:
词法分析:单词表,包括关键字表和变量表,词法是否正确
语法分析:语法是否正确,如果不正确:指出不正确之处
中间代码转换:表达式转换为逆波兰式

上一个问题取消,请回答下面这个问题(C/C++实现)

语法分析,要求如下:

输入:if程序语句,例如
if … then

end if

if程序语句可嵌套
输出:
判断:语法是否正确
如果不正确:指出不正确之处
最佳答案
你这不是C语言的编译器吧
全部回答
这个和数据结构中,利用栈来判断括号是否配对的问题是差不多的。
参考《编译原理和实践》源码。改两句应该可以直接用。
#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, "C:\\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') { 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++] = oneChar; } else if(oneChar == ')') { // 函数的结束 oneWord[nBuf++] = oneChar; } else if(oneChar == '{') { oneWord[nBuf++] = oneChar; } else if(oneChar == '}') { oneWord[nBuf++] = oneChar; } else if(oneChar == ';') { // 语句结束符 oneWord[nBuf++] = oneChar; } else if(oneChar == '~') { // 析构函数符 oneWord[nBuf++] = oneChar; } else if(oneChar == '\"') { oneWord[nBuf++] = oneChar; } else if(oneChar == '=') { oneWord[nBuf++] = oneChar; } else if(oneChar == '_') { oneWord[nBuf++] = oneChar; } else if(oneChar == '?') { oneWord[nBuf++] = oneChar; } else { //printf("未处理情况:%c", oneChar); oneWord[nBuf++] = oneChar; } } else { if(oneChar == ' ' || oneChar == '\t' || oneChar == '\n') { if(g_charFlag != explain) { string strWord = oneWord; vecWords.push_back(strWord); nBuf = 0; g_charFlag = noFlag; memset(oneWord, 0, 256); } else if(g_charFlag == explain && oneChar == '\n') { // 如果是注释状态,则碰到回车才截断 string strWord = oneWord; vecWords.push_back(strWord); nBuf = 0; g_charFlag = noFlag; memset(oneWord, 0, 256); } } 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 == '\n') //{ // // 行末, 处理一些情况, 例如注释等 //} else if(oneChar >= '0' && oneChar <= '9') { 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; } else if(oneChar == ')') { // 函数的结束 oneWord[nBuf++] = oneChar; } else if(oneChar == '{') { oneWord[nBuf++] = oneChar; } else if(oneChar == '}') { oneWord[nBuf++] = oneChar; } else if(oneChar == ';') { // 语句结束符 oneWord[nBuf++] = oneChar; } else if(oneChar == '~') { // 析构函数符 oneWord[nBuf++] = oneChar; } else if(oneChar == '\"') { oneWord[nBuf++] = oneChar; } else if(oneChar == '*') { // 定义指针 oneWord[nBuf++] = oneChar; } else if(oneChar == '.') { // .h oneWord[nBuf++] = oneChar; } else if(oneChar == '=') { oneWord[nBuf++] = oneChar; } else if(oneChar == '/') { // 如果是注释状态, 等待一行结束 //if(g_charFlag == explain) { //oneWord[nBuf++] = oneChar; //string strWord = oneWord; //vecWords.push_back(strWord); //nBuf = 0; ////g_charFlag = noFlag; //memset(oneWord, 0, 256); //oneWord[nBuf++] = oneChar; } //else { oneWord[nBuf++] = oneChar; } } else if(oneChar == ',') { oneWord[nBuf++] = oneChar; } else if(oneChar == '?') { oneWord[nBuf++] = oneChar; } else { oneWord[nBuf++] = oneChar; //printf("未处理情况:%c", oneChar); //string strWord = "未处理情况:%s"; //printf("error, 未处理情况."); //return -1; } } oneChar=fgetc(fp); } fclose(fp); // 写入文件 FILE *fpIn; if ((fpIn= fopen("C:\\words.txt","w+"))== NULL) { printf("Cannot open infile.\n"); exit(0); } for(int i = 0; i < vecWords.size(); i++) { char szBuf[300]; memset(szBuf, 0, 300); sprintf(szBuf, "%d. %s\n", i, vecWords[i].c_str()); fwrite(szBuf, strlen(szBuf), 1, fpIn); //printf("%d. %s\n", i, vecWords[i].c_str()); } fclose(fpIn); // 语法解析 // 首先要对括号进行匹配,验证语法等 vector vecClass; // 解析出类 vector vecHeader; // 解析出头文件 typedef struct { string funcName; string 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); } } // syntax 写入文件 if ((fpIn= fopen("C:\\syntax.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("词法分析结果: C:\\words.txt 语法分析结果: C:\\syntax.txt, 请输入任何键结束...\n"); getch(); return 0; }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
丁家套怎么去啊,有知道地址的么
女生防色狼,要:菜刀在手,叫他别走,一个巴
中国南方电网青狮营业厅地址在哪,我要去那里
如何孝敬父母的作文300字
如何把握技能型高职教育与应用型本科教育的差
三个连续的偶数的和是288,三个数分别是多少?
兰州红运拉面通信电缆厂店在哪里啊,我有事要
香料粉碎好还是不粉碎好
="第"&INT(1+(MONTH(A3)-1)/3)&"季度
承德围场县到北京
高中导数应用题
停经42天,HCG检测为阳性,但宫腔内未见明显
应用软件变成LNK怎么办
蜂蜜在国内市场上真假比例有多大
去理发店做什么能让头发很顺有又光泽,而且不
推荐资讯
简单回答一下 金融服务一体化对保险行业的影
后槐树庄地址在哪,我要去那里办事
电脑鼠标的USB接口怎么转换成PS/2(圆形
流量阻抗数据中的zz分别是什么意思
长沙县统计局这个地址在什么地方,我要处理点
在你住的地方有什么有趣的节日吗? 英语翻译
个人信用记录大概多久会消除
扬州市广陵区梅岭中心小学食堂招标公告
循化撒拉族自治县兽药饲料监察所怎么去啊,有
中等饭店用一些什么瓷砖
我驾驶黑车被交警扣了驾驶证也扣了正常应该怎
加油站(肖庄村)怎么去啊,有知道地址的么
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?