目录
一、实验目的
二、实验内容
三、实验环境
四、实验步骤
五、测试要求
六、实验步骤
1、单词表<列出所识别语言的所有单词及其种别编码>;
2、识别单词的DFA图<可选择1-2类单词,给出识别该单词的DFA图>
3、关键代码
七、实验结果与分析
一、实验目的
通过编写词法分析程序,熟悉其识别单词的基本思想及构造方法。
二、实验内容
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,并输出该字符,然后跳过该字符继续识别)。
三、实验环境
处理器 AMD Ryzen 7 5800H with Radeon Graphics3.20 GHz
机带RAM 16.0 GB(13.9 GB可用)
Win10家庭版20H2 X64
PyCharm 2012.2
Python 3.10
四、实验步骤
1、确定所要识别的程序语言的单词表,各单词的分类及其种别编码;例如教材P66表3.1。
2、画出识别该语言所有单词的确定有限自动机;可分开画,例如教材P90-91图3.9/3.10/3.12分别是识别关系运算符、标识符和关键字、无符号整数的DFA。简单的语言也可集中画在一张图,例如P93图3.15。
3、根据DFA构造该语言的词法分析程序,开发工具可自行选择。(可参考P104-105)
4、测试。
五、测试要求
将被分析的程序即测试程序作为词法分析程序的输入,结果应是按先后顺序输出组成该被分析程序的各个单词的二元式形式。(说明:每个词法分析器输出的二元式不相同,因为它有自己的单词表和种别编码,因此在实验步骤1时要明确)
例如: P67 例3-1
六、实验步骤
1、单词表<列出所识别语言的所有单词及其种别编码>;
①使用Python中的关键字、内置函数名、运算符号、界符
②使用split函数将输入的内容根据空隔分割
③将分割后的结果存入List列表
④List列表中的每一项与①中内容循环匹配
# 关键字
key_word = ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def',
'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda',
'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
# 运算符
operator = ['+', '-', '*', '/', '%', '**', '//', # 算术运算符
'==', '!=', '>', '<', '>=', '<=', # 关系运算符
'&', '|', '^', '~', '<<', '>>', # 位运算符
'and', 'or', 'not', # 逻辑运算符
'in', 'not in', # 成员运算符
'is', 'is not', # 身份运算符
'=', '+=', '-=', '*=', '/=', '%=', '**=', '//=', # 赋值运算符
]
# 界符
separator = ['{', '}', '[', ']', '(', ')', '.', ',', ':', ';']
# 已有内置函数名
key_func_word = ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EncodingWarning', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'aiter', 'all', 'anext', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
2、识别单词的DFA图<可选择1-2类单词,给出识别该单词的DFA图>
3、关键代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/29 2:42
# @Author : LanXiaoFang
# @Site :
# @File : exper_1_CiFaFenXi.py
# @Software: PyCharm
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("------------------------")
七、实验结果与分析
(1、给出实验测试用例程序,即用步骤1中规定的语言编写的程序,该程序作为词法分析程序的输入,用于测试词法分析程序是否能正确地识别每个单词;
2、所给测试用例程序要全面,即该测试程序既要包含该语言的各类单词,又要有错误的单词或符号,当出现错误时是否能报错,报错信息是否准确。
3、记录测试的结果。
4、若词法分析的输出不正确则分析原因)
要求:每位同学的测试用例必须不同