1

我想从文本文件中只提取一些结构化模式。

例如,在下面的文本中:

   blablabla 
   foo FUNC1 ; blabliblo blu

我只想隔离'foo FUNC1;'。

我试图将云雀解析器与以下解析器一起使用

foo=Lark('''
  start:  statement*
  statement: foo 
           | anything
  anything : /.+/
  foo : "foo" ID ";"
  ID : /_?[a-z][_a-z0-9]*/i
  %import common.WS
  %import common.NEWLINE
  %ignore WS
  %ignore NEWLINE
''',
parser="lalr" ,
propagate_positions=True)

但是“任何东西”这个代号涵盖了所有内容。有没有办法让它不贪心?这样令牌'foo'可以捕获给定的模式?

4

1 回答 1

1

你可以通过优先级来解决这个问题。

对于parser="lalr",Lark 支持终端优先级。因此,您可以"foo"进入它自己的终端,然后为该终端分配比终端更高的优先级anything(具有默认优先级1):

  foo : FOO ID ";"
  FOO.2: "foo"

解析您的示例字符串然后导致:

start
  statement
    anything    blablabla 
  statement
    foo
      foo
      FUNC1
  statement
    anything    blabliblo blu

对于parser="earley",Lark 支持规则的优先级,所以你可以使用:

  foo.2 : "foo" ID ";"

解析您的示例字符串然后导致:

start
  statement
    anything    blablabla 
  statement
    foo FUNC1
  statement
    anything     blabliblo blu
于 2021-03-20T14:46:48.437 回答