编译原理实验--实验一 词法分析--Python实现

news2024/11/24 7:17:57

目录

一、实验目的

二、实验内容

三、实验环境

四、实验步骤

五、测试要求

六、实验步骤

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、若词法分析的输出不正确则分析原因)

       要求:每位同学的测试用例必须不同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++实现】线程池的设计与实现

文章目录前言正文线程池提供的两个重要方法Any类的设计SemaphoreResult的实现Cache模式解释会遇到死锁问题第二个死锁问题&#xff0c;移植到Linux发生项目重构大致流程总结前言 开发环境&#xff1a; Linux&#xff0c;要求g版本能够支持C17以上&#xff1b;vs2019下开发&…

实验四 数码管实验【Verilog】

实验四 数码管实验【Verilog】前言推荐实验四 数码管实验【Verilog】一、实验目的&#xff1a;二、实验设备&#xff1a;三、实验任务:四、实验原理:五、实验步骤&#xff1a;六、实验结果&#xff1a;七、心得体会&#xff1a;最后前言 以下内容源自Verilog实验 仅供学习交流…

[附源码]java毕业设计校园期刊网络投稿系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Git的基础操作及使用

目录 1.git工作原理示意 2.git拉取服务器上的代码 3.git往服务器上提交新code 4.git 查看提交记录&#xff0c; 5.git删除旧代码仓库&#xff0c;提交新的代码仓库 6.如何修改自己提交代码的用户名和邮箱 6.1.查看现用邮箱和用户名 6.2.使用命令修改git的用户名和提交的…

将一段文本映射到低纬向量空间

文本表示学习就是将一段文本映射到低纬向量空间&#xff0c;获取句子的语义表示&#xff0c;大致经历过四个阶段&#xff1a; 阶段 1&#xff1a;统计类型&#xff0c;此阶段比较典型的是利用 TD-IDF 抽取关键词&#xff0c;用关键词表示表征整个句子。 阶段 2&#xff1a;深度…

MySQL数据库增删改查进阶 — 聚合查询、分组查询、联合查询

文章目录1.聚合查询1.1 count 函数1.2 sum 函数1.3 avg 函数1.4 max 和 min 函数2.分组查询2.1 group by 子句2.2 分组查询可以指定条件2.2.1 分组之前&#xff0c;指定条件2.2.2 分组之后&#xff0c;指定条件2.2.3 分组前后都指定条件3.联合查询3.1 笛卡尔积3.1.1 笛卡尔积中…

YourKit Java Profiler 2022.9.X Crack

YourKit Java Profiler 2022.9.X Crack 从 CPU 和内存利用率的角度分析您的程序非常重要。它允许您最大限度地提高自身性能并限制其对服务器系统工具的影响&#xff0c;这将始终受到最终用户的重视。 在 YourKit Java Profiler 的支持下&#xff0c;可以很容易地运行基于 Java…

传奇单机架设教程及游戏GM设置方法

传奇技术教学 第二课:传奇单机架设教程及游戏GM设置方法 架设前关杀毒 确保自己的热血传奇客户端是13周年以后的 最好用最新的. 不要使用已经淘汰的10周年客户端和微端客户端 否则会出现显示不全情况. 注意HERO引擎版本在登录器方面不支持WIN8及WIN10系统的. 若你是以上系统…

Linux资源限制命令—ulimit

ulimit功能简述 假设有这样一种情况&#xff0c;当一台 Linux 主机上同时登陆了 10 个人&#xff0c;在系统资源无限制的情况下&#xff0c;这 10 个用户同时打开了 500 个文档&#xff0c;而假设每个文档的大小有 10M&#xff0c;这时系统的内存资源就会受到巨大的挑战。而实…

市面上主流源表软件全面对比,总有一款适合你!

在电测行业中&#xff0c;在对高精度的电压、电流或电流电压源进行测量扫描时就要请出我们的小伙伴“源表“。 它精确的采集能力以及为各种低电平测量应用提供额外的灵活性让它成为了电测行业中不和或缺的一员。而作为和它配合的搭档源表软件也在电测行业中有着重要的作用。 …

【排序专题】不会吧,不会吧居然还有人不懂排序算法?有彩蛋哦

文章目录1. 冒泡排序2. 选择排序3. 简单插入排序4. 希尔排序-->简单插入排序演变5. 归并排序(递归版本)6. 归并排序(非递归版本)7. 荷兰国旗问题8.由荷兰国旗问题进而引出快速排序 and 快速排序1.0版本9.快速排序2.0版本(挖坑法)10.快速排序 3.0版本(随机取数法)11.堆排序12…

AOP结合注解实现项目中接口调用情况监控

一、概述 项目中经常会遇到这样一个需求&#xff0c;需要监控每个controller中接口被调用的情况。 比如某个接口被调用的时间&#xff0c;哪个用户调用的&#xff0c;请求参数是什么&#xff0c;返回值是什么等等。 并且调用情况需要存储到数据库中&#xff0c;此时就可以AO…

三十二、Java LinkedList

Java LinkedList 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按线性的顺序存储数据&#xff0c;而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 一个单向链表包含两个值: 当…

JavaEE——Servlet中的session

之前的博客中提到&#xff0c;cookie是为了浏览器能够在本地保存数据而产生的机制&#xff0c;是在浏览器工作的。而session则是与之对应的&#xff0c;在客户端工作的。一个服务器对应多个客户端&#xff0c;每个客户端都有自己的session&#xff0c;以sessionId为key&#xf…

python进阶(28)import导入机制原理

前言 在Python中&#xff0c;一个.py文件代表一个Module。在Module中可以是任何的符合Python文件格式的Python脚本。了解Module导入机制大有用处。 1. Module组成 一个.py文件就是一个module。Module中包括attribute, function等。 这里说的attribute其实是module的global vari…

[ros2实操]2-ros2的消息和ros1的消息转换

记录一下ros2和ros1消息互传的操作 !!!需要注意的是,只有ros1订阅了相关ros2的消息时,ros1_bridge节点才会转发相关消息. 参考链接 1,docker镜像链接:待定 2,github教程:Bridge communication between ROS 1 and ROS 2 一.准备步骤 为在自己原来的系统ubuntu1804上同时安装…

[附源码]SSM计算机毕业设计基于ssm的电子网上商城JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

通过五个维度比较分析关键容灾技术

【摘要】每一种容灾技术方案,可以从实现的技术复杂度、需要投入的成本、需要承担的风险、技术的先进性、技术的成熟度等几个方面来综合评估,寻求适合企业的最佳技术组合方案。本文对几类关键容灾技术进行了比较分析。(文中涉及相关技术产品最新参数请以官网最新发布为准) …

【SpringBoot】SpringBoot开启MyBatis缓存+ehcache(一二级缓存和myBatis的差不多,第三方缓存是jar包的不一样)

文章目录第三方缓存1、导jar包2、配置文件ehcache.xml3、EnableCaching开启缓存4、application.yml读取配置文件5、使用缓存&#xff08;注解Cacheable&#xff09;Cacheable的三个属性&#xff1a;value、key和condition▶测试&#xff1a;root对象可以用来生成keyCachePutCac…

LeetCode HOT 100 —— 4.寻找两个正序数组的中位数

题目 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 思路 正序数组&#xff0c;立即推—>二分查找 如果本题不要求时间复杂度O&#xff08;log…