收藏 分享(赏)

词法分析2.doc

上传人:fmgc7290 文档编号:6824597 上传时间:2019-04-23 格式:DOC 页数:7 大小:29KB
下载 相关 举报
词法分析2.doc_第1页
第1页 / 共7页
词法分析2.doc_第2页
第2页 / 共7页
词法分析2.doc_第3页
第3页 / 共7页
词法分析2.doc_第4页
第4页 / 共7页
词法分析2.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、词法分析程序 (2008-10-23 15:58:26) 编译原理词法分析程序:要求:(1) 输入算数表达式,识别出单词,并保存到文件;(2) 输入表达式中可能包含空格;(3) 算符包括+,-,*,/,(,);(4) 运算数包括无符号整数和标识符,如 2*xy-100;(5) 标识符以字母或下划线开头,后面可以跟字母、下划线或数字;(6)输出保存在文件中(如:a.txt)。输出到文本文件。每个单词输出为二元组(单词类别,单词值)。单词类别编码见下表:编码 类别说明0 算符1 常量2 变量例 1:以下是表达式 xy-(x-100)/2 的输出:2,xy0,-0,(2,x0,-1,1000,)0,

2、/1,2例 2:以下是表达式 2x * (_x2 y)的输出:1,22,x0,*0,(2,_x20,-2,y0,)例 3:以下是表达式 x y * 012 的输出:2,xy0,*1,012源程序:/ WordAnalysis.cpp : Defines the entry point for the console application./#include “stdafx.h“#include #include #include #include “Chars.h“#define MAX_DATA_LEN 256 / 数据缓冲区长度/ word type#define WT_OPERATOR

3、 0 / 操作符#define WT_UINT 1 / 非负整数#define WT_VARIABLE 2 / 变量struct WORDNODEunsigned short byType; / 类别char ValueMAX_DATA_LEN; / 值WORDNODE *pNext; / 下一结点;/ 预处理:将多余空格去掉void Prefix(char c)for (int i = 0, j = 0; j pNext;free(pHeader);pHeader = pNode;/ 增加结点WORDNODE* AddNode(char c, int nBegin, int nEnd, un

4、signed short byType, WORDNODE *pTail)WORDNODE *pNode = (WORDNODE *)malloc(sizeof(WORDNODE);pNode-byType = byType;pNode-pNext = NULL;int nChars = nEnd - nBegin + 1;memcpy(pNode-Value, pNode-ValuenChars = 0;pTail-pNext = pNode;return pNode;/ 根据上一状态获取单词类别int Judg(char pass_c)/我自己写的类型判别函数if(IsOperator(p

5、ass_c)return 0;if(IsNumChar(pass_c)return 1;if(IsEnglishCharOr_(pass_c)return 2;else return 0xFF;WORDNODE* IdentifyOneWord(char c, int int con_num;/状态变量int num_star,num_ter;/the place of starting and terminal of wordnum_star=nCur;con_num=Judg(cnCur);donCur+;if(con_num!=2) if(con_num=0return AddNode(

6、c,num_star,num_ter,con_num,pTail);num_star=nCur;if(con_num!=Judg(cnCur)num_ter=nCur-1;return AddNode(c,num_star,num_ter,con_num,pTail);num_star=nCur;else if(con_num=2)if(!(Judg(cnCur)=1|Judg(cnCur)=2)num_ter=nCur-1;return AddNode(c,num_star,num_ter,con_num,pTail);num_star=nCur;while(cnCur!=/0);/ 词法分

7、析WORDNODE* WordAnalysis(char c)/ 第一个结点作为头结点,不使用WORDNODE *pHeader = (WORDNODE *)malloc(sizeof(WORDNODE);pHeader-pNext = NULL;WORDNODE *pTail = pHeader, *pNode = NULL;/ 词法分析for (int nCur = 0; cnCur != 0; )/ 识别一个单词pNode = IdentifyOneWord(c, nCur, pTail);if (pNode = NULL) / 出错Clear(pHeader);return NULL;

8、/ 识别下一个单词pTail = pNode;return pHeader;bool Save(WORDNODE *pHeader)/ 文件名char FileName256;printf(“单词序列输出文件名(如 a.txt):n“);scanf(“%s“, FileName);/ 打开文件FILE *f = fopen(FileName, “w“);if (f = NULL)Clear(pHeader);return false;/ 空出第一个结点WORDNODE *pNode = pHeader-pNext;/ 保存数据while (pNode != NULL)fprintf(f, “%

9、c,%sn“, pNode-byType + 0, pNode-Value);pNode = pNode-pNext;/ 关闭文件fclose(f);return true;/ 主函数int main(int argc, char* argv)/ 输入char cMAX_DATA_LEN;printf(“请输入表达式:n“);gets(c);/ 预处理Prefix(c);/ 词法分析WORDNODE *pHeader = WordAnalysis(c);if (pHeader = NULL)printf(“n 词法分析错误!n“);return 0;/ 保存if (!Save(pHeader)

10、printf(“n 保存文件失败n“);return 0;/ 清空数据Clear(pHeader);/ 完成printf(“n 词法分析成功,并已保存到文件n“, c);printf(“按任意键退出n“, c);getchar();getchar();return 0;Chars.h/如下:#if !defined(AFX_CHARS_H_D2786D29_6773_4679_93E5_3FC3AF73385F_INCLUDED_)#define AFX_CHARS_H_D2786D29_6773_4679_93E5_3FC3AF73385F_INCLUDED_/ c 是否为英文字符或下划线bool IsEnglishCharOr_(char c)return (c = a / c 是否为运算符bool IsOperator(char c)switch (c)case +:case -:case *:case /:case (:case ):return true;return false;#endif

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报