【编译原理实验】|词法分析程序设计原理与实现技术

实验总览

这学期的作业很多也很硬,直到期末彻底结束才来把报告挪到这里,编译原理实验中还有很多的疏漏,但是实验要求都已经悉数完成,主要的时间还是花在了各种构造表及构造表的前置数据的构造中,最终的六个实验代码都发在github中。

专题 1_词法分析程序设计原理与实现技术
专题 2_递归下降语法分析设计原理与实现技术
专题 3_LL(1)语法分析设计原理与实现技术
专题 4_算符优先语法分析设计原理与实现技术
专题 5_基于 SLR(1)分析法的语法制导翻译及中间代码生成程序设计原理与实现技术
专题 6_编译器前端实现(专题 1+专题 5)

本次程序介绍

程序功能如下:

正则文法:

<标识符>→字母︱ <标识符>字母︱ <标识符>数字

<无符号整数>→数字︱ <无符号整数>数字

<单字符分界符> →+ ︱- ︱* ︱;︱, ︱(︱) ︱{︱}︱[︱]

<双字符分界符>→<大于>=︱<小于>=︱<小于>>︱<逻辑非>=︱<等于>=︱<斜竖>*

<小于>→<

<等于>→=

<大于>→>

<斜竖> →/

<逻辑非>→!

<保留字> → Main︱If︱else︱int︱return︱void︱while

输入:字符串形式的源程序。

输出:具有独立意义的单词符号。

详细实现

数据结构

以下数据结构将分离出来的字符存放起来。

以下数据结构将识别出来分割好的有序的字符存放起来,ResultVector是将二元式按输入顺序保存了起来。

函数介绍

单词类别表

这里单词类别看起来限制的很死,但是我在程序中预留的位置实际上是可以非常容易的更改的。

序号 符号 类别号
1 = 1
2 + 2
3 _ 3
4 ***** 4
5 / 5
6 < 6
7 > 7
8 ! 8
9 9
10 10
11 11
12 { 12
13 } 13
14 [ 14
15 ] 15
16 16
17 17
18 <= 18
19 >= 19
20 == 20
21 != 21
22 main 22
23 int 23
24 if 24
25 else 25
26 return 26
27 void 27
28 while 28
29 标识符 29
30 整数 30

DFM图

程序测试

本程序的测试代码存在可执行文件同目录下的*code.txt*中。本程序中输入串每个符号与符号之间需要空格分隔。

测试用例1

测试结果1

测试用例2

测试结果2