使用云雀解析器(ebnf语法)解析罗马数字时出现UnexpectedCharacters错误

时间:2019-10-04 03:57:13

标签: python parsing ebnf lark-parser

我在百灵鸟解析器中使用以下语法来解析字母和罗马数字。语法如下:

    invoicesDB.update(
      { "_id" : :req.params.id, “items._id": “Id of item for which
                                  user needs to update” }, 
      { "$set": { “items.$.qty”: 5}}, 
      function(err, company) {
        console.log(company)
    })

当我使用此规则并解析以下文本时,出现异常:

DIGIT: "0".."9"
INT: DIGIT+
_L_PAREN: "("
_R_PAREN: ")"
LCASE_LETTER: "a".."z"
ROMAN_NUMERALS: "viii" | "vii" | "iii" | "ii" | "ix" | "vi" | "iv" | "v" | "i" | "x"


?start: qns_num qns_alphabet  qns_part
qns_num: INT?
qns_alphabet: _L_PAREN LCASE_LETTER _R_PAREN | LCASE_LETTER _R_PAREN | LCASE_LETTER?
qns_part: _L_PAREN ROMAN_NUMERALS _R_PAREN | ROMAN_NUMERALS _R_PAREN | ROMAN_NUMERALS?

在我的一生中,我想不出为什么会抛出异常。但这很好:

# lark.exceptions.UnexpectedCharacters: No terminal defined for 'i' at line 1 col 5
# 10i)i)
#     ^
result = Lark(grammar, parser='lalr').parse("10i)i)")

1 个答案:

答案 0 :(得分:0)

  

之所以发生,是因为两个规则都可以为空,   使词法分析器始终跳过其中之一以匹配   优先级较高的终端。

     

在一个规则为空且第二个规则匹配的情况下,解析器期望一个   EOF,没有更多输入。 (的引入迫使规则不被   空的。

     

因此,更改LCASE_LETTER的优先级将无济于事。但不允许   第一个为空的规则将是

     

Earley算法将知道如何解决这种歧义   自动。

我在lark-parser github页面上问了同样的问题。来自there的答复。