用 lark 语法识别多行部分
recognizing multi-line sections with lark grammar
我正在尝试编写一个简单的语法来解析包含多行部分的文本..
我不知道该怎么做。
这是我到目前为止编写的语法 - 如果您能在这里提供任何帮助,我们将不胜感激。
ps:我意识到百灵鸟对这个问题有点矫枉过正,但这只是我试图解析的一个非常简化的版本。
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
规则转换成您想要的,但由于您声称这实际上不是您的确切问题,所以我不会在这里费心。
我正在尝试编写一个简单的语法来解析包含多行部分的文本.. 我不知道该怎么做。 这是我到目前为止编写的语法 - 如果您能在这里提供任何帮助,我们将不胜感激。
ps:我意识到百灵鸟对这个问题有点矫枉过正,但这只是我试图解析的一个非常简化的版本。
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
规则转换成您想要的,但由于您声称这实际上不是您的确切问题,所以我不会在这里费心。