1

我正在尝试解析 Java 中的嵌套文件格式。

文件格式如下所示:

head [

    A [
        property value
        property2 value
        property3 [
            ... down the rabbit hole ...
        ]
    ]

    ... more As ...

    B [
        .. just the same as A
    ]

    ... more Bs ...
]

将其解析到我的程序中的最佳/最简单的技术是什么?

  • 有限状态机?

  • 手动逐字阅读并跟踪我所在结构的哪一部分?

  • 写一个语法...?

作为旁注,我无法控制格式 - 因为我知道有人会这么说!

4

4 回答 4

2

如果语法确实是这样嵌套的,那么编写一个非常简单的自顶向下解析器将是一项微不足道的任务:您几乎没有要识别的标记,并且对于教科书递归下降解析器,嵌套结构非常方便地重复自身。

我什至不会为这么简单的事情而使用 ANTLR 或其他解析器生成器,因为学习曲线会吃掉项目的潜在好处*


*学习解析器生成器给您带来的潜在好处难以估量:如果您可以花一两天时间学习使用 ANTLR 构建解析器,那么您对结构化文本文件的看法将永远改变。

于 2013-07-19T20:57:33.627 回答
1

可以说解析这类文件的最简单方法是使用递归下降解析器(http://en.m.wikipedia.org/wiki/Recursive_descent_parser)。我想这就是您手动阅读和跟踪您找到的结构的意思。

如果您必须能够处理无限嵌套,那么有限状态机将无法工作。如果只有两个级别就足够了。

编写语法和生成解析器也可以,但是如果您以前没有这样做过或者没有时间学习如何使用这些工具,那可能就有点矫枉过正了……

于 2013-07-19T21:05:26.050 回答
1

我支持看看 Antlr 的建议。StAX 添加了类似 SAX 的事件处理。

http://www.antlr.org/wiki/display/ANTLR3/Interfacing+StAX+to+ANTLR

是的,有一个学习曲线,但是当你处理所有奇怪的情况并调试你的代码时,你可能会收支平衡——而且你的简历上会有一个新项目。

于 2013-07-19T21:03:33.423 回答
0

最快的方法是使用这样的格式,例如 JSon 或 YAML。这些格式执行此操作并受支持。

作为旁注,我无法控制格式

如果您想知道解析 Yaml 之类的东西的最佳方法,但不是,请阅读简单 Yaml 解析器的代码。

仅解析文件是不够的,您还需要触发事件或从加载的数据生成数据模型。

于 2013-07-19T20:56:56.847 回答