如何定义解析键值对的语法文件以生成类字典对象列表?
语法解析生成类字典对象列表的解决办法
你的问题出在当前的语法规则没有把每个键值对拆成独立的解析单元,导致所有内容被揉成了一长串字符串。
先调整语法规则,把单个键值对做成独立的规则,比如以常见的PEG类语法为例:
section = section_name ":" key_value_pair+ section_name = "Section0" key_value_pair = ID "=" String ID = [a-zA-Z0-9_]+ String = "\"" [^"]* "\""
如果是用带解析动作的工具(比如ANTLR、parsimonious这类),还要在解析阶段把每个键值对组装成字典项。比如用Python的parsimonious实现的话,代码大概是这样:
from parsimonious import Grammar, NodeVisitor # 定义语法 grammar = Grammar(""" section = section_name ":" ws key_value_pair+ section_name = "Section0" key_value_pair = id ws "=" ws string ws? id = ~"[a-zA-Z0-9_]+" string = ~'"[^"]*"' ws = ~"\s*" """) # 定义访问器来生成字典 class SectionParser(NodeVisitor): def visit_section(self, node, kids): # 提取所有键值对,组装成字典 _, _, _, kv_pairs = kids return {kv[0].text: kv[3].text.strip('"') for kv in kv_pairs} def visit_key_value_pair(self, node, kids): # 返回单个键值对的内容 return kids[0], kids[4] def generic_visit(self, node, kids): return kids or node # 测试解析 parser = SectionParser() raw_content = """ Section0: Key0 = "Val0" Key1 = "Val1" """ result = parser.visit(grammar.parse(raw_content)) print(result) # 输出: {'Key0': 'Val0', 'Key1': 'Val1'}
核心思路就是:先让语法规则能识别单独的键值对,而不是把所有内容当成一个重复的无结构片段,再通过解析逻辑把这些键值对映射成字典结构。如果是多Section的场景,只要把section规则改成可重复的,就能生成字典的列表。
内容的提问来源于stack exchange,提问作者5k1zk17
相关产品推荐
相关产品推荐

