使用Lark解析粗体文本的示例失效,问题出在哪里?
问题原因与解决方案
问题根源
- 优先级设置颠倒:Lark 中规则的优先级数字越小,优先级越高。你给
text标记了.1,bold_text标记了.2,导致text优先级更高,解析器会优先尝试匹配它。 - text规则过于宽泛:
/.+/是贪婪正则,会直接把整个**test**字符串完整匹配为text,完全不给bold_text留下匹配的机会,因此不会触发歧义提示。
修正方案
方案一:调整优先级+限制text匹配范围
from lark import Lark grammar = r''' start: bold_text | text bold_text.1: "**" text "**" # 让bold_text优先级高于text text.2: /(?!\*\*).+/s # 匹配不以**开头的任意内容,s模式支持换行匹配 ''' parser = Lark(grammar, start="start", debug=True, ambiguity="explicit") text = r"""**test**""" parsed = parser.parse(text) print(parsed.pretty())
方案二:利用PEG顺序性优化规则
PEG语法会按顺序尝试规则,把bold_text放在前面,解析器会优先尝试匹配它:
from lark import Lark grammar = r''' start: bold_text | text bold_text: "**" text "**" # 匹配不包含连续**的文本,支持单个* text: /(?:(?!\*\*).)+/s ''' parser = Lark(grammar, start="start", debug=True, ambiguity="explicit") text = r"""**test**""" parsed = parser.parse(text) print(parsed.pretty())
两种方案都能正确将**test**解析为bold_text,输出符合预期的树形结构。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

