【python】语法分析-化学分子式解析「编译原理」

2023-10-22 14:59

本文主要是介绍【python】语法分析-化学分子式解析「编译原理」,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

编写程序,计算化学分子式中元素的数目,并完成以下测试:

atom_count(“He”) == 1
atom_count(“H2”) == 2
atom_count(“H2SO4”) == 7
atom_count(“CH3COOH”) == 8
atom_count(“NaCl”) == 2
atom_count(“C60H60”) == 120

参考语法
species_list : species_list species
species_list : species
species : SYMBOL
species : SYMBOL COUNT

附录

(1)元素周期表
在这里插入图片描述

(2)识别化学元素的正则表达式

t_SYMBOL = (r"C[laroudsemf]?|Os?|N[eaibdpos]?|S[icernbmg]?|P[drmtboau]?|"r"H[eofgas]?|A[lrsgutcm]|B[eraik]?|Dy|E[urs]|F[erm]?|G[aed]|"r"I[nr]?|Kr?|L[iaur]|M[gnodt]|R[buhenaf]|T[icebmalh]|"
r"U|V|W|Xe|Yb?|Z[nr]")

(3)存储分子式的数据结构

class Atom(object):def __init__(self, symbol, count):self.symbol = symbolself.count = countdef __repr__(self):return "Atom(%r, %r)" % (self.symbol, self.count)

代码:

calclex.py

import ply.lex as lex# 本次需要识别的只有元素和数字
tokens = ('NUMBER','SYMBOL'
)# 识别数字
def t_NUMBER(t):r'\d+'t.value = int(t.value)    return t# 识别化学元素
def t_SYMBOL(t):r"""C[laroudsemf]?|Os?|N[eaibdpos]?|S[icernbmg]?|P[drmtboau]?|H[eofgas]?|A[lrsgutcm]|B[eraik]?|Dy|E[urs]|F[erm]?|G[aed]|I[nr]?|Kr?|L[iaur]|M[gnodt]|R[buhenaf]|T[icebmalh]|U|V|W|Xe|Yb?|Z[nr]"""return t# 忽略空格
t_ignore  = ' \t'# 错误识别并提示
def t_error(t):print("Illegal character '%s'" % t.value[0])t.lexer.skip(1)## Build the lexer
lexer = lex.lex()

yacc_example.py

#! /usr/bin/env python
# coding=utf-8
import ply.yacc as yacc
from calclex import tokensclass Atom(object):def __init__(self, symbol, count):self.symbol = symbolself.count = countdef __repr__(self):return "Atom(%r, %r)" % (self.symbol, self.count)# 语法规则
def p_species_list_expression(p):'species_list : species_list species'p[0] = p[1] + p[2].countdef p_species_list_term(p):'species_list : species'p[0] = p[1].count# 识别单独化学符号
def p_species_symbol(p):'species : SYMBOL'p[0] = Atom(p[1], 1)# 识别带有数字的化学符号
def p_species_count(p):'species : SYMBOL NUMBER'p[0] = Atom(p[1], p[2])# 错误语法识别
def p_error(p):print("Syntax error in input!")# Build the parser
parser = yacc.yacc()
test = ['He', 'H2', 'H2SO4', 'CH3COOH', 'NaCl', 'C60H60']
for s in test:print(s)result = parser.parse(s)print(result)

结果

在这里插入图片描述


新手上路,有错请指正

这篇关于【python】语法分析-化学分子式解析「编译原理」的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/262198

相关文章

Python中常用的四种取整方式分享

《Python中常用的四种取整方式分享》在数据处理和数值计算中,取整操作是非常常见的需求,Python提供了多种取整方式,本文为大家整理了四种常用的方法,希望对大家有所帮助... 目录引言向零取整(Truncate)向下取整(Floor)向上取整(Ceil)四舍五入(Round)四种取整方式的对比综合示例应

python 3.8 的anaconda下载方法

《python3.8的anaconda下载方法》本文详细介绍了如何下载和安装带有Python3.8的Anaconda发行版,包括Anaconda简介、下载步骤、安装指南以及验证安装结果,此外,还介... 目录python3.8 版本的 Anaconda 下载与安装指南一、Anaconda 简介二、下载 An

Python自动化处理手机验证码

《Python自动化处理手机验证码》手机验证码是一种常见的身份验证手段,广泛应用于用户注册、登录、交易确认等场景,下面我们来看看如何使用Python自动化处理手机验证码吧... 目录一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

Python重命名文件并移动到对应文件夹

《Python重命名文件并移动到对应文件夹》在日常的文件管理和处理过程中,我们可能会遇到需要将文件整理到不同文件夹中的需求,下面我们就来看看如何使用Python实现重命名文件并移动到对应文件夹吧... 目录检查并删除空文件夹1. 基本需求2. 实现代码解析3. 代码解释4. 代码执行结果5. 总结方法补充在

Python自动化办公之合并多个Excel

《Python自动化办公之合并多个Excel》在日常的办公自动化工作中,尤其是处理大量数据时,合并多个Excel表格是一个常见且繁琐的任务,下面小编就来为大家介绍一下如何使用Python轻松实现合... 目录为什么选择 python 自动化目标使用 Python 合并多个 Excel 文件安装所需库示例代码