Я пытаюсь написать анализатор 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
.
Когда я введу "quoted_string"
, я ожидаю, что он будет проанализирован следующим образом:
command -> quoted_string -> qcontentsmtp -> qtextsmtp
Как видите, qtextsmtp
содержит буквенно-цифровые символы, закодированные как регулярное выражение,как показано в РФС. Однако, когда я пытаюсь разобрать его, я получаю это сообщение:
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)
Но я даже не дохожу до этих правил, потому что, как я уже сказал, он даже не будет анализироваться.
Я не совсем уверен, почему регулярное выражение не работает. Я использую этот тип правил в других частях, и они прекрасно работают, просто с этим он не работает.