2011-04-28 81 views
3

具有以下层次输入的文本数据(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)用什么方法你建议保持源代码节点的“类型”? 我目前看起来相当棘手(实际上我不知道如何去做)。例如,有一些“版本”类型的节点需要一些“单词”作为参数。还知道 节点“版本”仅作为层次的根分支的一部分存在。另一个例子可能是有几个“描述”节点以“单词”或“字符串 ”作为它们的参数。“描述”节点属于层次结构的每个节点。如 如何应对这类问题?

说明解释的目的:产生的效用将存储在文本数据文件非常相似 到我上面提供和用户将查询/修改/插入/数据删除对 维护一些例如“版本”的一些数据(例如待办事项列表或任何其他内容)作为例子,考虑它是一种简单的数据库而不是配置文件或类似的东西(对不起,我的英文),想法是提供一个CLI,b)命令-line工具,c)允许 用户编辑其编辑中的数据或者,如果不想使用)或b)...

至少有一些“一般”的建议是高度赞赏。

回答

2

我会用一个递归下降解析器带有某种哈希表的组合或映射用于数据存储。从外观上看,它与JSON非常相似,但并不完全相同。字符串,数字,列表和字典似乎被支持。一个简单的“对象”类型的类将存储这个技巧(类似于JavaScript)。

用于管理数据结构的历史,你可以实现它类似于OMeta世界(参见:http://www.vpri.org/pdf/rn2008001_worlds.pdf)。它利用原型对象模型来管理范围和历史。

+0

谢谢你的回答。这正是我想在这种情况下获得的答案。完善。 – mjf 2011-05-06 06:15:42

+0

太好了。如果您觉得这可以被接受为足以显示为“已接受”的答案,请点击复选标记。 – jsherer 2011-05-06 17:02:50

0

你可以用JSON解析器开始如json parser并相应修改。

+0

不错。谢谢。但对我的问题,这是相当“特定”的答案。我想获得更多的一般答案,并自己写出来学习一些东西。我可以使用json解析器,简化并弯曲它来满足我的需求,但这不是我所要求的。我想得到一些更一般的答案,比如“你可以用这个和那个算法来做”和“你可以使用这样和那样的数据结构最好”等等。不管怎样,谢谢。 – mjf 2011-05-01 19:26:19