实验目的:(15分)
1.深入理解有限自动机及其应用。
2.掌握根据语言的词法规则构造识别其单词的有限自动机的方法。
3.基本掌握词法分析程序的实现方法和技术。
实验内容及原理:(25分)
编制一个词法分析程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出由各个单词的内部编码及单词符号自身值所组成的二元式序列
实验设备及实验步骤:(30分)
1.准备
(1)阅读课本有关章节,明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。
(2)初步编制好程序。
(3)准备多组测试数据。
2.上课上机
将源代码拷贝到机上调试,发现错误,再修改完善,直至调试通过。
3.程序要求
程序输入/输出示例:
如源程序为C语言。输入如下一段:
if i>=15 then x = y;
也可以为其他代码段,比如main( ) { int a, b; a = 10; b = a + 20;}
要求输出如表1.1所示。
(1, 'if') |
(2, 0) //i符号表的入口为0 |
(4, '>=') |
(3, '15') |
(1, 'then') |
(2, 1) //x符号表的入口为1 |
(4, '=') |
(2, 2) //y符号表的入口为2 |
(5, ';') |
表1.1 词法分析输出结果示例表
要求:
(1)识别保留字:if、int、for、while、do、return、break、continue;单词种别码为1。
(2)其他的都识别为标识符;单词种别码为2。
(3)常数为无符号整型数;单词种别码为3。
(4)运算符包括:+、-、*、/、=、>、<、>=、<=、!= ;单词种别码为4。
(5)分隔符包括:,、;、{、}、(、); 单词种别码为5。
以上为参考,具体可自行增删。
4.程序思路
(1)定义部分:定义常量、变量、数据结构。
(2)初始化:从文件将源程序全部输入到字符缓冲区中。
(3)取单词前:去掉多余空白。
(4)取单词后:去掉多余空白。
(5)取单词:读出单词的每一个字符,组成单词,分析类型。(注意:关键是如何判断取单词结束?取到的单词是什么类型的单词?)
(6)显示结果。
实验代码:
import keyword
import builtins
print("--------实验一 词法分析器----------",)
# 查看Python关键字 35个
# print(keyword.kwlist, len(keyword.kwlist))
# print(keyword.iskeyword('print'),) #判断传递的内容是否是关键字
# 查看此版本的Python的内置函数 156个
# print(dir(builtins), len(dir(builtins)))
# 本打算用这一部分识别是否是正确的英文单词,再判断是否属于关键字
# import enchant
# d = enchant.Dict("en_US")
# d.check("Helo")
# for i in key_word:
# print(i, d.check(i))
str = input("您可以输入任意想要做词法分析的内容,以空格隔开,如果退出分析可输入##:")
print(str)
while str != '##':
str_list = str.split()
print("以空格分割内容后存入列表:", str_list, "列表长度是:", len(str_list))
i = 0
while i < len(str_list):
# 判断是否是整数
str_list_i = str_list[i]
result_stri = str_list_i.isdigit()
if result_stri:
print(str_list_i, "是整数")
i = i + 1
continue
# 判断是否是小数
str_list_i = str_list[i]
if str_list_i.count('.') == 1:
str_list_i_left = str_list_i.split('.')[0]
str_list_i_right = str_list_i.split('.')[1]
if str_list_i_right.isdigit():
if str_list_i_left.count('-') == 1 and str_list_i_left.startswith('-'):
str_list_i_left_num = str_list_i_left.split('-')[-1]
if str_list_i_left_num.isdigit():
print(str_list_i, "是负小数")
elif str_list_i_left.isdigit():
print(str_list_i, "是正小数")
i = i + 1
continue
# 判断是否是纯字母
result_stri = str_list_i.isalpha()
if result_stri:
if keyword.iskeyword(str_list_i):
print(str_list_i, "属于Python关键字")
elif str_list_i in key_func_word:
print(str_list_i, "属于内置函数名")
else:
print(str_list_i, "是字母字符串,但不是Python关键字、内置函数名")
i = i + 1
continue
# 判断是否是字母和数字的组合
result_stri = str_list_i.isalnum()
if result_stri:
print(str_list_i, "是字母和数字的组合")
i = i + 1
continue
# 不是字母字符串也不是数字也不是字母和数字的组合的情况
if str_list_i in operator:
print(str_list_i, "属于运算符")
elif str_list_i in separator:
print(str_list_i, "属于分界符")
elif str_list_i in key_func_word:
print(str_list_i, "属于内置函数名")
else:
print(str_list_i, "不属于关键字、运算符、分界符、内置函数名")
i = i+ 1
str = input("您可以输入任意想要做词法分析的内容,以空格隔开,如果退出分析可输入##:")
print(str)
print("------------------------")
实验结果与分析:(15分)
问题及思考:
分析中代码出现问题不能产生结果,通过和同学的交流,找出问题并且进行修改,让结果正常的显示出现,通过学习提高了个人能力。