电子科技大学-计算机学院-编译原理实验-词法分析

上传人:第*** 文档编号:32760339 上传时间:2018-02-12 格式:DOC 页数:9 大小:108.57KB
返回 下载 相关 举报
电子科技大学-计算机学院-编译原理实验-词法分析_第1页
第1页 / 共9页
电子科技大学-计算机学院-编译原理实验-词法分析_第2页
第2页 / 共9页
电子科技大学-计算机学院-编译原理实验-词法分析_第3页
第3页 / 共9页
电子科技大学-计算机学院-编译原理实验-词法分析_第4页
第4页 / 共9页
电子科技大学-计算机学院-编译原理实验-词法分析_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《电子科技大学-计算机学院-编译原理实验-词法分析》由会员分享,可在线阅读,更多相关《电子科技大学-计算机学院-编译原理实验-词法分析(9页珍藏版)》请在金锄头文库上搜索。

1、#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 =

2、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表示已读到文件末尾cas

3、e 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:ca

4、se 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

5、 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(:chara

6、cter = 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;c

7、ase ;: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* fullN

8、ame;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

9、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);

10、/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;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号