- 1、本文档共38页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
地点教师
地点教师
地点教师
地点教师
南华大学
计算机科学与技术学院
实验报告
(2018-2019学年度 第二学期)
编译原理课程名称 词法分析器的设计与实验名称
实现
姓名 学号
专业班级
实验目的及要求
实验目的
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够釆用一 种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程 序段进行词法分析。
实验要求
对单词的构词规则有明确的定义;
编写的分析程序能够正确识别源程序中的单词符号;
3识别出的单词以v种别码,值〉的形式保存在符号表中,正确设计和维护符号
表;
4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,
保证顺利完成整个源程序的词法分析;
实验步骤
1?词法分析规则
V标识符 >::二V字母>|<标识符>< 字母>|V标识符>V数字〉
V常数〉::二V数字>|V数字序列 >< 数字〉
V数字序列〉::= < 数字序列〉V数字>|v数字>|<->
V 字母>::=a|b|c|……|x|y|z
v 数字 >::二0 山 2|3|4|5|6|7|8|9
V运算符〉;:二V关系运算符>|V算术运算符>|V逻辑运算符>|<位运算符〉|V赋值运
算符〉
V 算数运算符 >::=+ |-|*|/|,..|-
v 关系运算符 >::=<|>|! = |> = |< = |==
v逻辑运算符〉::二&&||||!
V位运算符 >::二&|||!
V 赋值运算符 >::==| + = |- = |/=|*=
V分界符>::=,|;|(|)|{|}|: |//|/-/
v 保留字 >::=main|if|else|while|do|for|...|void
2?单词符号的编码
单词符种别单词符种别
26>0main
271>=if
282else<
29while3< =
13
13
13
13
30do4!
31for!=5
326switch =
33==case7
8 int(
9 double)
float 10 {
long} 11
void 12 ;
39
40 114+ =
41||15+ +
42 数 16-
43标识17-二
4418--,
45&//19 46&&20/**/
#21
*22
23*=
/24
/ 二
25
状态转换图3..
5
5
5
5
=1
丫母与数字空白 非字血与盘字字2
0
1
3其/
/a
+
Mh
10
=12
+
13
其14
15
=16
> 其山
19
<其20
21
(&?22
f
算法分析4.①词法分析器工作的第一步是输入源程序文本。为了更好地对单词 符号识别,把输入串预处理一下。预处理主要滤掉空格,跳过注释、换行符等。 嵌套语句和if-while②对预处理后的输入串依次扫描单个字符,使用语句判断字 符的类型,具体识别方法可看状态转换图。有时switch case为了确定词性,需 要超前扫描,若超前扫描的字符对识别当前单词无用?
处,则需要退还给输入串,以备识别下一单词字符时使用。
③若读入的字符与单词符号编码表的字符匹配不上,则报错,并输出出错行数。 对识别处的单词符号以(单词符号,种别码)二元式的形式输出。
实验内容
1.流程图
2.程序的变量与函数说明
(1) in put
全局字符数组,用来存放输入串
<2) word
全局字符数组,用来存放获取到的单词符号,限定长度为8
(3) ch
全局字符变量,用来存放最新读入的字符
(4) syn
全局整型变量,表示单词符号的编码
(5) p
全局整型变量,表示当前字符在input数组的位置
< 6)m
全局整型变量,表示最新读入的字符在
全局整型变量,
表示最新读入的字符在word数组的下标
<7) line
全局整型变量,当前行数
(8) keyword
全局字符数组,存放关键字
(9) initO
获取输入串
(10) isKeyQ
判断关键字的函数,若参数数组中是关键字,则把syn置为该关键字对应的编码 并返回1,否则返回0
(11) isLetter()
判断字母的函数,若参数字符是字母,则返回1,否则返回0
(12) isDigitO
判断数字的函数,若参数字符是数字,则返回1,否则返回0
< 13) isSpaceQ
判断空白符的函数,若参数字符是空格、TAB或换行符,则返回1,否则返回0
< 14) scanerO
扫描输入串的函数,对读出的字符进行判断,若是单词符号表中的符号,则将 syn置为对应的编码
3.源程序
#include <stdio.h>
#include <string.h〉
char in put [1OOO];// 输入串
char word[8];//获取到的单词
文档评论(0)