• 基于Python实现类高级语言的词法分析器


    1. 需求分析

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

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

    • 能识别以下几类单词:

      • 标识符(由大小写字母、数字以及下划线组成,但必须以字母或者下划线开头)

      • 关键字(① 类型关键字:整型、浮点型、布尔型、记录型;② 分支结构中的 if 和 else;③ 循环结构中的 do 和 while;④ 过程声明和调用中的关键字)

      • 运算符(① 算术运算符;② 关系运算符;③ 逻辑运算)

      • 界符(① 用于赋值语句的界符,如“=”;② 用于句子结尾的界符,如“;”;③ 用于数组表示的界符,如“[”和“]”;④ 用于浮点数表示的界符“.”)

      • 常数(无符号整数(含八进制和十六进制数)、浮点数(含科学计数法)、字符串常数等)

      • 注释(/……/形式)

    • 能够进行简单的错误处理,即识别出测试用例中的非法字符。程序在输出错误提示信息时,需要输出具体的错误类型(即词法错误)、出错的位置(源程序行号)以及相关的说明文字,其格式为:

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

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

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

    • 系统的输出形式:打印输出测试用例对应的 token 序列 。

    2. 文法设计

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

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

    标识符:

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

    关键字:

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

    运算符:

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

    界符:

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

    常数:

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

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

    常数:
    在这里插入图片描述

    3. 系统设计

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

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

    功能模块:

    在这里插入图片描述

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

    核心数据结构的设计

    使用 Python 的列表 list[]

    主要功能函数说明

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

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

    在这里插入图片描述

    4. 系统实现及结果分析

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

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

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

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

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

    测试样例如下:

    在这里插入图片描述

    • 对实验结果进行分析。

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

    在这里插入图片描述

  • 相关阅读:
    HTML基础
    基于ProXmoX VE的虚拟化家庭服务器(篇一)—ProXmoX VE 安装及基础配置
    Linux之iptables打开所有进/出端口
    Python 操作Mysql
    智慧公厕建设的好处
    jar包打包成exe安装包
    科技型中小企业有哪些?
    Python元组(Tuple)深度解析!
    VueX简单又详细的解读,看了就会用
    ZYNQ之FPGA学习----FIFO IP核使用实验
  • 原文地址:https://blog.csdn.net/newlw/article/details/126126619