【问题标题】:Will ANTLR Help? Different Suggestion?ANTLR 有帮助吗?不同的建议?
【发布时间】:2009-11-20 04:20:14
【问题描述】:

在我深入研究 ANTLR(因为 it is apparently not for the faint of heart)之前,我只是想确保我对它的使用做出了正确的决定。

我想创建一个语法,该语法将在带有预定义标签的文本文件中进行解析,以便我可以在我的应用程序中填充值。 (文本文件是由另一个应用程序生成的。)所以,本质上,我希望能够解析这样的内容:

Name: TheFileName
Values: 5 3 1 6 1 3
Other Values: 5 3 1 5 1

在我的应用程序中,TheFileName 存储为一个字符串,并且两组值都存储到一个数组中。 (这只是一个示例,文件要复杂得多。)无论如何,我是否至少在使用 ANTLR 时走上了正确的道路?还有其他建议吗?

编辑 文件由用户创建,它们通过标签定义区域。所以,它可能看起来像这样。

Name: <string>TheFileName</string>
Values: <array>5 3 1 6 1 3</array>
Important Value: <double>3.45</double>

类似的东西。

【问题讨论】:

    标签: parsing antlr antlrworks


    【解决方案1】:

    基本问题是如何文件更复杂?是基本相同,有一个标签、一个冒号和一个或多个值,还是其他行的基本 结构 更复杂?如果基本相同,则识别和读取数据的代码非常简单,解析器生成器不太可能获得太多收益。如果其他行的结构大不相同,则主要取决于它们的不同之处。

    编辑:根据您添加的内容,我会进一步(微小)一步,将您的文件格式化为 XML。然后,您可以使用现有的 XML 解析器(等)来读取文件、提取数据、验证它们是否符合指定的格式等。

    【讨论】:

    • 良好的反应。要回答您的问题,我无法预测文件会有所不同。基本上,我想提供一系列可以放置到文件模板中的各种标签,并且我将使用该模板来解析与该模板匹配的任何其他文件。这将有助于将数据快速带入系统。但是,除了标签之外,我不太关心它们之间的内容。
    【解决方案2】:

    这取决于您对正在解析的文件格式的控制。如果您无法控制,那么诸如 ANTLR 之类的解析器生成器可能很有价值。 (我们自己为我们无法控制的 FORTRAN 输出文件执行此操作)。这是一项相当多的工作,但我们现在已经掌握了基本的 ANTLR 词法分析器/解析器策略,并且它开始运作良好。

    但是,如果您对格式有部分或完全控制权,则可以根据需要使用尽可能多的标记来创建它。我总是会在 XML 中创建这样的文件,因为有很多工具可以处理它(不仅是解析,还有 XPath、数据库等)。一般来说,我们使用 ANTLR 将半结构化信息解析为 XML。

    【讨论】:

      【解决方案3】:

      如果您不需要自定义格式,那么您应该考虑使用现有格式,例如 JSON 或 XML,有可用的解析器。

      即使您确实需要自定义格式,您最好设计一个非常简单的格式,这样您就不需要完整的语法来解析它。从头开始设计自己的脚本语法并把它做好是一项艰巨的工作。

      编写语法解析器也很有趣,所以如果你很好奇,那么你应该去做。但我不建议随意将学习练习与实际工作代码混为一谈。

      【讨论】:

        【解决方案4】:

        好吧,如果它“复杂得多”,那么,是的,解析器生成器会很有帮助。但是,由于您没有显示文件的实际格式,所以任何人都知道什么是适合这项工作的工具?

        【讨论】:

        • 我没有显示任何其他文件的原因是因为这些文件是用户定义的。我已经更新以更好地描述问题。
        【解决方案5】:

        我使用免费的GOLD Parser Builder,它非常易于使用,并且可以生成许多不同语言的解析器本身。也有解析此类表达式的示例。

        【讨论】:

          【解决方案6】:

          如果文件的格式是由用户决定的,你甚至可以为它定义一个语法吗?

          似乎您最多只需要一个词法分析器。仅将 ANTLR 用于词法分析器部分是可能的,但似乎有点矫枉过正。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-06
            • 2011-02-10
            • 1970-01-01
            • 1970-01-01
            • 2020-05-20
            • 1970-01-01
            • 2014-09-07
            • 1970-01-01
            相关资源
            最近更新 更多