百灵鸟语法中标记优先级的混淆
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())
在 /.+/
正则表达式行的优先级有点困惑;我希望下面的测试产生
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())