![](/img/trans.png)
[英]How can I parse a string with unicode characters in lark-parser in python
[英]Lark parser can't parse characters, even though they are defined in regex of rule
我正在嘗試編寫一個 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.xml 所示。 但是,當我嘗試解析它時,我收到以下消息:
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)
但我什至沒有達到這些規則,因為正如我所說,它甚至不會解析。
我不太確定為什么正則表達式不起作用。 我在其他部分使用這些類型的規則,它們工作得很好,只是這個沒有。
如果可以的話,我建議在終端中使用字符串文字; 盡管它們不會完全匹配 RFC,但它們肯定可以在現有的 Lark 解析器實現中工作。 (你的例子對我來說也失敗了,但使用下面的作品。不確定我理解為什么的基礎。)
DOUBLE_QUOTED_STRING : /"[^"]*"/
來自雲雀 src 的參考。
你如何定義你的語法? 如果您在代碼中內聯定義它(而不是從文件中讀取),您可能需要轉義您的\
反斜杠。
看起來 Lark 的正則表達式解析器與[
和]
分別引用為\x5b
和\x5d
混淆了,並且q
字母根本不匹配正則表達式。 將\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'>
我現在已經向 Lark 的維護者報告了這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.