编译原理实验词法解析总结器的设计及实现.doc

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

南华大学

计算机科学与技术学院

实验报告

( 2018~2019学年度第二学期)

课程名称编译原理

实验名称词法分析器的设计与

实现

姓名学号

专业班级

地点教师

1.实验目的及要求

实验目的

加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。

实验要求

1.对单词的构词规则有明确的定义;

2.编写的分析程序能够正确识别源程序中的单词符号;

3.识别出的单词以 <种别码,值 >的形式保存在符号表中,正确设计和维护

符号表;

4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误

提示,保证顺利完成整个源程序的词法分析;

2.实验步骤

1.词法分析规则

<标识符 >::=< 字母 >|< 标识符 ><字母 >|< 标识符 ><数字 >

<常数 >::=< 数字 >|< 数字序列 ><数字 >

<数字序列 >:: =<数字序列 ><数字 >|< 数字 >|<.>

<字母 >::=a|b|c|⋯⋯|x|y|z

<数字 >::=0|1|2|3|4|5|6|7|8|9

<运算符 >::=< 关系运算符 >|< 算运算符 >|< 运算符 >|< 位运算符 >|< 运算符 >

<算数运算符 >:: =+|-|*|/|...|--

<关系运算符 >:: =<|>|!=|>=|<=|==

<运算符 >::=&&| || |!

<位运算符 >::=&| | |!

<运算符 >::==|+=|-=|/=|*=

<分界符 >:: = ,|;|(|)|{|}|:| // |/**/

<保留字 >:: = main|if|else|while|do|for|...|void

2.符号的

符号种符号种

main0>26

if1>=27

else2<28

while3<=29

do4!30

for5!=31

switch 6 = 32 case 7 == 33 int 8 ( 34 double 9 ) 35 float 10 { 36 long 11 } 37 void 12 ; 38 + 13 :39 += 14 | 40 ++ 15 || 41 - 16 数字42 -= 17 标识符43 -- 18 , 44 & 19 // 45 && 20 /**/ 46 # 21

* 22

*= 23

/ 24

/= 25

3.状态转换图

空白

字母

数字

/

+

>

<

,(&

:{;

其它字母与数字

非字母与数字

1 2

数字

非数字

4 3

其它

6 5

=

7

/ 8

*

9

其它11 10

= 12

+ 13

其它

15 14

=

16

其它

17 18

=

19

其它

20 21 ..

22 ..

33

34

4.算法分析

①词法分析器工作的第一步是输入源程序文本。为了更好地对单词

符号识别,把输入串预处理一下。预处理主要滤掉空格,跳过注释、换

行符等。

②对预处理后的输入串依次扫描单个字符,使用 if-while嵌套语句

和switch case 语句判断字符的类型,具体识别方法可看状态转换图。

有时为了确定词性,需要超前扫描,若超前扫描的字符对识别当前单词

无用处,则需要退还给输入串,以备识别下一单词字符时使用。

③若读入的字符与单词符号编码表的字符匹配不上,则报错,并输

出出错行数。对识别处的单词符号以(单词符号,种别码)二元式的形

式输出。

3.实验内容

1. 流程图

2.程序的变量与函数说明

(1)input

全局字符数组,用来存放输入串(2)word

全局字符数组,用来存放获取到的单词符号,限定长度为 8

(3)ch

全局字符变量,用来存放最新读入的字符

(4)syn

全局整型变量,表示单词符号的编码

(5)p

全局整型变量,表示当前字符在input 数组的位置

(6)m

全局整型变量,表示最新读入的字符在word 数组的下标

(7)line

全局整型变量,当前行数

(8)keyword

全局字符数组,存放关键字

(9)init()

获取输入串

(10)isKey()

判断关键字的函数,若参数数组中是关键字,则把 syn 置为该关键字对应的编码并返回 1,否则返回 0

(11)isLetter()

判断字母的函数,若参数字符是字母,则返回1,否则返回 0

(12)isDigit()

判断数字的函数,若参数字符是数字,则返回1,否则返回 0

(13)isSpace()

判断空白符的函数,若参数字符是空格、 TAB或换行符,则返回 1,否则返回 0

(14)scaner()

相关文档
最新文档