当前位置: 首页 > news >正文

Python:词法分析(行结构与显式、隐式行拼接)

相关阅读

Pythonicon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12403403.html?spm=1001.2014.3001.5482


1、逻辑结构

        一个Python程序由许多逻辑行组成,字面意义上的一行指的是末尾有换行符(\n),但在不同的情况下,行末尾的换行符(\n)可能有不同的意义。

2、逻辑行

        逻辑行的结尾的换行符(\n)被解析为NEWLINE标记。一般来说,一条语句不能跨越逻辑行而存在(除非是复合语句,如if复合语句可以由多个逻辑行组成)。根据显式或隐式行拼接规则,若干个物理行可以组成逻辑行。

3、物理行

        物理行的结尾的换行符(\n)可能被解析为NEWLINE标记(如果这个物理行是一个逻辑行中的最后一个物理行),或者NL标记(如果这个物理行不是一个逻辑行中的最后一个物理行),或者也可能在显式行拼接时与反斜杠(\)一起被删除。

4、注释

        注释是一种特殊的逻辑行,对于单行是完全的注释,它末尾的换行符(\n)会被解析为NL标记。而一个位于逻辑行末尾的注释,它末尾的换行符(\n)则会被解释为NEWLINE标记。但无论是哪种解释,注释代表着从#到换行符(\n)之间的内容(不包括换行符(\n))会被解析为一个整体,即注释标记而对程序无任何影响。

5、显式行拼接

        两个及两个以上的物理行可用反斜杠(\)拼接为一个逻辑行,规则如下:除了注释中的反斜杠(\)加换行符(\n)结尾外(因为这时的反斜杠(\)已经被当做了注释,这也代表着注释无论如何不会影响到下一行),物理行将与从上到下一次拼接直到一个逻辑行,并删除末尾的反斜杠(\)及其后的换行符(\n),当使用反斜杠(\)时,末尾不允许有注释,因为这样反斜杠(\)后面就没有换行符(\n)也就无法行拼接了。需要注意的是,显式行拼接无法拼接除字符串字面量外的标记,而后面谈到的的隐式拼接无法拼接任何标记,标记即一个解析的整体,例如:函数print是一个标记,字符串"aaa"是一个标记,而1    +    1包含三个标记,因为其中不属于行首的空格、制表符等空白符不会被解析为标记,而行首的空格、制表符被解析为缩近标记。

        下面来看几个例子:

if 1900 < year < 2100 and 1 <= month <= 12 \and 1 <= day <= 31 and 0 <= hour < 24 \and 0 <= minute < 60 and 0 <= second < 60:   # 这里的注释是允许的,而上两行末尾再加注释是不允许的,因为这样\后面就没有换行符了return 1#正确的显式行拼接,因为并没有分割任何标记
a = 1 + \
2         #错误的显式行拼接,因为分割了标记,语法分析时会产生错误解析
pr\
int("hello world!")#正确的显式行拼接,虽然字符串"aaa"是一个标记,但这是唯一的例外
a = "aa\
a"

        如何更加直观的验证上面的这些分析有什么方法吗?当然有,tokenize包可以帮助我们解析一串代码,下面给出一段测试程序。

import tokenize
from io import BytesIOcode = """The code you are testing"""# 将代码字符串转换为字节流
code_bytes = code.encode('utf-8')
code_stream = BytesIO(code_bytes)# 使用tokenize.tokenize生成tokens
tokens = tokenize.tokenize(code_stream.readline)# 遍历tokens并打印信息
for token in tokens:print(token)

        根据自己的需要,你可以将任何一段程序粘贴进上面的相应位置进行验证,使用三引号(""")的原因是它能保留跨行字符串而不使用反斜杠(\)。这很重要,因为如果使用双引号("),则无法测试下一节没有反斜杠(\)的隐式行连接,因为这代表着没有反斜杠(\)的字符串被分成了两行,但上面说过隐式行连接无法拼接任何标记,所以甚至连测试程序都无法通过语法分析,下面我们看一个测试结果。

import tokenize
from io import BytesIOcode = """a = 1 + \
2"""# 将代码字符串转换为字节流
code_bytes = code.encode('utf-8')
code_stream = BytesIO(code_bytes)# 使用tokenize.tokenize生成tokens
tokens = tokenize.tokenize(code_stream.readline)# 遍历tokens并打印信息
for token in tokens:print(token)TokenInfo(type=62 (ENCODING), string='utf-8', start=(0, 0), end=(0, 0), line='')
TokenInfo(type=1 (NAME), string='a', start=(1, 0), end=(1, 1), line='a = 1 + 2')
TokenInfo(type=54 (OP), string='=', start=(1, 2), end=(1, 3), line='a = 1 + 2')
TokenInfo(type=2 (NUMBER), string='1', start=(1, 4), end=(1, 5), line='a = 1 + 2')
TokenInfo(type=54 (OP), string='+', start=(1, 6), end=(1, 7), line='a = 1 + 2')
TokenInfo(type=2 (NUMBER), string='2', start=(1, 8), end=(1, 9), line='a = 1 + 2')
TokenInfo(type=4 (NEWLINE), string='', start=(1, 9), end=(1, 10), line='')
TokenInfo(type=0 (ENDMARKER), string='', start=(2, 0), end=(2, 0), line='')

        从上面的解析结果可以看出,确实两物理行被拼接成了一逻辑行,而末尾的反斜杠(\)与换行符(\n)消失所以没有解析成标记。

6、显式行拼接

        隐式拼接的圆括号、方括号、花括号内的表达式可以分成多个物理行,不必使用反斜杠。例如:

month_names = ['Januari', 'Februari', 'Maart',      # 这里'April',   'Mei',      'Juni',       # 可以'Juli',    'Augustus', 'September',  # 加注释'Oktober', 'November', 'December']   # 这并不会有影响#正确的隐式行拼接,没有分隔标记
a = (1 +
2)#正确的隐式行拼接,没有分隔标记
a = [1,
2]#正确的隐式行拼接,没有分隔标记
a = {1,
2}#错误的隐式行拼接,分隔了标记
prin
t("hello world!")

        下面我们看一个测试结果:

import tokenize
from io import BytesIOcode = """a = (1 +
2)"""# 将代码字符串转换为字节流
code_bytes = code.encode('utf-8')
code_stream = BytesIO(code_bytes)# 使用tokenize.tokenize生成tokens
tokens = tokenize.tokenize(code_stream.readline)# 遍历tokens并打印信息
for token in tokens:print(token)TokenInfo(type=62 (ENCODING), string='utf-8', start=(0, 0), end=(0, 0), line='')
TokenInfo(type=1 (NAME), string='a', start=(1, 0), end=(1, 1), line='a = (1 +\n')
TokenInfo(type=54 (OP), string='=', start=(1, 2), end=(1, 3), line='a = (1 +\n')
TokenInfo(type=54 (OP), string='(', start=(1, 4), end=(1, 5), line='a = (1 +\n')
TokenInfo(type=2 (NUMBER), string='1', start=(1, 5), end=(1, 6), line='a = (1 +\n')
TokenInfo(type=54 (OP), string='+', start=(1, 7), end=(1, 8), line='a = (1 +\n')
TokenInfo(type=61 (NL), string='\n', start=(1, 8), end=(1, 9), line='a = (1 +\n')
TokenInfo(type=2 (NUMBER), string='2', start=(2, 0), end=(2, 1), line='2)')
TokenInfo(type=54 (OP), string=')', start=(2, 1), end=(2, 2), line='2)')
TokenInfo(type=4 (NEWLINE), string='', start=(2, 2), end=(2, 3), line='')
TokenInfo(type=0 (ENDMARKER), string='', start=(3, 0), end=(3, 0), line='')

        从上面的解析结果可以看出,第一行末尾的换行符(\n)被解析为NL标记,而第二行末尾的换行符(\n)被解析为NEWLINE标记。对于上文谈到的其他特性和结果,可以自行使用程序进行测试,在此不进行详述。

相关文章:

Python:词法分析(行结构与显式、隐式行拼接)

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 1、逻辑结构 一个Python程序由许多逻辑行组成&#xff0c;字面意义上的一行指的是末尾有换行符(\n)&#xff0c;但在不同的情况下&#xff0c;行末尾的换行符(\n)可能有…...

前端Vue 结合xlxs库实现解析excel文件,并动态组装表头!

目录 1.前言2.数据定义3. 页面布局4.上传之前的事件5.解析excel文件,并组装系统表头与excel表头的对应关系6.下拉框改变事件 1.前言 最近有一个需求&#xff0c;就是用户可以任意导入一个自定义的excel文件&#xff0c;让用户可以自己选择&#xff0c;组装表头的对应关系&…...

RabbitMQ集群配置以及负载均衡配置

RabbitMQ集群配置以及负载均衡配置 环境配置集群配置安装rabbitmq启动rabbitmq开启远程登录添加用户并且授权用户添加数据存放目录和日志存放目录查看端口拷⻉erlang.cookie将mq-2、mq-3作为内存节点加⼊mq-1节点集群中查看集群状态添加一个新的队列 RabbitMq负载均衡配置-HAPr…...

Leetcode Hot100之六:42.接雨水

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 提示&#xff1a; n height.length 1 < n < 2 * 10^4 0 < height[i] < 10^5 思路 暴力循环&#xff1a; 原本的思路是左边界i从左到…...

electron 主进程 和 渲染进程通信 ipcRenderer 和 mainWindow.webContents

electron 开发时最麻烦就是electron版本和node版本的选择和正确安装 electron 用npm安装时太慢容易报错&#xff0c;建议用cnpm i 进行安装 注意最新版渲染进程使用node nodeIntegration: true, // 渲染进程可用node contextIsolation: false, // 这个值影响nodeIntegration是…...

关于VUE启动内存溢出

安装node v10.14.2 后 启动公司的VUE项目 使用命令npm run dev 命令 报错&#xff1a; <--- Last few GCs --->[20940:00000244699848E0] 215872 ms: Scavenge 1690.2 (1836.4) -> 1679.6 (1836.4) MB, 5.4 / 0.7 ms (average mu 0.266, current mu 0.253) a…...

HBase学习笔记(1)—— 知识点总结

目录 HBase概述 HBase 基本架构 HBase安装部署启动 HBase Shell HBase数据读写流程 HBase 优化 HBase概述 HBase是以 hdfs 为数据存储的&#xff0c;一种分布式、非关系型的、可扩展的 NoSQL 数据库 关系型数据库和非关系型数据库的区别&#xff1a; 关系型数据库和非关…...

【Linux】 awk命令使用

AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 语法 awk [选项] [文件] awk [选项] [程序] [文件] awk命令 -Linux手…...

Sentinel网关限流

背景 在微服务架构下&#xff0c;每个服务的性能都不同&#xff0c;为避免出现流量洪峰将服务冲垮&#xff0c;需要依赖限流工具来保护服务的稳定性。sentinel是阿里提供的限流工具&#xff0c;社区活跃&#xff0c;功能也很全面&#xff0c;包含实时监控、流控、熔断等功能。…...

solidworks对电脑要求高吗?2023solidworks配置要求

solidworks对电脑要求高吗&#xff1f;SolidWorks是一款功能强大的三维CAD软件&#xff0c;对电脑配置有一定的要求。一般来说&#xff0c;运行SolidWorks需要的电脑配置包括较高的处理器性能、足够的内存和存储空间&#xff0c;以及一块性能良好的显卡。此外&#xff0c;对于大…...

搭建神经网络(torch.nn的用法)

零零碎碎总结了一些torch框架里面nn模块的用法&#xff0c;尤其是关于搭建神经网络的 nn.ModuleList nn.Module nn.Sequential nn.Linear nn.Dropout nn.Embedding nn.DataParallel() 将模型封装起来&#xff0c;便于在多个gpu上并行计算&#xff0c;训练或者推理 nn.…...

卡码网语言基础课 | 11. 句子缩写

目录 一、 字符串大小的比较 二、 ASCII码值 三、 基本框架代码 四、 解题思路 4.1 首字母问题 4.2 判定小写字母 4.3 小写字母转换为大写字母 五、空格判断 六、 代码模块化 6.1 满足的条件 6.2 代码完善 七、 题目解答 7.1 原始代码 7.2 改进代码 八、 拓展与…...

Surface RT 安装 Linux

零&#xff1a;起因 在家无事找出来一台老旧设备 Surface RT 一代的&#xff0c;系统最新是 Windows 8.1 arm版&#xff0c;应用商店都已经打不开了 虽说有破解方法&#xff0c;能运行些软件&#xff0c;但怎么说也不是任意安装&#xff0c;所以局限性还是相当的大&#xff0…...

C++中的函数重载:多功能而强大的特性

引言 函数重载是C编程语言中的一项强大特性&#xff0c;它允许在同一个作用域内定义多个同名函数&#xff0c;但这些函数在参数类型、个数或顺序上有所不同。本文将深入探讨函数重载的用法&#xff0c;以及它的优势和应用场景。 正文 在C中&#xff0c;函数重载是一项非常有…...

数据分析实战 | K-means算法——蛋白质消费特征分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 ​编辑 八、模型评价 九、模型调参与预测 一、数据及分析对象 txt文件——“protein.txt”&#xff0c;主要记录了25个国家的9个属性&#xff0c;主…...

HTTP协议详解-下(Tomcat)

如何构造 HTTP 请求 对于 GET 请求 地址栏直接输入点击收藏夹html 里的 link script img a…form 标签 通过 form 标签构造GET请求 <body><!-- 表单标签, 允许用户和服务器之间交互数据 --><!-- 提交的数据报以键值对的结果来组织 --><form action&quo…...

acwing算法基础之搜索与图论--prim算法

目录 1 基础知识2 模板3 工程化 1 基础知识 朴素版prim算法的关键步骤&#xff1a; 初始化距离数组dist&#xff0c;将其内的所有元素都设为正无穷大。定义集合S&#xff0c;表示生成树。循环n次&#xff1a;找到不在集合S中且距离集合S最近的结点t&#xff0c;用它去更新剩余…...

Amazon EC2 Serial Console 现已在其他亚马逊云科技区域推出

即日起&#xff0c;交互式 EC2 Serial Console 现也在以下区域推出&#xff1a;中东&#xff08;巴林&#xff09;、亚太地区&#xff08;雅加达&#xff09;、非洲&#xff08;开普敦&#xff09;、中东&#xff08;阿联酋&#xff09;、亚太地区&#xff08;香港&#xff09;…...

hdlbits系列verilog解答(100输入逻辑门)-39

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 构建一个具有 100 个输入in[99:0]的组合电路。 有 3 个输出: out_and: output of a 100-input AND gate. out_or: output of a 100-input OR gate. out_xor: output of a 100-input XOR gate. 二、verilog源…...

Python 中 Selenium 的屏幕截图

文章目录 使用 save_screenshot() 函数在 Python 中使用 selenium 捕获屏幕截图使用 get_screenshot_as_file() 函数在 Python 中使用 selenium 捕获屏幕截图使用 Screenshot-Selenium 包在 Python 中使用 selenium 捕获屏幕截图总结我们可以使用 Selenium 在自动化 Web 浏览器…...

【首发】Manus pro haptic 最新力反馈数据手套,可接受预定

一、核心技术与参数追踪技术&#xff1a;自研 EMF 电磁场追踪精度&#xff1a;毫米级&#xff0c;无遮挡、无漂移MANUS自由度&#xff1a;25 DOF&#xff08;全手解剖学捕捉&#xff09;MANUS延迟&#xff1a;有线 4ms、无线 16msMANUS触觉反馈&#xff1a;多点振动触觉&#x…...

从DS3231到RX8025T:手把手教你为Arduino点阵时钟更换低成本高精度RTC模块

从DS3231到RX8025T&#xff1a;低成本高精度RTC模块的完整迁移指南 1. 为什么选择RX8025T替代DS3231 在电子创客项目中&#xff0c;实时时钟模块&#xff08;RTC&#xff09;的选择往往需要在精度、成本和功能之间寻找平衡点。DS3231以其出色的精度&#xff08;2ppm&#xff…...

终极视频PPT提取教程:3分钟将视频幻灯片转为PDF文档

终极视频PPT提取教程&#xff1a;3分钟将视频幻灯片转为PDF文档 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 想要快速从在线课程、会议录像或教学视频中提取PPT幻灯片内容吗&…...

【技术综述】世界模型演进图谱:从Dyna到Sora,理解与预测的双重变奏

1. 世界模型的起源与核心使命 1989年&#xff0c;强化学习先驱Richard Sutton在论文中首次提出Dyna架构时&#xff0c;可能没想到这个概念会成为人工智能理解世界的基石。当时他正在思考一个简单却深刻的问题&#xff1a;智能体如何像人类一样&#xff0c;通过想象来规划行动&…...

终极Windows系统清理指南:如何用WindowsCleaner快速拯救你的C盘空间

终极Windows系统清理指南&#xff1a;如何用WindowsCleaner快速拯救你的C盘空间 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常遇到Windows电脑运行越…...

KrakenD部署实战:Docker、Kubernetes、云原生环境全攻略

KrakenD部署实战&#xff1a;Docker、Kubernetes、云原生环境全攻略 【免费下载链接】krakend-ce KrakenD Community Edition: High-performance, stateless, declarative, API Gateway written in Go. 项目地址: https://gitcode.com/gh_mirrors/kr/krakend-ce KrakenD…...

OFA视觉推理系统效果展示:复杂场景下的图文关系判断案例

OFA视觉推理系统效果展示&#xff1a;复杂场景下的图文关系判断案例 1. 引言&#xff1a;当计算机学会"看图说话" 在数字内容爆炸式增长的今天&#xff0c;我们每天都会遇到大量图文信息。从社交媒体到电商平台&#xff0c;从新闻网站到在线教育&#xff0c;图片和…...

STM32CubeMX实战:用IIC驱动JY61P六轴陀螺仪(附完整工程文件)

STM32CubeMX实战&#xff1a;用IIC驱动JY61P六轴陀螺仪&#xff08;附完整工程文件&#xff09; 在嵌入式开发中&#xff0c;姿态传感器是实现运动追踪、平衡控制等功能的常见组件。JY61P作为一款高性价比的六轴陀螺仪模块&#xff0c;通过IIC接口与STM32微控制器通信&#xff…...

【稀缺首发】SITS2026圆桌闭门纪要:全球仅12家机构获准验证的多模态推理新范式(含3项未公开Benchmark数据)

第一章&#xff1a;SITS2026圆桌&#xff1a;多模态大模型未来趋势 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026圆桌论坛中&#xff0c;来自Meta、DeepMind、中科院自动化所与上海AI Lab的七位首席科学家共同指出&#xff1a;多模态大模型正从“跨模态对齐”迈向…...

AI人体骨骼关键点检测作品集:多场景骨架图生成,效果直观一目了然

AI人体骨骼关键点检测作品集&#xff1a;多场景骨架图生成&#xff0c;效果直观一目了然 1. 引言 1.1 技术亮点展示 今天我要带大家看一组令人惊艳的AI骨骼检测作品集。基于Google MediaPipe Pose模型&#xff0c;这套系统能在毫秒级时间内精准定位人体33个关键点&#xff0…...