编写词法分析程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二、实验设计
设计原理
“确定的有穷机” :在当前状态下,输入一个符号,有穷自动机将转换到唯一的一个后 继状态; 通过对整个文法构造一个总的 DFA, DFA 的每个终态识别一个单词, 从初始状态出发, 每读入一个单词,切换到下一个状态,期间要是读到非法符号则报错处理。
设计方法
1. 2. 3. 4. 5. 6. 根据 TEST 语言的词法规则,分别写出每条规则的正则文法或者正则表达式; 将每一个正则文法或者正则表达式转换为 NFA; 将多个 NFA 合并; 确定化 NFA 并化简; 确定单词分类、单词输出方案; 编写词法分析程序。
Y
ID
N
N Y
输出 KEYWORDS
/
读字符
*? Y
Y
读字符
/?
N
输出 singleword
N
N
输出非法字 符
读字符
结束
程序流程框图
三、实验过程
程序编写基本思路
本程序分为两个文件,词法分析函数一个文件,主函数一个文件(负责传入文件需要做 词法分析的文件和输出文件的地址) 记录单词的字符串有两个 buffer1 和 buffer2,当读到一个字符符合单词匹配的时候放入 buffer1, 继续往下读字符放到 buffer1, 直到读到形成一个完整单词时, 把这个单词放入 buffer2, 以保证 buffer2 中始终存放的是一个单词;继续往下读字符,如果读到了非单词匹配字符, 输出 buffer2,清空 buffer1,buffer2 继续下面的单词匹配;如果读到的字符还能继续匹配, 那就一直读,并把读到的字符放入 buffer1 中,直到读到一个能再次匹配单词的字符,则把 buffer1 中内容放入 buffer2 中,继续往下读,如果不能读到的字符不能匹配当前单词,则输 出 buffer2,再把 buffer1 和 buffer2 清空,如此循环
注释符:/*|*/
2.
正则文法或者正则表达式转换为 NFA; a) 标识符:
字符
0 字母 1 数字 ε 2
b)
无符号整数:
0 非零数字
0 ε
1
2
数字
c) 分界符:
0
d) 运算符:
(|)|;|{|}
1
0 <|>|!
+|-|*|/|= = 1
2
ε
e)
注释符:
2
1
*
0 /
/
3 *
2
3.
将多个 NFA 合并;
=
*
非*字符
7 q3
3,7 q4
1,7 q1 2,7 q2 7 q3
1,7 q3
1,7 q3 2,7 q2
3,7 q4
7 q3
4
q5
3
5q6
5 6
q6 q7 7
6q7
5q6
DFA:
字母|数字 q1 字母 q0 非0数字 q2 0 +|-|*|?|(|)|{|}|; >|<|!|= q3 q4 q5 * / 非*字符 q6 * q7 数字
/
5.
确定单词分类、单词输出方案; 输出格式为 :单词类别 单词值
其中合法单词存入 Lexfile 文件中,不合法单词在屏幕上输出 6. 编写词法分析程序(关键代码见附录)。
4
设计结果
开始
读字符 Y 字母? N 非0数字? N 0? N 单分界 符? N 双分界 符? Y !? Y N 读字符 =? N 输出 SINGLEWOR DS N 读字符 =? Y N 输出非法字 符! *? Y 读字符 Y Y 输出 doublewords 读字符 读字符 Y 输出数字0 读字符 Y NUM 读字符 Y 读字符 数字? N 输出NUM 字母或者 数字? KEYWORD S? 输出ID
5
3.
双分界符处理 读到一个字符,如果是双分界符,再向前读一个符号,如果是‘=’ ,则输出双分 界符,如果不是‘=’ ,则输出是但分界符。这里有一个特殊情况,就是‘! ’不是一个 单分界符,如果按照之前处理则‘! ’会变成合法的单分界符,我做的处理方式是,读 到的第一个字符如果是‘! ’ ,那么再读一个字符,如果不是‘=’就输出非法字符‘! ’ 。 4. keyword 匹配 在 TEST 语言文法规则中 keyword 是 ID 的子集, 当识别了 ID 时, 就识别了 keyword; 这里做的处理方式是把所有 keyword 字存入一个字符串数组中,当识别了一个 ID 单词 的时候,就把这个 ID 和 keyword 数组的元素挨个比较,如果 ID 在 keyword 数组中,就 把其当成 keyword 输出,如果不在,就把其当成 ID 输出。 5. 注释处理 TEST 语言中注释采取删除的方式,当注释不匹配的时候要输出不匹配的信息,处 理方式为,读到一个字符如果为‘/’,再读一个字符,如果为‘*’ ,进入注释,如果不 是‘*’ ,则把‘/’作为单分界符输出,进入注释后,读入任意非‘*’字符都是直接往 下读字符,如果读到了‘*’ ,把当前状态记录,再读一个字符,如果是‘*’ ,停留在当 前状态,如果是‘/’ ,退出注释,如果是其他字符,则跳到刚进入注释状态,继续往下 扫描字符。 6. 注释匹配 当进入注释后,并没有注释结束标志,这时就是注释不匹配了。 处理方式: 当进入注释如果不退出注释的话, 则注释开始标记后面的代码内容 全部都是注释,一直到文件结尾,我设置一个 bool 变量 IsNote,当 IsNote 为 true 时,则处于注释状态中,当 IsNote 为 false 则退出注释状态,在词法分析程序结束 末尾判断 IsNote,如果为真就输出注释不匹配。
问题及解决方案
1. 空格、制表符、换行的处理 词法分析过程中的空格、制表符、换行是不可看见的,但是确是无关符号,不是非 法符号,遇到此类字符直接跳过。 2. 单个字符组成的 ID 或者 NUM 处理 往下读一个字母,如果是空格、制表符、换行就回到初始状态,输出单个 ID 或者 NUM;如果是其他字符,切换到下一个状态识别。
设计过程
1. 每条规则的正则文法或者正则表达式: a) b) c) d) 标识符: (a|……|z|A|……|Z)(a|……|z|A|……|Z|0|……|9) 无符号整数: (1|……|9) (0|……|9)|0 分界符:(|)|;|{|}| 运算符:+|-|*|/|<|>|>=|<=|!=
1
e)
编译原理实验报告
实验名称: 实验类型: 指导教师: 姓 学 名: 号:
编写词法分析程序 设计型 蒋 范 东六 E301 勇 良 5120140979
专业班级:计算机科学与技术 1402 班
实验地点: 实验成绩:
日期:
2016 年
4月
9日
实验一
一、实验目的
编写词法分析程序
1. 编写 TEST 语言的词法分析程序,输出其中的非法符号和合法符号,并将合法符号 分类后输出; 2. 加深对正则文法、正则表达式、有穷自动机的理解; 3. 掌握正则文法、正则表达式转化为 NFA,多个 NFA 合并 4. 在实验过程中, 对 C 语言文件操作知识的巩固, 熟悉编写程序过程中单步调试程序, 断点追踪,变量值检测过程。
数字|字母 1 字母 数字
ε
非0整数 0
2
ε
+|-|*|?|(|)|{|源自文库|,|;
0
7 ε =
/
>|<|!|=
/ 4 *
3 5 * 6
4.
NFA 确定化
β=>|<|!|=
注:α=+|-|*|?|(|)|{|}|,|; 字母 0 q0 1,7 q3
非零数字 2,7 q2
α 7 q3
0
β
/ 4 q5
数字
相关文档
最新文档