具有以下分层文本数据输入(事实上类似JunOS)我需要将其解析为一些合适的数据结构 执行查询以获取树的一些用户指定的分支,然后将其线性化(?)到我可以用来让用户更改/插入/删除等的某种映射,然后将其作为树写回输出文件再次(将原始数据存储在“版本”文件中以允许以后的“历史记录”或“回滚”操作 - 如前所述的完整操作集。)
version 1.0;
description "Example data";
weights {
weight low {
value 1;
description Forgetable;
}
weight medium {
value 2;
description Important;
}
weight high {
value 3;
description Critical;
}
}
tags {
tag foo {
description "Some foo";
}
tag bar {
description "Some bar";
}
tag baz {
description "Some baz";
}
}
tag-sets {
tag-set foo\ bar {
tag [ foo bar ];
description Foo\ and\ bar;
}
tag-set "foo bar baz" {
tag-set "foo bar";
tag baz;
description "Foo, bar and baz";
}
}
问题:
1)哪种数据结构最适合输入?你建议使用什么C结构?
2)我不想使用yacc / lex来解析它(不必要的额外步骤和复杂的协作工作,而不是每个人 - 甚至我 - 喜欢/知道使用这些工具) - 什么解析方法最容易实现这种解析问题?
3)您建议在源代码中维护节点的“类型”是什么方法?这似乎很棘手 我此刻(实际上我还不知道该怎么做)。例如,有一些类型为“version”的节点需要一些“单词”作为它的参数。众所周知 节点“version”仅作为层次结构的根分支的一部分存在。另一个例子可能是有几个“描述”节点采用“单词”或“字符串” 作为他们的论点。 “描述”节点属于层次结构的每个节点。等等。 如何应对这类问题?
注意说明目的:生成的实用程序将“版本”存储在文本数据文件中的一些数据非常相似 我在上面提供的示例中,用户将查询/更改/插入/删除数据 保持某种特定信息(例如,待办事项清单或其他任何东西,作为一个例子)。认为它是一种简单的数据库而不是配置文件或类似的东西(对不起我的英语)。我们的想法是提供a)CLI,b)命令行工具,c)允许 用户在编辑器中编辑数据,如果不想使用a)或b)......
至少一些“一般”建议值得高度赞赏。
答案 0 :(得分:2)
我会使用递归下降解析器与某种散列表或映射相结合来进行数据存储。从它的外观来看,它非常类似于JSON,但并不完全相同。字符串,数字,列表和字典似乎得到支持。一个简单的“对象”类型类可以用来存储它(类似于javascript)。
为了管理数据结构的历史,你可以实现它类似于OMeta世界(参见:http://www.vpri.org/pdf/rn2008001_worlds.pdf)。它利用原型对象模型来管理范围和历史。
答案 1 :(得分:0)
您可以从json parser等json解析器开始,然后进行相应的修改。