2014-01-13 35 views
3

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

// !$*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后跟其属性。你可以在这里看到评论。属性值也可以用引号引起来。

PBX文件的完整示例是here

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

+1

你当然可以做到这一点,与一系列正则表达式的 –

+1

这将是一个很好的开始:http://stackoverflow.com/questions/7557273/tutorial-or-guide-for-scripting-xcode-build-phases 当然,这取决于你的要求。什么是工具将用于?你是否期望格式非常固定(即,你是否总是可以假定'objects = {'这行不会在下一行用'{'写成)?如果它只是一些内部工具,那么你可能会简单地逐行阅读并以一种简单的方式解析(比如'if(line.IndexOf(“objects”)!= -1)...')。 – Luaan

+1

定义最佳。你可以做一个语法并解析它。或者你可以逐行循环并切断字符串,然后测试特定的字符串... –

回答

1

使用解析器(由于嵌套大括号正则表达式是不可行的)。选择一个你觉得OK语法的一个:

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

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

0

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

对于简单的解析情况正则表达式的也可以。

0

我使用的正则表达式类适用时,但对于更多的结构化数据,如你在这里所示,我会转向ANTLR as documented here for C#

0

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

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

+0

为什么当ANTLR提供类似(或更好)的性能以及更高的可维护性时,为什么手动编写递归下降解析器? –