1. 需求分析

要求:阐述词法分析系统所要完成的功能

设计实现类高级语言的词法分析器,基本功能如下:

  • 能识别以下几类单词:
  • 标识符(由大小写字母、数字以及下划线组成,但必须以字母或者下划线开头)
  • 关键字(① 类型关键字:整型、浮点型、布尔型、记录型;② 分支结构中的 if 和 else;③ 循环结构中的 do 和 while;④ 过程声明和调用中的关键字)
  • 运算符(① 算术运算符;② 关系运算符;③ 逻辑运算)
  • 界符(① 用于赋值语句的界符,如“=”;② 用于句子结尾的界符,如“;”;③ 用于数组表示的界符,如“[”和“]”;④ 用于浮点数表示的界符“.”)
  • 常数(无符号整数(含八进制和十六进制数)、浮点数(含科学计数法)、字符串常数等)
  • 注释(/……/形式)
  • 能够进行简单的错误处理,即识别出测试用例中的非法字符。程序在输出错误提示信息时,需要输出具体的错误类型(即词法错误)、出错的位置(源程序行号)以及相关的说明文字,其格式为:

Lexical error at Line [行号]: [说明文字].

说明文字的内容没有具体要求(例如:非法字符),但是错误类型和出错的行号一定要正确,因为这是判断输出错误提示信息是否正确的唯一标准。

  • 系统的输入形式:要求能够通过文件导入测试用例。测试用例要涵盖“实验内容”中列出的各类单词。
  • 系统的输出形式:打印输出测试用例对应的 token 序列 。

2. 文法设计

要求:对如下内容展开描述

  • 给出各类单词的词法规则描述(正则文法或正则表达式)

标识符:

[_ | [a-z]][\w*]

关键字:

r'((auto){1}|(double){1}|(int){1}|(if){1}|' \
                  r'(#include){1}|(return){1}|(char){1}|(stdio\.h){1}|(const){1})'

运算符:

r'(\+\+|\+=|\+|--|-=|-|\*=|/=|/|%=|%)'

界符:

r'([,:\{}:)(<>])'

常数:

r'(\d+[.]?\d+)'
  • 各类单词的转换图

其余的单词转换图较为简单

常数:

python 实现词法分析_高级语言

3. 系统设计

要求:分为系统概要设计和系统详细设计。

  • 系统概要设计:给出必要的系统宏观层面设计图,如系统框架图、数据流图、功能模块图等以及相应的文字说明。

功能模块:

python 实现词法分析_Python_02

  • 系统详细设计:对如下工作进行展开描述

核心数据结构的设计

使用 Python 的列表 list[]

主要功能函数说明

def is_blank(self, index):判断是否是空白字符
def skip_blank(self, index):跳过空白字符
def is_keyword(self, value):判断是否是关键字
def main(self):词法分析的主程序

程序核心部分的程序流程图

python 实现词法分析_词法分析器_03

4. 系统实现及结果分析

要求:对如下内容展开描述。

  • 系统实现过程中遇到的问题;

系统对十六进制的数的识别没有考虑进去。

解决方法为在判断常数时如果判断该常数第一个数为 0 时,再判断其后的一个字母是否为 X,如果是,再判断后面的字符串是否为一连串的 0-9 或 A-F 组成,如果是,则认为该单词是常数。

  • 针对某测试程序输出其词法分析结果;

测试样例如下:

python 实现词法分析_源码_04

  • 对实验结果进行分析。

词法分析的结果大体上都是正确的,但对于&&并没有识别出来,而是识别成了两个&

python 实现词法分析_Python_05