python.tkinter设计标记语言(语法2-语法解析器)

news2024/12/28 3:55:58

@TOC

前言

本文只作为笔记记录。

TinText开源地址:https://github.com/Smart-Space/TinText

语法解析器

从前文可以看到,新的Tin标记语言非常简单,即便是加入嵌套关系,也只是标签级别做个标记就行了。(在写这篇文章的时候,新版Tin语法解析器还没有重写到能够解析嵌套标签的程度,但是很简单,就像下文所说)

比如:

<pass>#pass-content1
...
<pass>#pass-content2
...
<pass>#pass-content2
...
</pass>#pass-content1

好了,话不多说,虽然接下来也没有多少话。

正则匹配

class TinParser():
    """
    tin标记解析模块
    """
    ver='V-4'

    def __init__(self):
        #<tag>, -, |, |-, [空]
        self.tin_re=re.compile('[ ]{0,}(<.*?>|-|\\|-|\\||)(.*)')
        self.tag_start_attrs_tuple=('|','-')
        #特殊标记|,-,;

我们创建了一个名为TinParser的语法解析器,并且预编译了语法正则匹配self.tin_re

接下来的流程思路大致如下:

具体实现:

    def parse(self,tin):
        #分析
        TAGATTR=False#标签参数注入,用于多行表达
        line_count=0#行数
        for line in tin.split('\n'):
            line_count+=1
            if line=='':
                continue
            if line.startswith('|-'):
                #注释
                continue
            unit=self.tin_re.match(line)
            if unit==None:#无法匹配
                err=f"无法匹配的tin标记[{line_count}]:\n{line}"
                yield TagNoMatch(err)
                break
            unit=unit.groups()
            if unit[1].endswith(';'):#开启多行表达
                if TAGATTR:
                    err=f"重复使用多行表达标记[{line_count}]:\n{line}\n上方标签的多行表达未结束"
                    yield AlreadyStartLine(err)
                TAGATTR=True
                tagattrs=list()
                tagattrs.append(line_count)
                tagattrs.append(unit[0])
                tagattrs.append(unit[1][:-1])
                continue
            if TAGATTR and (unit[0] not in self.tag_start_attrs_tuple):
                #多行表达标签没有正确的后续标记
                err=f"多行表达错误[{line_count}]:\n{line}\n多行表达缺少结束标记,或者更改上方标签为单行表达\n多行表达开始于[{tagattrs[0]}]"
                yield NoLinesMark(err)
                break
            if unit[0] in self.tag_start_attrs_tuple:#多行表达
                if not TAGATTR:
                    #TAGATTR:False时,提出警告
                    err=f"标记未使用多行表达,但出现了多行表达的参数[{line_count}]:\n{line}\n请检查上方标记参数末尾是否有\";\""
                    yield NoLinesMode(err)
                    break
                if unit[1].endswith('|'):#多行表达结束
                    TAGATTR=False
                    tagattrs.append(unit[1][:-1])
                    yield tuple(tagattrs)
                    del tagattrs
                    continue
                tagattrs.append(unit[1])
                continue
            attrs=unit[1].split('|')
            rattrs=list()#result attrs
            for i in attrs:
                #对已经获得的参数值进行特殊标记文本转义,这可能降低效率,目前没有好的方法
                rattrs.append(i.replace('%VEB%','|'))
            yield line_count,unit[0],*rattrs

这里使用了yield输出,就是为了能够即时解析,同时加快与渲染器的解释与渲染效率,因为接下来的渲染器的解释与渲染是通过for循环实现的。

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

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

相关文章

【Python机器学习】回归——局部加权线性回归

线性回归有一个问题就是有可能出现过拟合现象&#xff0c;因为它求的是具有最小均方误差的无偏估计。如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引入一些偏差&#xff0c;从而降低预测的均方误差。 其中一个方法就是局部加权线性回归&#xff08;LWLR…

学习记录——day27 进程间通信 IPC通信机制 消息队列 共享内存

目录 一、IPC通信机制 1、system V提供了三种IPC&#xff08;interprocess communication&#xff09;进程间通信方式 消息队列 共享内存 信号量集 2、该通信机制是独立于进程而存在的:当进程将数据写入该通信对象中后&#xff0c;即使进程已经结束&#xff0c;对象中保存的…

吴恩达机器学习COURSE1 WEEK2

COURSE1 WEEK2 多维特征 在线性回归中&#xff0c;往往特征不止一个&#xff0c;而是具有多维特征 例如&#xff0c;在预测房价的例子中&#xff0c;我们知道更多的信息&#xff1a; x 1 x_1 x1​&#xff1a;房屋的面积 x 2 x_2 x2​&#xff1a;卧室的数目 x 3 x_3 x3​&a…

【嵌入式】常用英文缩写及单词整理

目录 嵌入式常用英文缩写及单词整理1. 缩写部分2. 词汇部分3. 语句部分4. 调试部分5. 结束语相关文章&#xff1a; 嵌入式常用英文缩写及单词整理 1. 缩写部分 缩写全称翻译AADCAnalog-to-Digital Converter模/数转换器&#xff0c;模数转换器ADUApplication data unit应用数…

KBEngine ue5

前言 最近在试 KBEngine 的 ue4 项目&#xff0c;它在 ue4 下能够正常编译使用&#xff0c;但是现在都已经进入 ue5 时代&#xff0c;那么能不能将现有工程移到 ue5 下呢&#xff1f; 使用 ue5 打开工程的报错处理 1、DefaultBuildSettings BuildSettingsVersion.V5; kbeng…

python.tkinter设计标记语言(渲染2-渲染器)

TOC 前言 本文仅作为笔记记录。 在前文中&#xff0c;我们通过标记意义解释生成了带有明确渲染要求的参数组&#xff0c;以<title>为例&#xff0c;我们获取了title, level两个明确的渲染标记&#xff0c;这一部分由Tin标记解释器完成&#xff0c;不需要编写者花费过多…

亚马逊、eBay、沃尔玛等海外跨境电商测评自养号的技术解决方案

随着跨境电商的蓬勃发展&#xff0c;卖家们对于提升店铺流量、销量以及产品评价的需求日益迫切。在这一背景下&#xff0c;海外跨境电商测评成为了一个备受瞩目的领域。作为一家专注于此领域的技术型公司&#xff0c;凭借其深厚的技术积累和丰富的实战经验&#xff0c;为卖家们…

supermap制作发布二三维地图服务

一、下载安装 软件版本&#xff1a; SuperMap iDesktopX 11i(2023) SP1 for Windows SuperMap iServer 11i(2023) SP1 for Windows 下载地址&#xff1a; http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx 二、运行 服务端&#xff1a;双击iserver的…

HTML学习笔记——用HTML记录学习过程4——非主体结构元素

非主体结构元素主要是为了表达逻辑结构或者附加信息的元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>非主体结构元素</title> </head> <body> <header><h1>head…

大模型落地应用架构的一种模式

经过几个月的实践和探索&#xff0c;看过也经历过一些成型的项目了&#xff0c;如果是奔着落地去的&#xff0c;我们的目光不能只盯着大模型本身&#xff0c;而应该放眼甚至是需要投入精力去建设很多我们别的工作上。 本文&#xff0c;着重讲的是&#xff0c;我的理解下现实成…

「实战应用」着色器对图表控件LightningChart的影响及应用

LightningChart完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学&am…

PySide入门实战之五 | 信号与槽函数之鼠标、键盘等事件

&#x1f680;&#x1f680;&#x1f680; Pyside6实战教程专栏目录入口&#xff1a;点击跳转 目录 一、前期准备二、鼠标触发事件鼠标拖动窗口 一、前期准备 我们采用Pyside入门实战之四中通过QTDesigner创建的界面&#xff0c;具体由两个Label和一个Button组件构成&#xff…

【图书推荐】《数据资产管理核心技术与应用》

内容简介 《数据资产管理核心技术与应用》深入探讨数据资产管理的核心技术与应用&#xff0c;融入作者在大数据领域多年的丰富经验。《数据资产管理核心技术与应用》为读者提供一套可以落地的数据资产管理框架&#xff0c;并详解两个基于该框架进行数据资产管理的应用案例&…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-09 ICMP层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

github技巧和bug解决方法短篇收集

有一些几句话就可以说明白的观点或者解决的的问题&#xff0c;小虎单独收集到这里。 Commits没有算入每天的activity fork的仓库是不算的。 Commits made in a fork will not count toward your contributions. 参考&#xff1a; Contribution activity not shown for github…

win7一键修复所有dll缺失详细方法,7个dll修复方法深度解析(2024)

dll文件是一种包含函数和其他关键信息的文件&#xff0c;供 Windows 应用程序使用。虽然大多数普通用户对.dll 文件的具体工作原理并不熟悉&#xff0c;但这些文件对于系统应用来说是至关重要的。通常情况下&#xff0c;人们在遇到因 DLL 文件缺失或损坏而导致的错误时&#xf…

Vue3+Ts项目中经常遇到导入组件,vscode报无法找到模块xxx,xxx隐式拥有 “any“ 类型解决办法~

1、报错截图&#xff1a; 2、解决办法&#xff1a;在确保路径正确的情况下&#xff0c;你会在 src 目录下找到一个名为 env.d.ts 的文件&#xff08;或者类似的名称&#xff09;。在这个文件中&#xff0c;你可以声明 .vue 文件的模块类型。例如&#xff1a;(这告诉 TypeScript…

探索Cohere的Prompt Tuner:革新你的提示优化工具

在今天的文章中&#xff0c;我们将深入探讨Cohere的Prompt Tuner。这是一款在你指尖的提示优化工具&#xff0c;至少这是他们所宣称的。Prompt Tuner的主要理念是&#xff0c;它提供了一种最简化、最标准化的方式来生成你所需要的提示。而最棒的部分是&#xff0c;你不需要成为…

vtkConnectivityFilter提取连通区域中的问题

直接使用vtkConnectivityFilter提取连通区域&#xff0c;渲染上没问题&#xff0c;但是打印出polydata中的点数&#xff0c;发现跟原始数据是一致的。 for (int i 0; i < numRegions; i){vtkSmartPointer<vtkConnectivityFilter> connectivityFilter vtkSmartPointe…

嵌入式人工智能(树莓派4B基础实验代码等)

本专栏收录了近40个实验,含全部实验代码,都已经打包。 1、简介 本实验平台为树莓派4B,处理器4核ARMV8架构-A72,内存8G版本,SD卡容量为64G。操作系统版本lsb_release -a 操作系统内核为uname -a 本专栏收录了树莓派系统的基本知识,环境基本配置,常用Linux系统操作、基…