编译原理实验:词法分析器

实验一 设计实现简单语言的词法分析器

1、实验目的

通过该实验,熟练应用编译原理关于词法分析的基本理论和方法;学会用C/C++高级程序设计语言设计一个词法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。

2、实验条件

计算机上安装C/C++编译处理软件。

3、实验内容及要求

对下述单词表定义的语言设计编制一个词法分析器。单词符号及种别表和词法分析器功能及基本要求如下:

(1)单词符号及种别表

单词符号 种别编码 单词值
main 1
int 2
float 3
double 4
char 5
if 6
else 7
do 8
while 9
l(l|d)* 10 内部字符串
 ( +|-|ε ) dd*(.dd* | ε)( e ( +|-|ε ) dd*|ε) 20 二进制数值表示
= 21
+ 22
23
* 24
/ 25
( 26
) 27
{ 28
} 29
, 30
; 31
> 32
>= 33
< 34
<= 35
== 36
!= 37
# 0

(2)词法分析器功能及基本要求

处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。

4、主要参考步骤

(1)画出识别上述语言单词的状态转换图

(2)用C/C++语言编写词法分析程序(应考虑能被语法分析程序调用)

(3)预处理,去除注释、多余空格、Tab字符、回车换行符等

(4)设计若干用例,上机测试并通过所设计实现的词法分析器

  1. +++-123.456e-127*+45.99e+200++abc+-cnt++49
  2. (+123.456+-456.789e-120)*m2+(a++456)*-c123
  3. ++4+1.4
  4. a+-149+49.7e+127+m123
  5. x=a++1.27e+18
  6. –20+-124.987e+127+-xyz

begin  if(x>=-1.27e-18) xyz=(x1+y1)* -124.987e+127

  1. –20+-124. e+111-137++569.246e+(123+ivar);

x=1;if(x>1) y=1234; x=(123+abc); (本例应有出错信息)

5、思考

数字的正负号与运算符加减如何处理,识别数字的DFA怎样和运算符加减等融合在一起,进而指导词法分析器的程序编写。

6、实验报告提交格式

(1) 总体设计思想

(2) 详细算法设计

(3) 流程框图

(4) 函数相关说明

(5) 输入与输出(包括出错处理)

(6) 程序运行结果(屏幕截图)

(7) 词法分析器使用说明

(8) 心得与体会

(9) 源程序清单

 

 

——————————————————————————————————————————————————————————————————————————————

主要时间卡在了double转二进制上…

有的人说需要转,有的人说不需要orz

我能想到的办法。。大概就是要高精度+手动实现itof?

一点也不美啊。。。求好看的方法orz

作者: CrazyKK

ex-ACMer@hust,stackoverflow-engineer@sensetime

说点什么

您将是第一位评论人!

提醒
wpDiscuz