百灵鸟语法中标记优先级的混淆

Confusion around priority of tokens in lark grammar

之后,我对 /.+/ 正则表达式行的优先级有点困惑;我希望下面的测试产生

  line
  line  x
  chunk abc

相反我得到:

  line
  line  x
  line  abc
    def test_tokenizing(self):
        p = Lark(r"""

        _NL: /\n/
        line.-1: /.+/? _NL
        chunk: /abc/ _NL
        start: (line|chunk)+

        """, parser='lalr')

        text = '\nx\nabc\n'
        print(p.parse(text).pretty())

在 Lark 中,优先级对于规则和终端有不同的含义。

快速提醒一下,规则名称为小写,而终端名称为大写。

在 LALR 模式下,规则的优先级仅影响在发生 reduce/reduce 冲突时选择哪一条规则。对里面的终端没有影响。

您想要的是更改终端本身的优先级:

def test_tokenizing():
    p = Lark(r"""

    _NL: /\n/
    line: EVERYTHING? _NL
    EVERYTHING.-1: /.+/
    chunk: /abc/ _NL
    start: (line|chunk)+

    """, parser='lalr')

    text = '\nx\nabc\n'
    print(p.parse(text).pretty())