python - 使用 Lark 语法优先

标签 python grammar lark-parser

我的语法有一个优先级问题,我没有更多的想法来解决它。

我正在使用 Lark

事情是这样的(我已经尽可能地简化了问题):

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())

输出是:

  start
  set_mul
    set
      nb    3

但我想要的是:

start
  set_mul
     nb 3
     set

我试图在我的规则中设置优先级,但它不起作用。

您是否知道我需要更改什么才能使其正常工作?

谢谢

最佳答案

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

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')

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

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

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

结果:

start
  set_mul
    nb  3
    set

start
  set_mul
    nb  3
    nb_set
      nb    4
      set

关于python - 使用 Lark 语法优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671691/

相关文章:

python - 如何输出运行路径而不是位置路径?

python - 为什么在绘图标签中尝试使用 LaTeX 时出现错误

c++ - boost::未排序模式的精神语法

python - 我怎样才能使这个语法明确?

python - Sphinx(适用于 Python)- 搜索栏消失

functional-programming - 在计算器语法中为括号添加优先级

haskell - haskell中的递归数据结构: prolog-like terms

python - Lark 解析器语法适用于 Earley,但不适用于 LALR

parser-generator - 如何用lark解析C++注释?

python - Keras - 用于文本分析的自动编码器