用lark语法识别多行段

  • 本文关键字:识别 lark 语法 lark-parser
  • 更新时间 :
  • 英文 :


我正在尝试编写一个简单的语法来解析多行部分的文本。。我不知道该怎么做。这是我到目前为止写的语法,如果有任何帮助,我将不胜感激。

ps:我意识到lark在这个问题上做得太过火了,但这只是我试图解析的一个非常简化的版本。

from unittest import TestCase
from lark import Lark
text = '''
[section 1]
line 1.1
line 1.2
[section 2]
line 2.1
'''
class TestLexer(TestCase):
def test_basic(self):
p = Lark(r"""
_LB: "["
_RB: "]"
_NL: /n/+
name: /[^]]+/
content: /.+/s
section: _NL* _LB name _RB _NL* content
doc: section*
""", parser='lalr', start='doc')

parsed = p.parse(text)

问题是,content正则表达式可以在任何长度的任何地方匹配,这意味着语法的其余部分都无法正常工作。相反,你应该将终端限制在一条线路上,并给予它比其他线路更低的优先级

p = Lark(r"""
_NL: /n/+
name: /[^]]+/
content: (ANY_LINE _NL)+
ANY_LINE.-1: /.+/
section: _NL* "[" name "]" _NL* content
doc: section*
""", parser='lalr', start='doc')

您现在可能需要一些额外的工作来将content规则转换为您想要的规则,但由于您声称这实际上不是您的确切问题,因此我在此不再赘述。

最新更新