Parsing 了解有关解析的更多信息

Parsing 了解有关解析的更多信息,parsing,dsl,Parsing,Dsl,我从1999年开始为工作和娱乐编程。我想学习新东西,最近我一直专注于解析,因为我的大部分工作是阅读、整合和分析数据。我还有大量重复的任务,如果开销足够低,我想我可以用非常简单的领域特定语言来表达。关于这个问题,我有几个问题 我目前的大多数解析代码都没有定义形式语法。我通常用我选择的语言把一些东西拼凑在一起,因为这很简单,我知道怎么做,而且我可以很快地编写代码。与我一起工作的其他人也很容易维护它。与大多数程序员用来编写解析器的黑客相比,定义语法并生成真正的解析器(就像使用or一样)来解析东西有哪些

我从1999年开始为工作和娱乐编程。我想学习新东西,最近我一直专注于解析,因为我的大部分工作是阅读、整合和分析数据。我还有大量重复的任务,如果开销足够低,我想我可以用非常简单的领域特定语言来表达。关于这个问题,我有几个问题

  • 我目前的大多数解析代码都没有定义形式语法。我通常用我选择的语言把一些东西拼凑在一起,因为这很简单,我知道怎么做,而且我可以很快地编写代码。与我一起工作的其他人也很容易维护它。与大多数程序员用来编写解析器的黑客相比,定义语法并生成真正的解析器(就像使用or一样)来解析东西有哪些优点和缺点 在C++、Perl和Ruby中编写语法分析器的最佳解析器生成工具是什么?我已经看过了,并没有发现很多关于使用C++目标的ANTLRV3,但其他方面看起来很有趣。我应该阅读哪些与ANTLR类似的其他工具
  • 有人想了解更多有关解析的规范书籍和文章有哪些?不幸的是,编译器课程并不是我所受教育的一部分,所以基础材料非常受欢迎。我听说了很多关于这部电影的好消息,但是还有什么其他的呢
    是一个关于如何编写简单编译器的分步教程。代码是用Delphi(Pascal)编写的,但它足够基本,可以轻松地翻译成大多数其他语言。

    在perl中,Parse::RecDescent模块是第一个开始的地方。将教程添加到模块名称中,谷歌应该能够找到大量教程,帮助您入门。

    以下是我对您(非常好)问题的看法:

  • 我认为解析器从语法实际存在的非平凡情况中获益最大。您必须了解解析器和语法是如何工作的,才能想到这种技术,而不是每个开发人员都知道
  • LEX/YACC是旧的UNIX工具,对于C++开发人员来说可能是有用的。也许还有野牛
  • 安特尔和它的随从书都很好。有C++的例子,你可能喜欢。

  • GoF解释器模式是编写“小语言”的另一种技术。看看这一点。

    在1.上,我想说的主要优点是可维护性——对语言做一点小小的更改只意味着对语法做一个相应的小更改,而不是对代码中可能与您想要更改的内容有关的各个点进行细微的修改。。。数量级—生产效率更高,bug风险更小


    二号。第三,除了你已经发现的,我没什么好建议的(我主要使用Python和 pyPrase),可以从许多Python为中心的解析框架中进行注释,但是对于C++,我大多使用了好的旧代码“YACC 或<代码> BISEON/COD>”,而我的老旧的“龙书”——不是最新版本——实际上是我在我身边的目的…….

    使用BNF、EBNF或类似工具定义语法更容易,以后您将有更好的时间维护它。此外,您可以找到许多语法定义的示例。最后但并非最不重要的一点是,如果您要在现场与其他人谈论您的语法,最好双方使用相同的语言(BNF、EBNF等)

    编写自己的解析代码就像重新发明轮子一样,容易出错。它的可维护性也较低。当然,它可以更灵活,对于小型项目来说,它也可能是一个不错的选择,但使用现有的解析器生成器,该生成器可以提取语法并输出代码,应该可以满足我们的大部分需求


    对于C++,我也会建议Lex/YACC。对于Ruby来说,这看起来是个不错的选择:

    < P>有趣的时序:我花了很多时间早上想了解状态机和解析器,并试图找出我如何能够更多地了解它们。


    2,你可以看一下(这对C++和露比很有好处)。

    < P>我会认真研究基于单子的组合式句法分析(通常也涉及词法分析)。在Haskell中,我发现它非常令人大开眼界;令人惊讶的是,使用此方法可以轻松地从头开始构建解析器。事实上,编写自己的解析器通常比尝试使用现有库更快

    最著名的例子可能是其中有一个很好的例子来解释如何使用它。上列出了该库到其他语言(包括和)的端口列表,尽管我对它们不熟悉,因此我不能说它们离在Haskell中使用Parsec有多近


    如果您想了解这些函数如何在内部工作以及如何编写自己的函数,我建议您从Graham Hutton的第8章(“函数解析器”)开始。一旦您理解了这一章(可能需要阅读几篇),您就可以开始了。

    这是一个关于独立函数的教程(10页!),完全可移植的编译器 可用于快速设计和实现“低开销”DSL:

    本网站将带您浏览Val Schorre 1964年关于MetaII的论文。 是的,1964年。这太神奇了。这就是我学习编译器的方式
    回到1970年。

    有趣的是,我本来打算推荐完全相同的东西,但记不起它叫什么了。+1我忘了在问题中提到我昨晚花了一个晚上在一台机器上读你的心思。:)谢谢你的建议,我一定会看的!