熟悉并实现一个简单的扫描器,设计扫描器的自动机;设计翻译、生成Token的算法;编写代码并上机调试运行通过。 要求扫描器可识别的单词包括:关键字、界符、标识符和常整形数。 其中关键字表、界符表、标识符表、常整数表如下:(表中没有的关键字、界符等可以接着编号继续扩展)

时间: 2024-01-12 17:05:02 浏览: 130
为了实现一个简单的扫描器,需要设计一个有限状态自动机(Finite State Automaton, FSA),它可以将输入的字符流转换成一系列的 Token。在设计自动机之前,需要先定义好 Token 的类型以及它们的属性。 Token 类型: - 关键字(KEYWORD):if、else、while、for、int等 - 界符(DELIMITER):括号、分号、逗号等 - 标识符(IDENTIFIER):由字母和数字组成的字符串,不能以数字开头 - 常整数(INTEGER):由数字组成的字符串 接下来,我们需要设计一个自动机来将字符流转换成 Token。这个自动机可以分为以下几个状态: - 初始状态(INITIAL):读入一个字符,决定下一步进入哪个状态 - 关键字状态(KEYWORD):读入字符直到不再是字母或数字,输出一个关键字 Token - 标识符状态(IDENTIFIER):读入字符直到不再是字母或数字,输出一个标识符 Token - 常整数状态(INTEGER):读入字符直到不再是数字,输出一个常整数 Token - 界符状态(DELIMITER):读入一个字符,输出一个界符 Token 下面是自动机的状态转移图: ``` +---------------------+ | ( | v | +-----------+ | | INITIAL |------(------> | DELIMITER +-----------+ | | | | | | letter|number | | | v | | +-----------+ | | | KEYWORD |<------( | +-----------+ | | | | | | letter|number | | | v | | +-------------+ | | | IDENTIFIER |<-----( | +-------------+ | | | | | | digit| | | v | v +--------+ | +-----------+ | INTEGER|<--+ | | +--------+ | | DELIMITER | | | | | | | +-----------+ | | | | | | digit|letter| | v | +----------- +-------+ ``` 根据状态转移图我们可以设计如下的 Tokenizer 类: ```python class Tokenizer: def __init__(self, keywords, delimiters): self.keywords = keywords self.delimiters = delimiters def tokenize(self, input_str): tokens = [] state = 'INITIAL' buffer = '' for c in input_str: if state == 'INITIAL': if c.isalpha(): buffer += c state = 'KEYWORD' elif c.isdigit(): buffer += c state = 'INTEGER' elif c in self.delimiters: tokens.append((c, 'DELIMITER')) elif c.isspace(): pass # skip whitespace else: raise ValueError(f'Invalid character: {c}') elif state == 'KEYWORD': if c.isalnum(): buffer += c else: if buffer in self.keywords: tokens.append((buffer, 'KEYWORD')) else: tokens.append((buffer, 'IDENTIFIER')) buffer = '' state = 'INITIAL' if c.isdigit(): buffer += c state = 'INTEGER' elif c in self.delimiters: tokens.append((c, 'DELIMITER')) elif not c.isspace(): raise ValueError(f'Invalid character: {c}') elif state == 'IDENTIFIER': if c.isalnum(): buffer += c else: tokens.append((buffer, 'IDENTIFIER')) buffer = '' state = 'INITIAL' if c.isdigit(): buffer += c state = 'INTEGER' elif c in self.delimiters: tokens.append((c, 'DELIMITER')) elif not c.isspace(): raise ValueError(f'Invalid character: {c}') elif state == 'INTEGER': if c.isdigit(): buffer += c else: tokens.append((buffer, 'INTEGER')) buffer = '' state = 'INITIAL' if c.isalpha(): buffer += c state = 'KEYWORD' elif c in self.delimiters: tokens.append((c, 'DELIMITER')) elif not c.isspace(): raise ValueError(f'Invalid character: {c}') # Handle final buffer if state == 'KEYWORD': if buffer in self.keywords: tokens.append((buffer, 'KEYWORD')) else: tokens.append((buffer, 'IDENTIFIER')) elif state == 'IDENTIFIER': tokens.append((buffer, 'IDENTIFIER')) elif state == 'INTEGER': tokens.append((buffer, 'INTEGER')) return tokens ``` 这个 Tokenizer 类接受一个关键字列表和一个界符列表作为参数,然后提供一个 tokenize 方法来将输入的字符串转换成 Token 的列表。 下面是一个使用 Tokenizer 的例子: ```python keywords = ['if', 'else', 'while', 'for', 'int'] delimiters = ['(', ')', '{', '}', ',', ';'] tokenizer = Tokenizer(keywords, delimiters) tokens = tokenizer.tokenize('for (i = 0; i < n; i++) { printf("%d\n", i); }') print(tokens) # Output: [('for', 'KEYWORD'), ('(', 'DELIMITER'), ('i', 'IDENTIFIER'), # ('=', 'DELIMITER'), ('0', 'INTEGER'), (';', 'DELIMITER'), # ('i', 'IDENTIFIER'), ('<', 'DELIMITER'), ('n', 'IDENTIFIER'), # (';', 'DELIMITER'), ('i', 'IDENTIFIER'), ('+', 'DELIMITER'), # ('+', 'DELIMITER'), (')', 'DELIMITER'), ('{', 'DELIMITER'), # ('printf', 'IDENTIFIER'), ('(', 'DELIMITER'), ('"%d\\n"', 'STRING'), # (',', 'DELIMITER'), ('i', 'IDENTIFIER'), (')', 'DELIMITER'), # (';', 'DELIMITER'), ('}', 'DELIMITER')] ``` 在这个例子中,我们创建了一个 Tokenizer 并使用它将一个 for 循环的字符串转换成 Token 列表。可以看到,我们得到了正确的 Token 列表,其中包括了关键字、标识符、常整数、界符等不同类型的 Token。

相关推荐

最新推荐

recommend-type

扫描器的设计(实验报告+代码+运行结果) 编译方法

(1) 设计扫描器的有限自动机(识别器); (2) 设计翻译、生成Token的...(3) 编写代码并上机调试运行通过。 ·输入——源程序文件或源程序字符串; ·输出——相应的Token序列; 关键字表和界符表; 符号表和常数表;
recommend-type

编译原理词法分析器 输入源程序 能生成token序列

熟悉并实现一个简单的扫描器 2实验内容: 1. 设计扫描器的自动机; 2. 设计翻译、生成Token的算法; 3. 编写代码并上机调试运行通过。 3实验要求: ( 用C语言或C++环境设计并实现实验内容 ) 输入———源程序...
recommend-type

毕业设计 词法分析器 生成工具 摘要与目录

本文描述一个简单的词法分析器生成工具的设计和实现过程。该词法分析器生成工具的功能是,它能根据给定的正则表达式构造出语言识别器。该语言识别器能够判断输入的句子是否是给定的正则表达式所描述的语言的句子,并...
recommend-type

词法分析器 编译原理实验报告

熟悉并实现一个简单的扫描器 二、实验内容 1. 设计扫描器的自动机; 2. 设计翻译、生成Token的算法; 3. 编写代码并上机调试运行通过。 三、实验要求 输入——源程序文件; 输出——(1)相应的Token序列; (2...
recommend-type

元胞自动机代码编程.docx

元胞自动机(Cellular Automata),简称CA,也有人译为细胞自动机、点格自动机、分子自动机或单元自动机)。是一时间和空间都离散的动力系统。散布在规则格网 (Lattice Grid)中的每一元胞(Cell)取有限的离散状态,遵循...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。