我正在尝试编写一个 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 ]
start
解析器的唯一规则是command
-rule。
当我输入时"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)
但我什至没有达到这些规则,因为正如我所说,它甚至不会解析。
我不太确定为什么正则表达式不起作用。我在其他部分使用这些类型的规则,它们工作得很好,只是这个没有。