词法分析器实验报告代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译系统课程实验报告实验1:词法分析
常数:
digits -> digit digit*
optionalFraction -> .digits|ε
optionalExponent -> E(+|-|ε)digits|ε
number -> digits optionalFraction optionalExponent
运算符:
(除/,/=外的)op -> + | - | * | += | -= | *= | % | ++ | -- | != | == | > | < | >= | <= | >> | << | ^ | | | & | && | || | ! | !=
(以/开头的)op->/|/=
界符:Boundary -> { | } | [ | ] | ( | ) | , | ; | : | ? |~
行//注释:Comment->//(除\n外的字符)*\n
块/**/注释:Comment->/*(除*/外的字符)*/
8进制:OCT -> 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
16进制:HEX -> 0x(1|…|9|a|…|f) (0|…|9|a|…|f)*
字符常数:char -> ' (a|b|c|...|z|A|B|C|...|Z|_) '
字符串常数:string-> "((((除\和”外的字符)*|\(所有字符)+)(除\和”外的字符|\”))*)"(2)各类单词的转换图
标识符:
8进制,16进制,10进制常数:
运算符:
界符:
行//注释:
块/**/注释:字符常数:字符串常数:
词法分析系统主要分为三部分:前端,核心处理程序和后端。
前端:负责展示用户界面,(1)从外部文件中读取DFA转换表;(2)读取测试样例,或者直接在界面上编辑测试样例;(3)将文本传入核心处理程序。
核心处理程序:负责对读取的文本进行词法分析,将生成的token序列以及错误信息传入系统后端。
后端:负责对结果进行展示,将token序列与错误信息打印输出在用户界面上。
(2)系统详细设计:对如下工作进行展开描述
✓核心数据结构的设计
核心为纯模拟+JFrame。由于DFA的确定性,每次可以根据当前状态和下一个输入字符确定下一个状态。
一直循坏重复以下动作:
1.如果没有下一个状态可行,字符回退一格,并判断当前状态是否是终止状态,若是,则识别成功;若不是,识别失败,格式错误,清空记录(当初始状态时是在过滤换行、空格、制表符)
2.如果字符不合法(不在DFA的列中),则报“非法字符”错
3.合法的话,则更新状态和记录。
✓主要功能函数说明
1.判断是否是字母、数字等等DFA列的布尔函数
boolean IsLetter_
boolean IsDigit
boolean IsOp
boolean Isjie
boolean Is_end
boolean ck_reser
....
2.Lexer.lex():生成token序列、识别进程、错误信息,模拟DFA运转
读入一个string,返回一个string(包含token序列,识别过程以及错误信息)格式如下:
循环模拟,具体流程见流程图。
3.Lexer.init():初始化状态,读入DF表,终止状态表。
4.Lexer.get_next():枚举DFA列,进行状态转移。
四、系统实现及结果分析
词法分析结果:
(3)输出针对此测试程序对应的词法错误报告;
(4)对实验结果进行分析。
词法分析器读入源程序后,对于各类正确单词能够进行识别,根据上述测试样例可以看到成功识别了:
(1)标识符(“id”、”name”、”flag”、”a”、”b”、”ch”、”cch”等);