gpt4 book ai didi

python - Lark 解析器无法解析字符,即使它们是在规则的正则表达式中定义的

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:29 27 4
gpt4 key购买 nike

我正在尝试编写一个 SMTP 解析器,并从 rfc 中获取一些引用字符串的信息。 .所以我有以下语法(取出所有有效的部分,关注无效的部分):

quoted_string  : /[\x22]/ qcontentsmtp* /[\x22]/
qcontentsmtp : qtextsmtp | quoted_pairsmtp
quoted_pairsmtp : /[\x5C\x5C]/ /[\x20-\x7E]/
qtextsmtp : /[\x20-\x21|\x23-\x5B|\x5D-\x7E]/

command : [ quoted_string ]

解析器的唯一 startcommand 规则。

当我输入 "quoted_string" 时,我希望它被这样解析:

command -> quoted_string -> qcontentsmtp -> qtextsmtp

如您所见,qtextsmtp 包含字母数字字符,编码为正则表达式,如 rfc 中所示。但是,当我尝试解析它时,我收到了这条消息:

input = '"quoted_string"'
....
####### Parsing Failed
No terminal defined for 'q' at line 1 col 2

"quoted_string"
^

当我只输入 "" 时,它会按预期工作。

当我更改规则 qtextsmtp 并将正则表达式替换为 "a" 并使输入为 '"a"' 时,它也有效。

我将所有规则定义为转换器中的函数,非常基本,如下所示:

class StringsTransformer(Transformer):
# externals
def quoted_string(self, args):
return "".join(args)

# internals
def qcontentsmtp(self, args):
return "".join(args)

def quoted_pairsmtp(self, args):
return "".join(args)

def qtextsmtp(self, args):
return "".join(args)

但我什至没有了解这些规则,因为正如我所说,它甚至不会解析。

我不太确定为什么正则表达式不起作用。我在其他部分使用了这些类型的规则,它们工作得很好,只是这个没有。

最佳答案

Lark 的正则表达式解析器似乎与 [] 的引用混淆为 \x5b\x5dq 字母根本不匹配正则表达式。将 \x5b 替换为 \[ 并将 \x5d 替换为 \] 后,语法解析提供的输入,如由以下程序显示:

import lark

grammar = r"""
quoted_string : /[\x22]/ qcontentsmtp* /[\x22]/
qcontentsmtp : qtextsmtp | quoted_pairsmtp
quoted_pairsmtp : /[\x5C\x5C]/ /[\x20-\x7E]/
qtextsmtp : /[\x20-\x21\x23-\[\]-\x7E]/

command : [ quoted_string ]
"""

parser = lark.Lark(grammar, start='command')

print(parser.parse('"quoted_string"'))

(注意 | 在字符集中是多余的,它被解释为只是要匹配的另一个字符。)

这不是 Python 正则表达式的一般限制,它们完全能够接受以十六进制转义的 []:

>>> re.compile(r'[\x23-\x5b\x5d-\x7e]').match('q')
<re.Match object; span=(0, 1), match='q'>

我现在 reported the issue致 Lark 的维护者。

关于python - Lark 解析器无法解析字符,即使它们是在规则的正则表达式中定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58780388/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com