Python SimpleParse非确定性语法直到运行时

Python SimpleParse非确定性语法直到运行时,python,parsing,text-parsing,Python,Parsing,Text Parsing,我正在用Python编写一个基本的网络协议,它应该能够传输ASCII字符串读取:EOL终止和二进制数据。 为了使后一种方法成为可能,我选择创建语法,这样它就包含了即将到来的二进制字节数 对于SimpleParse,到目前为止语法如下[1]: EOL := [\n] IDENTIFIER := [a-zA-Z0-9_-]+ SIZE_INTEGER := [1-9]*[0-9]+ ASCII_VALUE := [^\n\0]+, EOL BINARY_VALUE := .*+ value := (

我正在用Python编写一个基本的网络协议,它应该能够传输ASCII字符串读取:EOL终止和二进制数据。 为了使后一种方法成为可能,我选择创建语法,这样它就包含了即将到来的二进制字节数

对于SimpleParse,到目前为止语法如下[1]:

EOL := [\n]
IDENTIFIER := [a-zA-Z0-9_-]+
SIZE_INTEGER := [1-9]*[0-9]+
ASCII_VALUE := [^\n\0]+, EOL
BINARY_VALUE := .*+
value := (ASCII_VALUE/BINARY_VALUE)

eol_attribute := IDENTIFIER, ':', value
binary_attribute := IDENTIFIER, [\t], SIZE_INTEGER, ':', value
attributes := (eol_attribute/binary_attribute)+ 

command := IDENTIFIER, EOL
command := IDENTIFIER, '{', attributes, '}'
问题是,我不知道如何指示SimpleParse,在运行时,下面的内容将是一堆大小为_整数字节的二进制数据

原因是终端二进制_值的定义满足了我现在的需求,因此无法更改

谢谢

编辑

我想解决方案会告诉它在匹配生产二进制_属性时停止,并让我通过socket.recv手动填充AST节点,但是如何做到这一点呢

编辑2

Base64编码或类似编码不是选项


[1] 我还没有测试过它,所以我不知道它是否实际有效,只是让你有个想法

如果语法和你引用的语法一样简单,那么使用语法分析器生成器可能太过分了?您可能会发现,手动运行自己的递归解析器更简单、更快。

如果语法与您引用的语法一样简单,那么使用解析器生成器可能会有些过火?您可能会发现,用手滚动自己的递归解析器更为简单和快捷。

< P>我强烈建议您考虑使用库来解析二进制数据。它还支持文本ASCII,因此当它检测到文本时,可以将其传递给基于SimpleParse的解析器,但二进制数据将使用构造进行解析。它非常方便和强大。

< P>我强烈建议您考虑使用库来解析二进制数据。它还支持文本ASCII,因此当它检测到文本时,可以将其传递给基于SimpleParse的解析器,但二进制数据将使用构造进行解析。它非常方便且功能强大。

如果您希望您的应用程序具有可移植性和可靠性,我建议您仅通过网络传递标准ASCII字符

不同的计算机体系结构具有不同的二进制表示、不同的字长和不同的字符集。有三种方法可以解决这个问题

首先,您可以忽略这些问题,并希望您只需要在单个paltform上实现该协议

第二,你可以去所有的计算机科学领域,为每种可能的数据类型提出一种基本的形式——ala CORBA

在通过网络发送数据时,您可以很实用地使用sprintf和scanf的魔力将数据转换为普通ASCII字符或从普通ASCII字符转换为普通ASCII字符


我还建议您的协议在消息开头或附近包含消息长度。自制协议中最常见的错误是,接收方希望收到比发送的数据更多的数据,然后永远等待从未发送的数据

如果您希望您的应用程序可移植且可靠,我建议您仅通过网络传递标准ASCII字符

不同的计算机体系结构具有不同的二进制表示、不同的字长和不同的字符集。有三种方法可以解决这个问题

首先,您可以忽略这些问题,并希望您只需要在单个paltform上实现该协议

第二,你可以去所有的计算机科学领域,为每种可能的数据类型提出一种基本的形式——ala CORBA

在通过网络发送数据时,您可以很实用地使用sprintf和scanf的魔力将数据转换为普通ASCII字符或从普通ASCII字符转换为普通ASCII字符


我还建议您的协议在消息开头或附近包含消息长度。自制协议中最常见的错误是,接收方希望收到比发送的数据更多的数据,然后永远等待从未发送的数据

为了更好地理解,您使用的是哪种解析器生成器?如果有的话。我对python了解不多,但您看过twisted吗?我想您可以在framework/libraryLook中实现任何新协议,twisted生成的解析器类看起来很有趣,但对我的需求来说太全面和沉重了。也许我会在另一个项目中使用它。ASCII是二进制的子集,所以第一个问题是为什么首先需要将两者分开?当然是ASCII字符串。为了更好地理解,您使用的是哪种解析器生成器?如果有的话。我对python了解不多,但您看过twisted吗?我想您可以在framework/libraryLook中实现任何新协议,twisted生成的解析器类看起来很有趣,但对我的需求来说太全面和沉重了。也许我会在另一个项目中使用它。ASCII是二进制的子集,所以第一个问题是为什么首先需要将两者分开?当然是ASCII字符串。