资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
#include#include#include#define MAX_COUNT 1024#define ILLEGAL_CHAR_ERR 1#define UNKNOWN_OPERATOR_ERR 2/*从标准输入读入第一个非空白字符(换行符除外)*/char getnbc()char ch;ch = getchar();while (1)if (ch = r | ch = t | ch = )ch = getchar();elsebreak;return ch;/*判断 character是否为字母*/bool letter(char character)if (character = a&character = A&character = 0&character = 0)return true;elsereturn false;/*词法分析函数,每调用一次识别一个符号*/bool LexAnalyze()static int lineNum = 1;char character;char token17 = ;character = getnbc();switch (character)case n:output(EOLN, 24);lineNum+;break;case EOF:output(EOF, 25);return false;/false表示已读到文件末尾case a:case b:case c:case d:case e:case f:case g:case h:case i:case j:case k:case l:case m:case n:case o:case p:case q:case r:case s:case t:case u:case v:case w:case x:case y:case z:case A:case B:case C:case D:case E:case F:case G:case H:case I:case J:case K:case L:case M:case N:case O:case P:case Q:case R:case S:case T:case U:case V:case W:case X:case Y:case Z:while (letter(character) | digit(character)char s2 = character ;strcat(token, s);character = getchar();retract(character);int num;num = reserve(token);if (num != 0)output(token, num);elseint val;val = symbol();output(token, val);break;case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:while (digit(character)char s2 = character ;strcat(token, s);character = getchar();retract(character);int val;val = constant();output(token, val);break;case =:output(=, 12);break;case )output(, 13);else if (character = =)output(:character = getchar();if (character = =)output(=, 16);elseretract(character);output(, 17);break;case -:output(-, 18);break;case *:output(*, 19);break;case :character = getchar();if (character = =)output(:=, 20);elseerror(lineNum, 2);/输出“未知运算符”错误break;case (:output(, 21);break;case ):output(), 22);break;case ;:output(;, 23);break;default:error(lineNum, 1);/输出出现字母表以外的非法字符错误return true;/*获得路径*/void getPath(char* in, char* out)char* name;name = strrchr(in, );if (name != NULL)strncpy(out, in, strlen(in) - strlen(name) + 1);elsestrcpy(out, );/*获得文件名,不包括扩展*/void getFilename(char* in, char* out)char* fullName;char* extension;fullName = strrchr(in, );extension = strrchr(in, .);if (fullName != NULL)strncpy(out, fullName + 1, strlen(fullName) - 1 - strlen(extension);elsestrncpy(out, in, strlen(in) - strlen(extension);/*初始化函数,接收输入文件地址,并打开输入、输出、错误文件、将标准输入重定向到输入文件,将标准输出重定向到输出文件,标准错误重定向到错误文件*/bool init(int argc, char* argv)if (argc != 2)return false;elsechar* inFilename = argv1;/argv1;char outFilenameMAX_COUNT = ;char errFilenameMAX_COUNT = ;char filenameMAX_COUNT = ;char pathMAX_COUNT = ;/获得文件名(不包括扩展名)和路径getFilename(inFilename, filename);getPath(inFilename, path);/生成输出文件全部路径strcat(outFilename, path);/strcat(outFilename, );strcat(outFilename, filename);strcat(outFilename, .dyd);/生成错误文件全部路径strcat(errFilename, path);/strcat(errFilename, );strcat(errFilename, filename);strcat(errFilename, .err);if (freopen(inFilename, r, stdin) != NULL&freopen(outFilename, w, stdout) != NULL&freopen(errFilename, w, stderr) != NULL)return true;elsereturn false;void main(int argc,char* argv)/argv1是输入文件地址if (init(argc,argv)while (LexAnalyze()fclose(stdin);fclose(stdout);fclose(stderr);return;
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号