1

我为应用程序的配置文件(纯文本和基于行 -> EOL = 一个配置)开发了自己的文件格式。这种格式没什么特别的,我这样做的唯一原因是为了学习一些东西!reader 和 writer 函数将在 C 中实现(使用 GLib,因为它应该是 UTF8 编码文件)。

所以现在,我正在考虑在 C 代码中实现这种格式的方式。我必须执行哪些步骤才能获得尽可能好的错误消息。我听说过有关 Lexer、Parser 的一些东西……但从未深入了解过。我对它们只有一个非常抽象的概念。那么,我需要采取哪些步骤来获得一个用 C 语言编写的干净的阅读器,这对于未来的更改也是可维护的?学习/思考的主题是什么?

是的,我知道:C 很痛苦,这个提议有很多不同的“性感”格式等等。我想学点东西!

干杯,格雷戈尔


附加信息

  • 阅读器/编写器/解析器(或其他任何名称)应尽可能少地依赖第三方程序/组件。围绕这个配置部分的应用程序已经使用了 GLib,所以这就是为什么 GLib 也用于 UTF8
4

3 回答 3

5

创建配置格式的一种很酷的方法是嵌入脚本语言。

这为您提供了免费的解析器,并让您可以动态生成数据或定义正在重用的变量:

考虑这些 xml 与丑陋的伪脚本语言的示例:

<InputPoints>
  <Point>
    <x>1.0</x>
    <y>1.0</y>
  </Point>
  <Point>
    <x>1.0</x>
    <y>2.0</y>
  </Point>
  <Point>
    <x>1.0</x>
    <y>3.0</y>
  </Point>
  <Point>
    <x>1.0</x>
    <y>4.0</y>
  </Point>
<InputPoint>

与:

for(i = 1; i <= 4; ++i) {
  InputPoint(1, i);
}

也许

<Username>allanballan</Username>
<Accountname>allanballan</Accountname>
<HomeDirectory>/home/allanballan</HomeDirectory>

对比

user = "allanballan";
Username = user;
Accountname = user;
HomeDirectory = "/home/"+user;

第一个示例将点列表压缩为几条语句,第二个示例显示如何使用临时变量删除大量冗余数据。

这种情况的流行语言是Lua。究竟如何将脚本语言映射到配置取决于集成商,但它真的很强大,而且它还提供免费的解析和类型检查。

于 2009-06-10T09:50:27.743 回答
1

您可能想查看libconfig源代码。它有一个轻量级的解析器,您可以将其用作起点,这可能会帮助您弄清楚您自己的格式的解析器应该是什么样子。

但是,如果您真的想了解解析器和词法分析器,那么实现一个简单的编译器可能会更好。您可以学习麻省理工学院的课程。

于 2009-06-10T09:30:08.000 回答
1

根据您想深入了解该问题的深度,您应该考虑不要手动编写解析器。您当然可以这样做,但这会复杂得多,并且向您的语言添加新功能将使您面临始终适应词法分析器和解析器代码的问题。

好消息是,有很多工具可以让您从输入及其结构的高级描述中生成这些东西。执行此操作的标准 *nix 工具是 Lex 和 Yacc(或它们的后代 Flex 和 Bison),但我想将您指向 ANTLR ( http://www.antlr.org )。它的一个很好的特性是它为许多不同的语言(C/C++ 以及 Java、Python、Ruby、C# 等)提供了后端,所以如果你想切换,学习如何使用它也会对你有所帮助以后的语言。

于 2009-06-10T09:33:59.477 回答