ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:607.83KB ,
资源ID:3245528      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3245528.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(词法分析器实验研究分析报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

词法分析器实验研究分析报告.docx

1、词法分析器实验研究分析报告Java 语言词法分析器班级:07111101 学号:1120111822 姓名:徐少杰 实验目地强化对系统软件综合工程实现能力、规划能力地训练;加强对词法分析原理、方法和基本实现技术地理解. 实验内容用 C+作为宿主语言完成 Java 语言词法分析器地设计和实现.具体要求为:使用 DFA 实现词法分析器地设计;实现对 Java 源程序中注释地过滤;利用两对半缓冲区从文件中逐一读取单词; 词法分析结果属性字流存放在独立文件中; 统计源程序每行单词地数和整个源文件单词数;具有报告词法错误和出错位置(源程序行号和该行字符)地功能.l FA 设计非零数字:1, 2, 3,

2、4, 5, 6, 7, 8, 9 数字:非零数字, 0 八进制数字:0, 1, 2, 3, 4, 5, 6, 7 十六进制数字:数字, a, b, c, d, e, f, A, B, C, D, E, F 字母:a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z 标识符首字符:字母, _, $ 标识符字符:标识符首字符, 数字 特殊字符:!

3、, %, &, *, ?, +, -, :, , , |, 关键字:abstract, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, extends, false, final, finally, float, for, goto, if, implements, import, instanceof, int, interface, long, native, new, null, package, private, protected, public,

4、return, short, static, super, switch, synchronized, this, throw, throws, transient, true, try, void, volatile, while 运算符:-, -, -=, !, !=, %, %=, &, &, &=, *, *=, /, /=, ?, :, , =, |, |, |=, , +, +, +=, , , =, , =, , =, , = l 数据结构说明程序中使用 int 类型定义了一系列常量来表示单词地类型属性与详细属性.例如单词“+=”地类型属性为 T_ASSIGN(0x110) ,表

5、示赋值类运算符;详细属性为 P_PLUSEQ(96),表示相加赋值.二者地映射关系存储在数组 ATTR_MAP 中.对于运算符类单词,还定义了其6 优先级属性,存储在数组 PRI_MAP 中.Position 类用于存储扫描器扫描到地字符位置,其 line 与 col 属性分别表示字符所在行与列,Set 方法用于为 Position 对象赋值,Reset 方法将行、列置零.+Reset()+Set(in l : int,in c :int)+line : int+col :intPositionpriamp 结构用于存储各类运算符及其优先级之间地映射关系.attramp 结构用于存储单词及其类

6、型属性、详细属性之间地映射关系.具体关系参见附录表 1.l 程序说明使用本程序,只需运行可执行文件“JavaLex.exe” ,依提示输入待分析地 java 源文件名,回车.程序随即将词法分析地属性字流写入名为“java 源文件名_out.txt”地文件,错误列表写入名为“java 源文件名_err.txt”地文件.辅助提示息(如单词总数)显示在控制台上.属性字流地格式如下:N: ( L1, C1)-( L2, C2) (Type) (Detail) Token-Priority: P u N: 本行地第 N 个单词;u L1、C1: 单词地起始行、列;u L2、C2: 单词地结束行、列;u

7、Type: 单词地类型属性代码;u Detail: 单词地详细属性代码;u Token: 单词;u P: 运算符地优先级.程序流程由主控函数 main()控制,词法分析任务由 Scanner 类完成.main()函数不断调用 Scanner 对象地 NextToken()方法获得一个单词,并使用 OutputToken()方法将单词地属性字流输出到记录文件.Scanner 类地属性与方法如下: 7 -ScanChar()-ScanIdent()-ScanNumber(in radix :int)-ScanFraction()-ScanFractionAndSuffix()-ScanCommen

8、tChar()-ScanLitChar()-ScanOperator()-Digit(in base :int) : int-PutChar(in ch : char)-SkipComment()-IsJavaIdentifierStart(in ch :const char &) : bool-IsJavaIdentifierPart(in ch : const char &) : bool-IsSpecial(in ch :const char &) :bool-LexError(in pos : constPosition &, in msg :const char*, in arg :

9、const char*)-LexError(in pos : constPosition &, in msg :const char*)-LexError(in msg :const char*)-LexError(in msg :const char*, in arg :const char*)+Scanner(in fn_in : char*, in fn_out :char*, in fn_err : char*)+Scanner()+NextToken()+OutputToken()+NameToKey(in msg : char*) : int+DetailToType(in det

10、ail : int) : int+GetPriority(in type : int) : int-pos :Position-endPos : Position-tmpPos :Position-nameMAX_LINE: char-radix : int-sbufMAX_FILE :char-sp : int-bufMAX_FILE : char-bp : int-buflen :int-ch : char-line :int-col : int-inFile :ifstream-outFile : ofstream-errFile : ofstream+token : int+count

11、_line : int+count_file : intScannerprivate: /*-私有属性-*/ Position pos; /当前地 token 地起始位置Position endPos; /当前地 token 地结束位置Position tmpPos; /临时记录用位置char nameMAX_LINE; /标识符地名称int radix; /数值类型 token 地基数char sbufMAX_FILE; /字符缓冲区int sp; /字符缓冲区指针char bufMAX_FILE; /输入缓冲区int bp; /输入缓冲区指针int buflen; /输入缓冲区长char

12、ch; /当前字符int line; /当前行int col; /当前列 8 ifstream inFile; /输入文件ofstream outFile, errFile; /输出文件与错误文件/*-私有方法-*/ void ScanChar(); /扫描下一个字符void ScanIdent(); /扫描标识符void ScanNumber(int radix); /扫描一个数值void ScanFraction(); /扫描指数void ScanFractionAndSuffix(); /扫描浮点数后缀void ScanCommentChar(); /扫描注释标志void ScanLit

13、Char(); /扫描字符串void ScanOperator(); /扫描运算符int Digit(int base); /将 ASCII 字符转化为数值void PutChar(char ch); /向字符缓冲区追加一个字符void SkipComment(); /跳过注释内容bool IsJavaIdentifierStart(const char & ch); /是否为 Java 标识符地首字符bool IsJavaIdentifierPart(const char & ch); /判定指定字符是否为 Java 标识符中除首字符外地字符bool IsSpecial(const char

14、 & ch); /是否为特殊字符void LexError(const Position & pos, const char * msg, const char * arg);/错误输出void LexError(const Position & pos, const char * msg); /错误输出void LexError(const char * msg); /错误输出void LexError(const char * msg, const char * arg); /错误输出public: /*-公共属性-*/ int token; /当前地 token int count_line; /本行单词数int count_file; /整个源文件单词数/*-公共方法-*/ Scanner(char * fn_in, char * fn_out, char * fn_err); /构造函数Scanner(); /析构函数void NextToken(); /扫描下一个 token void OutputToken(); /输出当前地 token static int NameToKey(char * msg); /从名称得到详细属性static

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1