Parsing 百灵鸟:如何只挑选一些图案

Parsing 百灵鸟:如何只挑选一些图案,parsing,text-parsing,lark-parser,Parsing,Text Parsing,Lark Parser,我只想从文本文件中提取一些结构化模式 例如,在下面的文本中: blablabla foo FUNC1 ; blabliblo blu 我只想分离“foo FUNC1;” 我试图将lark解析器与以下解析器一起使用 foo=Lark(''' start: statement* statement: foo | anything anything : /.+/ foo : "foo" ID ";"

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

例如,在下面的文本中:

   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)

但标记“任何东西”都能抓住一切。有没有办法让它不贪婪?这样令牌“foo”就可以捕获给定的模式了?

您可以使用优先级来解决这个问题

对于
parser=“lalr”
,Lark支持终端上的优先级。因此,您可以将
“foo”
移动到其自己的终端中,然后为该终端分配比
任何东西
终端(具有默认优先级
1
)更高的优先级:

分析示例字符串后,会产生以下结果:

start
  statement
    anything    blablabla 
  statement
    foo
      foo
      FUNC1
  statement
    anything    blabliblo blu
start
  statement
    anything    blablabla 
  statement
    foo FUNC1
  statement
    anything     blabliblo blu
对于
parser=“earley”
,Lark支持规则优先级,因此您可以使用:

  foo.2 : "foo" ID ";"
分析示例字符串后,会产生以下结果:

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