【问题标题】:Parsing custom format file in C#在 C# 中解析自定义格式文件
【发布时间】:2014-01-13 16:18:43
【问题描述】:

我需要使用 C# 解析自定义文件格式。文件格式为 Xcode 项目的 PBX 文件。没有关于格式的官方文档。但这很简单。这是一个简单的例子:

// !$*UTF8*$!
{
    archiveVersion = 1;
    classes = {
    };
    objectVersion = 46;
    objects = {

        /* Begin PBXBuildFile section */
        5143B90C1884374800F27FD8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5143B90B1884374800F27FD8 /* Foundation.framework */; };
        5143B90E1884374800F27FD8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5143B90D1884374800F27FD8 /* CoreGraphics.framework */; };
        5143B9101884374800F27FD8 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5143B90F1884374800F27FD8 /* UIKit.framework */; };
        /* End PBXBuildFile section */
    };
    rootObject = 5143B9001884374800F27FD8 /* Project object */;
}

在对象部分有一系列对象定义:对象唯一 ID,后跟其属性。您可以在此处查看 cmets。属性值也可以用引号括起来。

PBX文件的完整例子是here

现在我需要构建文件的 DOM。解决此类任务的最佳方法是什么?

【问题讨论】:

  • 你当然可以用一系列正则表达式来做到这一点
  • 这将是一个好的开始:stackoverflow.com/questions/7557273/… 当然,这取决于您的要求。该工具将用于什么?您是否期望格式非常固定(即,您是否可以始终假设objects = { 行不会在下一行写成{ 等)?如果它只是一些内部工具,您可能只需逐行阅读并以简单愚蠢的方式解析(如if (line.IndexOf("objects") != -1) ...)。
  • 定义最佳。你可以做一个语法并解析它。或者你可以逐行循环并切碎字符串,并测试特定的字符串......
  • 它不应该依赖于空格和换行符的特定位置。这是一个语法。我正在寻找解析它的指南。
  • 如果解析器可以以 .net 中 XmlReader 的工作方式使用也很酷:逐个令牌读取。

标签: c# parsing compiler-construction


【解决方案1】:

使用解析器(因为嵌套大括号正则表达式是不行的)。选择你觉得语法没问题的那个:

我猜你是新手,所以这就是我将它们分组的原因——自上而下的方法、自下而上的方法和组合方法。我个人的偏好是自下而上,数学表达式的定义对我来说感觉更自然,但在这里你不应该有那种问题。

从 2014 年 1 月 28 日开始,NLT 包括 PBXProj 文件简单阅读器。

【讨论】:

    【解决方案2】:

    我发现Sprache 项目非常适合这种类型的语法。

    对于简单的解析情况,正则表达式也足够了。

    【讨论】:

      【解决方案3】:

      我会在合适的时候使用 Regex 类,但对于您在此处显示的更多结构化数据,我会求助于 ANTLR as documented here for C#

      【讨论】:

        【解决方案4】:

        如果您需要能够匹配嵌套的大括号,正则表达式将不起作用。您可以使用像 ANTLR 这样的解析器生成器,但这种格式看起来很简单,可以编写您自己的 recursive descent 解析器。

        在我们向您展示如何编写解析器之前,我们需要知道您要输出哪种 DOM。

        【讨论】:

        • 当 ANTLR 提供类似(或更好)的性能和更高程度的可维护性时,为什么还要手动编写递归下降解析器?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多