在C#中解析自定义格式文件

时间:2014-01-13 16:18:43

标签: c# parsing compiler-construction

我需要用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 */;
}

在objects部分中有一系列对象定义:对象唯一id后跟其属性。你可以在这里看到评论。属性值也可以用引号括起来。

PBX文件的完整示例是here

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

4 个答案:

答案 0 :(得分:1)

使用解析器(因为嵌套大括号正则表达式是禁止的)。用语法选择你感觉合适的那个:

我想你是新手,所以这就是为什么我把它们分组 - 自上而下的方法,自下而上和组合的方法。我个人的偏好是自下而上,数学表达式的定义对我来说更自然,但在这里你不应该有这样的问题。

开始2014-01-28 NLT包括PBXProj文件简单阅读器。

答案 1 :(得分:0)

我发现Sprache项目对于这种类型的语法非常有用。

对于简单的解析案例,Regex也足够了。

答案 2 :(得分:0)

我在适当的时候使用Regex类,但是对于像你在这​​里展示的更多结构化数据,我会转向ANTLR as documented here for C#

答案 3 :(得分:0)

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

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