我已经被编程自1999年以来的工作和乐趣。我想要学习新的东西,最近我一直侧重于分析,因为大部分我的工作就是阅读、整合和分析数据。我还有大量重复的任务,我认为我可以表达非常简单域特定的语言,如果开销是足够低。我有几个问题有关的主题。

  1. 我的大部分目前分析代码,不要限定一个正规语法。我一般砍的东西一起在我的语言的选择,因为这很容易,我知道如何做到这一点,我可以写这些代码非常快。它也很容易对其他人的我一起工作,以维持。有哪些优点和缺点的限定语法并产生一个真正的分析器(作为一个会做 这些代码YACC)分析东西比黑客,大多数程序使用编写的分析程序?
  2. 什么是最好的分析器代工具,用于编写基于语法分析程序用C++、Perl和红宝石?我已经看过了 这些代码 并没有发现许多关于使用ANTLRv3用C++的目标,但否则,看起来很有趣。什么其他工具,类似于这些代码,我应该读数么?
  3. 什么是典型的书籍和文章中,有人有兴趣更多地了解有关分析?课程编译器不幸的是不是我的教育,因此基本材料是非常受欢迎的。我听说伟大的事情有关 龙的书, 但还有什么是了吗?
有帮助吗?

解决方案

1., 我要说的主要优点是 维护性 --制作一个小更改的语言就意味着使一个相应的小改变文法,而不是详细黑客通过各种斑点的代码可以跟你想要什么改变的...数量更好的生产力和较小风险的错误。

在2.3., 我不能建议大大超出什么你已经发现(I主要是利用和蟒蛇 pyparsing, 和可能的评论,从经验上很多Python为中心的分析框架,但是用C++我大多是用好老 yaccbison 无论如何,我老粗糙的副本龙书--不是最新的版本,实际上是--是我保留在我身边的目的...).

其他提示

这是我的拿上你的(非常好)的问题:

  1. 我认为一个效益分析器大部分从非微不足道的情况下在那里的语法确实存在。你必须知道如何分析程序和法工作,认为这种技术,并不是每一个开发商。
  2. lex/yacc是老年人的Unix工具,可以用你作为一个C++的开发。也许野牛。
  3. ANTRL及其伴随而来的书很不错。 "编写和翻译" 已C++的例子你可能会喜欢的。

GoF解释模式是另一种技术,用于编写"小小的语言"。看看那。

让我们建立一个编译器 是一个一步步骤的教程,如何写简单的编译器。代码被写入德尔斐(Pascal),但是它的基本足够很容易地翻译成大多数其他语言。

我想有一个严肃看待元组合的基于分析(这往往还涉及词汇分析)在Haskell.我发现这是相当大开眼界;这是多么惊人很容易就可以建立一个分析器从头开始使用这种方法。它是那么容易,事实上,它往往更快地编写自己的分析器而不是尝试使用现有库。

最着名的例子可能是 秒差距 其中有一个良好 用户指南 这解释了如何使用它。有一个列表中的港口这个图书馆的其他语文(包括 C++红宝石)上列出 秒差距页Haskell wiki, 虽然我不熟悉他们,所以我不能说他们有多接近使用秒差距在Haskell.

如果你想学习如何将这些内部工作和怎么写你自己,我建议起与第8章("功能分析器")从格雷厄姆*哈顿的 编程在Haskell.一旦你理解了这一章以及(可能需要几个读数),只能设置。

在perl,分析::RecDescent模块是第一个地方开始。添加教程模块名称和谷歌应该能够找到足够的教程,可以你开始。

限定语使用负责,EBNF或类似的东西,是更容易和后你将会有一个更好的时保持它。此外,您可以找到很多例子的法定义。最后但并非最不重要的是,如果你要谈论你的语法对别人的领域,它是更好,如果你们俩都讲同一种语言(解放阵线,EBNF等)。

写你自己的分析代码就像是重新发明轮子,容易出错。它也是不可维护。当然,它可以更加灵活,而对于小的项目,它也可能是一个好的选择,但使用现有的解析发电机的需要的语法和吐出来的代码应涵盖大多数我们的需要。

C++我也建议lex/yacc.红宝石,这看起来像一个体面的选择: Coco/R(uby)

有趣的时间:我花了很多今天早上想知道关于国家机和分析程序,并试图找出我怎么可能了解更多关于他们。

对于2,你可能会来看看 Ragel (这是很好C++和红宝石).

这里有一个教程上的一个自足的(10页。), 完全的便携式编译器编译器 它可以用来设计和实施"开销低"Dsl非常迅速:

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

这个网站指导你穿过瓦尔如果选择的1964年的纸上MetaII.是的,1964年。这是惊人的。这是我学会了关于编译器 早在1970年。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top