C语言词法分析器的设计与实现.doc

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言词法分析器的设计与实现

C语言词法分析器的设计与实现 一.实验目的: 1.强化对系统软件综合工程实现能力、规划能力的训练; 2.加强对词法分析原理、方法和基本实现技术的理解; 二.实验内容: 用C语言(或 C++ )作为宿主语言完成: C语言(ANSI C或turbo C 2.0)词法分析器的设计和实现。 三、程序简要说明: 1、属性字说明: 共9种 KEYWORD: 关键字 auto,break,case,char,const,continue, default,do,double,else,enum,extern, float,for,goto,if,int,long,register, return,short,signed,sizeof,static,struct, switch,typedef,union,unsigned,void, volatile,while,include,define 共34个 详见IsKeyWord()函数 NUMBER: 数字 包括十进制整数,八进制整数,二进制整数,十六进制整数 还可返回几种错误 详见IsNumber()函数 CONSTANT: 常量 宏定义标识符,不识别C++关键字const,简单处理一层宏定义。 详见IsDefined()函数 ERROR: 错误 可以识别几种简单的错误,数字四种,单双引号不匹配,注释符不匹配等。 FUNCTIONNAME: 函数名 可以识别自定义函数和库函数,不识别C++语法 详见IsFunctionName()函数 VARIABLE: 变量名 所有其他属性字特征之外的属性 TRANSLATION: 转义字符 \b, \n, \r, \t, \, \, \0, \\, \v, \a, \o, \x共12个 详见源代码417-444行 OPERATOR: 运算符 +-*/%等 INCLUDEFILE: 包含的文件 #include 或””中的字符串 详见IsInclude()函数 2、原程序主要流程: 源程序使用纯C语法,提供了一个字符界面,重写了scanf(源程序中为scanff())函数,以方便用户界面的交互。 总流程: 分析并生成终结果文件流程: 3、主要数据结构: 本程序大量采用缓冲机制,这样做的好处显而易见,提高了程序的执行效率,简化了代码编写的难度,最重要的是,缓解了C语言对内存支配限制的压力。 文件打开以后,对行设立行缓冲区,对属性字设置属性字缓冲区,同时对于判断中的常量储存,关键字存储均以缓冲提供进算法,程序没有任何全局变量,初始化界面后,程序只有一个入口getFileName();这是用户界面与核心程序之间的接口,而程序的核心算法同样只有一个接口analyse(),接口提供的参数只是文件的文件名,这样做的好处是,程序通过analyse()可以随处使用。 另外程序设置了大量的函数,在获得完整的属性字后,通过函数判断属性,并返回属性编号,在输出时,并未对编号进行处理,因为程序之后并没有更进一步的语法分析衔接。 判断采用自动机理论,满足终态条件则返回以获得的属性字。 程序在输出上同样提供了非常人性化的设置,如输出先输出每一行的内容,之后在列出属性字流。 4、部分附加功能处理技巧说明: 由于程序配合了行列号的输出,行号非常容易处理,但是列号要涉及很多空格,回车,制表符等,其中最难处理的是制表符,制表符的长度在判断算法中为8,则通过语句 col += ((TAB - (*col+1) % TAB) % TAB); 可以使col获得期望中的列号。 对单层宏定义,则必然是#define * *的格式,算法将第一个*中的内容存入数组(definebuf),后面接一个空白符,再存入第二个*的内容 definebuf的结构 对函数名的判断,这个算法并不是简单的字符串匹配,而是要看这个标识符后面的内容, 由于程序对单行判断,除多行注释,并未提供匹配记忆,所以对于一下写法程序无能为力 printf /*******函数调用信息另起了一行,将不能正确识别*******/ (“abcd”); 所以在使用本程序时,请提供尽量规范的代码 对于C++语法规则int i(3);程序将会把i判断为函数名,所以请使用标准C语言的代码。本人能力有限,

文档评论(0)

chenchenc + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档