通过对特定语法进行解析无法获得预期的结果

迈克·桑福德

我有一个要解析的二进制有线协议配置文件。这用于允许低带宽链接两侧的计算机以允许用户在现场配置它们的方式就哪些位表示哪些数据达成一致。

配置文件字符串如下所示:

abc:16 =>标识符abc有16位

abc:16 def:12 =>标识符abc有16位,标识符def有12位

abc:16:p =>标识符abc有16位和一个奇偶校验位

abc:16:ecc =>标识符abc具有16位和2位用于ecc

我要说的是我认为应该正确解析此语法,但是我遇到了一个奇怪的问题:我只能有一个没有奇偶校验或ecc的标识符作为一行的最后一条语句。语法应该支持在行中的任何地方都具有带有或不带有奇偶校验的标识符,但是无论出于何种原因都不会发生。

所以:
abc:16
本身就可以了,因为后面没有任何东西

abc:16:p def:12
是可以的,因为abc:16:p在末尾具有奇偶校验

abc:16 def:12
不好,因为abc:16没有奇偶校验并且不是末尾,但这应该没问题

abc:16 def:12:p
也不行,因为非奇偶校验语句不在末尾,但这也应该完全正确

这是程序:

from pyparsing import *
import re

abbr = Word(alphas, min=3, max=4)
#abbr = abbr.setDebug()

separator = Suppress(Literal(":"))
bits = Word(nums, min=1, max=2)
parity = Or([CaselessLiteral("P"), CaselessLiteral("ECC")])

bits_part = separator + bits
#bits_part = bits_part.setDebug()

parity_part = separator + parity
#parity_part = parity_part.setDebug()

statement = abbr + bits_part + Optional(parity_part)
#statement = statement.setDebug()

statement_list = StringStart() + statement + ZeroOrMore(Suppress(White()) + statement) + Optional(Suppress(White())) + StringEnd()

tests = ( 
    "abc:16",
    "abc:15:p", 
    "abc:15:p def:14:ecc",
    "abc:17:p def:q ghi:21:", #this one should fail since "q" isn't parity and you shouldn't have a trailing colon with no parity after it
    "abc:16:p def:12", #this passes so it's OK to have a trailing statement without parity
    "abc:15 def:12:p", #this fails but shouldn't
    "abc:16:p def:12 pqr:11", #this is also failing because anything but the last statement missing parity causes failure, but I don't think that's the right behavior
)

for t in tests:
    try:
        print t
        print statement_list.parseString(t)
    except Exception as e:
        print e

在未打开调试的情况下运行它时,会看到以下结果。根据我的理解(和上面的评论),只有第三个示例应该失败,因为它具有“ q”,而奇偶校验的“ p”应位于其中。其他所有内容都应该通过,但由于我不明白的原因而引发异常。

abc:16
['abc', '16']
abc:15:p
['abc', '15', 'P']
abc:15:p def:14:ecc
['abc', '15', 'P', 'def', '14', 'ECC']
abc:17:p def:q ghi:21:
Expected end of text (at char 9), (line:1, col:10)
abc:16:p def:12
['abc', '16', 'P', 'def', '12']
abc:15 def:12:p
Expected end of text (at char 7), (line:1, col:8)
abc:16:p def:12 pqr:11
Expected end of text (at char 16), (line:1, col:17)

当我打开调试功能时(在上面的示例代码中全部注释掉了),我只是看“ abc:16 def:12”,这是输出:

abc:15 def:12:p
Match {W:(abcd...) {Suppress:(":") W:(0123...)} [{Suppress:(":") {'P' ^ 'ECC'}}]} at loc 0(1,1)
Match W:(abcd...) at loc 0(1,1)
Matched W:(abcd...) -> ['abc']
Match {Suppress:(":") W:(0123...)} at loc 3(1,4)
Matched {Suppress:(":") W:(0123...)} -> ['15']
Match {Suppress:(":") {'P' ^ 'ECC'}} at loc 7(1,8)
Exception raised:Expected ":" (at char 7), (line:1, col:8)
Matched {W:(abcd...) {Suppress:(":") W:(0123...)} [{Suppress:(":") {'P' ^ 'ECC'}}]} -> ['abc', '15']
Expected end of text (at char 7), (line:1, col:8)

在我看来,这确认它正在尝试匹配parity_part,但显然不存在。但是我已经设置好了,所以parity_part是Optional(),所以我不知道为什么它坚持要找到它。

此外,那里还有一个空格字符(在abc:16和def:12之间),我认为应该触发它继续前进,这是我在语法的statement_list部分中指定的方式。为此,我还向练习者添加了“ leaveWhitespace()”调用:

print statement_list.parseString(t).leaveWhitespace()

但这并没有改变任何东西(因为它没有开始解析我期望的方式),所以我不认为问题在于缺少空白。我当然不能完全打折。

我在这里感到非常困惑,因为我已经从我能想到的各个角度解决了这个问题,但我仍然没有得到我期望的结果。我指定的语法错误吗?pyparsing做错什么了吗?我很自信自己在某个地方犯了错误,但我真的看不到它。

编辑:

因此,保罗指出,我到处都有很多笨拙的空白内容,并且当他将所有内容浪费掉并且简化后的工作效果很好时。空格是有目的的,因为我将尝试阻止人们做类似的事情:

“ abc:10:ecc”

因为它看起来很糟糕,不是因为它不包含正确的信息。

我不确定是否要防止人们在我认为不应放置的地方放些东西,所以保罗的答案可能足以让我继续生活。

但是我仍然很好奇为什么我制作的版本无法正常工作,而他所做的修改却可以。它们在功能上看起来与我相同。

保罗·麦格

知道pyparsing将跳过空白自身,是吗?

我通过将statement_list定义为简单的方式来使其工作:

statement_list = OneOrMore(statement)

为了使多个语句不能一起运行,应使用Group:

statement_list = OneOrMore(Group(statement))

并且不要添加自己的StringEnd来强制解析器尝试处理完整的字符串,请使用parseAll=True

print statement_list.parseString(t, parseAll=True)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法从for循环获得预期结果

来自分类Dev

bash特定语法的说明

来自分类Dev

无法进行JSON解析语法

来自分类Dev

PHP Strpos无法获得预期的结果

来自分类Dev

telteling转换无法获得预期的结果

来自分类Dev

CompletableFuture 实例无法获得预期结果

来自分类Dev

使用python特定语法解析大文本文件

来自分类Dev

freeradius测试用户无法通过解析错误(回复)进行条目测试:预期的行尾或逗号

来自分类Dev

vim:通过命令行参数强制使用特定语法

来自分类Dev

如何解析json数组并获得预期结果?

来自分类Dev

如何解析json数组并获得预期结果?

来自分类Dev

无法使url函数与django中的特定语法一起使用

来自分类Dev

R中的特定语法构造

来自分类Dev

在特定语法后替换名称

来自分类Dev

如何从预期结果中获得唯一值并将其与预期结果进行比较?

来自分类Dev

无法获得Spring4D加密示例的预期结果

来自分类Dev

无法从THREE.js / GLSL代码获得预期结果

来自分类Dev

在react-testing-library中无法从.toHaveBeenCalledTimes()获得预期结果

来自分类Dev

使用模板的ConvertFrom-String无法按预期进行解析

来自分类Dev

Apache Commons CLI无法按预期进行解析?

来自分类Dev

从JSON到PHP的解析无法按预期进行

来自分类Dev

MySQL连接语句语法错误,无法对结果进行排序

来自分类Dev

并非总是获得预期的结果

来自分类Dev

为特定语法禁用Sublime Text Minimap

来自分类Dev

特定语言的无上下文语法

来自分类Dev

我的Angular应用仅适用于特定语法

来自分类Dev

我在理解特定语法时遇到麻烦

来自分类Dev

特定语言的上下文相关语法

来自分类Dev

特定语言的无上下文语法

Related 相关文章

热门标签

归档