我正在尝试编写一个简单的语法来解析多行部分的文本。。我不知道该怎么做。这是我到目前为止写的语法,如果有任何帮助,我将不胜感激。
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
规则转换为您想要的规则,但由于您声称这实际上不是您的确切问题,因此我在此不再赘述。