词法分析器实验报告.doc_第1页
词法分析器实验报告.doc_第2页
词法分析器实验报告.doc_第3页
词法分析器实验报告.doc_第4页
词法分析器实验报告.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java 语言词法分析器班级:07111101 学号:1120111822 姓名:徐少杰 实验目的强化对系统软件综合工程实现能力、规划能力的训练;加强对词法分析原理、方法和基本实现技术的理解。 实验内容用 C+作为宿主语言完成 Java 语言词法分析器的设计和实现。具体要求为:使用 DFA 实现词法分析器的设计;实现对 Java 源程序中注释的过滤;利用两对半缓冲区从文件中逐一读取单词; 词法分析结果属性字流存放在独立文件中; 统计源程序每行单词的数和整个源文件单词数;具有报告词法错误和出错位置(源程序行号和该行字符)的功能。l FA 设计非零数字:1, 2, 3, 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 标识符首字符:字母, _, $ 标识符字符:标识符首字符, 数字 特殊字符:!, %, &, *, ?, +, -, :, , , |, 关键字: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, return, short, static, super, switch, synchronized, this, throw, throws, transient, true, try, void, volatile, while 运算符:-, -, -=, !, !=, %, %=, &, &, &=, *, *=, /, /=, ?, :, , =, |, |, |=, , +, +, +=, , , =, , =, , =, , = l 数据结构说明程序中使用 int 类型定义了一系列常量来表示单词的类型属性与详细属性。例如单词“+=”的类型属性为 T_ASSIGN(0x110) ,表示赋值类运算符;详细属性为 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 结构用于存储单词及其类型属性、详细属性之间的映射关系。具体关系参见附录表 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 Type: 单词的类型属性代码;u Detail: 单词的详细属性代码;u Token: 单词;u P: 运算符的优先级。程序流程由主控函数 main()控制,词法分析任务由 Scanner 类完成。main()函数不断调用 Scanner 对象的 NextToken()方法获得一个单词,并使用 OutputToken()方法将单词的属性字流输出到记录文件。Scanner 类的属性与方法如下: 7 -ScanChar()-ScanIdent()-ScanNumber(in radix :int)-ScanFraction()-ScanFractionAndSuffix()-ScanCommentChar()-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 :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 detail : 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_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 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 ScanLitChar(); /扫描字符串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 & 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 int DetailToType(int detail); /从详细属性得到类型属性static int GetPriority(int type); /得到运算符优先级l 附录表 1 单词属性对照表单词 详细属性 类型属性+ P_PLUS T_ADDSUB - P_SUB T_ADDSUB ! P_BANG T_UNIFY 9 % P_PERCENT T_MULDIV P_CARET T_BITXOR & P_AMP T_BITAND * P_STAR T_MULDIV | P_BAR T_BITOR P_TILDE T_UNIFY / P_SLASH T_MULDIV P_GT T_COMPARE P_LT T_COMPARE ? P_QUES T_TERNARY : P_COLON T_TERNARY = P_EQ T_ASSIGN + P_PLUSPLUS T_UNIFY - P_SUBSUB T_UNIFY = P_EQEQ T_EQUALITY = P_GTEQ T_COMPARE != P_BANGEQ T_EQUALITY P_GTGT T_SHIFT P_GTGTGT T_SHIFT += P_PLUSEQ T_ASSIGN -= P_SUBEQ T_ASSIGN *= P_STAREQ T_ASSIGN /= P_SLASHEQ T_ASSIGN &= P_AMPEQ T_ASSIGN |= P_BAREQ T_ASSIGN = P_CARETEQ T_ASSIGN %= P_PERCENTEQ T_ASSIGN = P_GTGTEQ T_ASSIGN = P_GTGTGTEQ T_ASSIGN | P_BARBAR T_OR & P_AMPAMP T_AND abstract P_ABSTRACT T_KEYWORD assert P_ASSERT T_KEYWORD boolean P_BOOLEAN T_KEYWORD break P_BREAK T_KEYWORD byte P_BYTE T_KEYWORD case P_CASE T_KEYWORD catch P_CATCH T_KEYWORD char P_CHAR T_KEYWORD class P_CLASS T_KEYWORD const P_CONST T_KEYWORD 10 continue P_CONTINUE T_KEYWORD default P_DEFAULT T_KEYWORD do P_DO T_KEYWORD double P_DOUBLE T_KEYWORD else P_ELSE T_KEYWORD extends P_EXTENDS T_KEYWORD final P_FINAL T_KEYWORD finally P_FINALLY T_KEYWORD float P_FLOAT T_KEYWORD for P_FOR T_KEYWORD goto P_GOTO T_KEYWORD if P_IF T_KEYWORD implements P_IMPLEMENTS T_KEYWORD import P_IMPORT T_KEYWORD instanceof P_INSTANCEOF T_KEYWORD int P_INT T_KEYWORD interface P_INTERFACE T_KEYWORD long P_LONG T_KEYWORD native P_NATIVE T_KEYWORD new P_NEW T_KEYWORD package P_PACKAGE T_KEYWORD private P_PRIVATE T_KEYWORD protected P_PROTECTED T_KEYWORD public P_PUBLIC T_KEYWORD return P_RETURN T_KEYWORD short P_SHORT T_KEYWORD static P_STATIC T_KEYWORD strictfp P_STRICTFP T_KEYWORD super P_SUPER T_KEYWORD switch P_SWITCH T_KEYWORD synchronized P_SYNCHRONIZED T_KEYWORD this P_THIS T_KEYWORD throw P_THROW T_KEYWORD throws

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论