使用云雀的语法优先

Kyp*_*paz 3 python grammar lark-parser

我的语法中有一个优先级问题,而且我没有其他解决方法。

我正在使用云雀

这是事情(我已尽力简化了问题):

from lark import Lark

parser = Lark(r"""
    start: set | set_mul

    set_mul: [nb] set
    set: [nb] "foo"
    nb: INT "x"

   %import common.INT
   %import common.WS
   %ignore WS

   """, start='start')

input = "3xfoo"
p = parser.parse(input)
print(p.pretty())
Run Code Online (Sandbox Code Playgroud)

输出为:

  start
  set_mul
    set
      nb    3
Run Code Online (Sandbox Code Playgroud)

但是我想要的是:

start
  set_mul
     nb 3
     set
Run Code Online (Sandbox Code Playgroud)

我试图将优先权放在我的规则中,但是没有用。

您是否知道我需要进行哪些更改才能使其正常工作?

谢谢

Ere*_*rez 6

一个简单的解决方案可能是重新编写语法以消除歧义。

parser = Lark(r"""
    start: set | set_mul

    set_mul: nb | nb set | nb nb_set
    set: "foo"
    nb_set: nb set
    nb: INT "x"

   %import common.INT
   %import common.WS
   %ignore WS

   """, start='start')
Run Code Online (Sandbox Code Playgroud)

这样,以下每个输入只有一种可能的解释:

input = "3xfoo"
p = parser.parse(input)
print(p.pretty())

input = "3x4xfoo"
p = parser.parse(input)
print(p.pretty())         
Run Code Online (Sandbox Code Playgroud)

结果:

start
  set_mul
    nb  3
    set

start
  set_mul
    nb  3
    nb_set
      nb    4
      set
Run Code Online (Sandbox Code Playgroud)