我试图用Java解析嵌套文件格式。
文件格式如下:
head [
A [
property value
property2 value
property3 [
... down the rabbit hole ...
]
]
... more As ...
B [
.. just the same as A
]
... more Bs ...
]
将此解析为我的程序的最佳/最简单的技术是什么?
有限状态机?
逐字逐句地手写,并跟踪我所在的结构的哪个部分?
写一个语法......?
作为旁注,我无法控制格式 - 因为我知道有人会说出来!
答案 0 :(得分:2)
如果语法确实是这样嵌套的,那么编写一个非常简单的top-down parser将是一项微不足道的任务:您只需要很少的令牌来识别,并且嵌套结构可以非常方便地为教科书重复{{3} }。
我甚至不愿意使用ANTLR或其他解析器生成器这么简单,因为学习曲线会占用项目 * 的潜在好处。
<小时/> * 学习解析器生成器的潜在好处很难被高估:如果你可以花一两天时间学习使用ANTLR构建解析器,你对结构化文本文件的看法将永远改变。
答案 1 :(得分:1)
我接下来的建议是看看Antlr。 StAX增加了类似SAX的事件处理。
http://www.antlr.org/wiki/display/ANTLR3/Interfacing+StAX+to+ANTLR
是的,有一个学习曲线,但是当你处理所有奇怪的案例并调试你的代码时,你可能会收支平衡 - 你的简历上有一个新项目。
答案 2 :(得分:1)
可以说解析这些文件的最简单方法是使用递归下降解析器(http://en.m.wikipedia.org/wiki/Recursive_descent_parser)。我想这就是你手动阅读并跟踪你找到的结构的意思。
如果必须能够处理无限制的嵌套,则有限状态机将无法工作。如果只有两个级别就足够了。
编写语法并生成解析器也可以,但如果您之前没有这样做或者没有时间学习如何使用这些工具,那么它可能有点过分......
答案 3 :(得分:0)
最快的方法是使用这样的格式,例如JSon或YAML。这些格式执行此操作并受支持。
作为旁注,我无法控制格式
如果你想知道解析像Yaml这样的东西的最佳方法,那就是阅读一个简单的Yaml解析器的代码。
仅解析文件不太可能,您还需要根据加载的数据触发事件或生成数据模型。