码迷,mamicode.com
首页 > 其他好文 > 详细

自己动手实现简单编译器之(二)词法分析器和有穷自动机

时间:2015-03-16 20:58:17      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

一:实验指导书

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

(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)词法分析器功能及基本要求

处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码

              token为存放的单词自身字符串

             sum为数字的数值(用科学计数法输出) 

(3)主要参考步骤

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

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

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

(4)思考

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

二:C语言实现词法分析器

(1)算法及流程图

算法的基本思想是从输入缓冲区循环读取字符,根据扫描的第一个字符类型(必要时也可向前向后看)对照单词符号及种别表拼出相应的单词符号。

技术分享

(2)代码示例

自己动手实现简单编译器之(二)词法分析器和有穷自动机

标签:

原文地址:http://www.cnblogs.com/paranoidboy/p/4063329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!