代码之家  ›  专栏  ›  技术社区  ›  James Thompson

了解有关解析的更多信息

  •  9
  • James Thompson  · 技术社区  · 16 年前

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

    1. 我目前的大多数分析代码都没有定义正式语法。我通常用我选择的语言把一些东西拼凑在一起,因为这很容易,我知道如何做,而且我可以很快地编写代码。对我工作的其他人来说,维护起来也很容易。定义语法和生成真正的解析器有哪些优点和缺点 ANTLR YACC )与大多数程序员用来编写解析器的黑客相比,解析东西?
    2. 在C++、perl和Ruby中编写语法分析器的最佳解析器生成工具是什么?我看过 安特尔 而且还没有找到关于使用C++目标的ANTLRV3,但是其他看起来很有趣。其他类似于Antlr的工具是什么?
    3. 有兴趣了解更多解析的规范书籍和文章是什么?不幸的是,编纂课程并不是我所受教育的一部分,所以基础材料非常受欢迎。我听说了很多关于 Dragon Book 但是还有什么?
    8 回复  |  直到 16 年前
        1
  •  4
  •   Alex Martelli    16 年前

    1.我想说的主要优势是 维修性 --对语言做一点小小的改变只意味着对语法做一个相应的小小的改变,而不是对代码中可能与你想要的改变有关的各个点进行细微的修改…数量级:生产效率更高,错误风险更小。

    2。3.除了你已经发现的以外,我不能提出太多建议(我主要使用python和 pyparsing 并且可以从许多Python为中心的解析框架中获得经验,但是对于C++,我大多使用好的旧的框架。 yacc bison 不管怎样,我那本粗糙的龙书——实际上不是最新的版本——是我为这个目的而保存在身边的所有东西……)。

        2
  •  4
  •   duffymo    16 年前

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

    1. 我认为解析器从语法实际存在的非平凡情况中获益最多。您必须知道解析器和语法是如何工作的,才能想到这种技术,而不是每个开发人员都知道。
    2. Lex/YACC是旧的UNIX工具,可以作为C++开发人员使用。也许野牛也是。
    3. 安特尔和它的随从书都很好。 "Writing Compilers and Interpreters" 有C++的例子,你可能喜欢。

    gof解释器模式是编写“小语言”的另一种技术。看看那个。

        3
  •  2
  •   Chris R. Timmons    16 年前

    Let's Build A Compiler 是关于如何编写简单编译器的逐步教程。代码是用delphi(pascal)编写的,但它足够基本,可以轻松地翻译成大多数其他语言。

        4
  •  2
  •   cjs    16 年前

    我将认真研究haskell中基于一元组合的解析(通常也处理词汇分析)。我发现它让人大开眼界;使用这个方法从头开始构建解析器是多么的容易。实际上,编写自己的解析器比使用现有的库要快得多,这是非常简单的。

    最著名的例子可能是 Parsec 它有一个好的 user guide 这就解释了如何使用它。此库有到其他语言的端口列表(包括 C++ Ruby 列在 Parsec page of the Haskell wiki 尽管我不熟悉它们,所以我不能说它们与在Haskell中使用Parsec有多接近。

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

        5
  •  1
  •   Marius Kjeldahl    16 年前

    在Perl中,Parse::RecDescent模块是第一个开始的地方。将教程添加到模块名中,Google应该能够找到很多教程来帮助您开始学习。

        6
  •  1
  •   Petros    16 年前

    使用bnf、ebnf或类似的东西定义语法更容易,以后您将有更好的时间来维护它。此外,您还可以找到许多语法定义的示例。最后但同样重要的是,如果你想和其他人讨论你的语法,最好是你都说同一种语言(bnf,ebnf等)。

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

    对于C++,我也会建议LEX/YACC。对于Ruby来说,这看起来是一个不错的选择: Coco/R(uby)

        7
  •  1
  •   Telemachus MrJames    16 年前

    有趣的时机:今天早上我花了很多时间想知道状态机和解析器,并试图弄清楚我如何能更多地了解它们。

    第二,你可以看看 Ragel (它对C++和露比有好处)。

        8
  •  1
  •   Ira Baxter    16 年前

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

    http://www.bayfronttechnologies.com/mc_tutorial.html

    这个网站会带你浏览瓦尔·斯科雷1964年发表的关于MetaII的论文。 是的,1964。这太神奇了。这就是我学习编译器的方法 回到1970。