【发布时间】: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