簡體   English   中英

Lark 解析器無法解析字符,即使它們是在規則的正則表達式中定義的

[英]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 ]

解析器的唯一startcommand -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM