Lark:如何只挑选一些图案

Lark : how to pick only some patterns

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

例如,在下面的文本中:

   blablabla 
   foo FUNC1 ; blabliblo blu

我只想隔离'foo FUNC1 ;'。

我正在尝试将 lark 解析器与以下解析器一起使用

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)

但令牌 'anything' 捕获了所有。有没有办法让它不贪心?以便令牌 'foo' 可以捕获给定的模式 ?

你可以优先解决这个问题。

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

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

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

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

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

  foo.2 : "foo" ID ";"

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

start
  statement
    anything    blablabla 
  statement
    foo FUNC1
  statement
    anything     blabliblo blu