编写解析器和编译器的最佳编程语言是什么?

问题描述:

我需要一些资源开始(我是一个cs学生)编写解析器和编译器的最佳编程语言是什么?

+1

Dupe of http://*.com/questions/1669/learning-to-write-a-compiler许多其他许多人 – 2009-08-22 09:16:37

+0

如果这是对资源的开放式请求,他们尼尔是正确的。如果它要求比较和对比,那么它就接近“主观和议论性” – dmckee 2009-08-22 17:05:35

+0

请参见[编译器在什么程度上是最好的语言](http://*.com/问题/ 809710 /什么是最好的语言编写的编译器) – nawfal 2014-07-21 11:45:17

答案在这里可以是非常主观的。但如果你想编写一个解析器,我建议使用ANTLR。目前ANTLR支持C,C#,ActionScript,JavaScript和Java目标。根据我的经验,Java版本使用起来非常稳定,并已用于许多强大的开源项目,即DroolsHibernate

Lisp/Scheme是我们负责使用回单一的任务。

他们很善于完成任务。

虽然我曾经有过题为“在现代的Java编译器实现”一文的书,我认为专业人士仍然使用C.除了证明他们的语言可以编译本身。

是否需要用编程语言编写?或者你可以使用FlexBison

+1

我正在建议Flex和Bison。 :-) – 2009-08-22 08:05:46

+4

解析器生成器不会消除编程语言的需要。他们用特定的语言生成解析器。传统的Flex/Bison(LEX/YACC)语言是C. – Brannon 2009-08-22 08:47:59

+0

@Brannon +1以供您评论;你仍然需要一种编程语言。不过,我想补充一点,Flex/Bison或Lex/Yacc相当不合时宜。如果你已经使用了Coco/R之类的东西,并且你去了Lex/Yacc,那么你会发现自己绝望的功能,其中最重要的是超过一个。 – Imagist 2009-09-24 17:37:38

是否想为通用语言编写解析器?在这种情况下,明确推荐使用目标语言编写(和引导)。你应该吃自己的狗粮。

+1

我会说,“在许多情况下推荐”,而不是“明确推荐”。 “通用语言”有点用词不当,因为没有适合所有*任务的语言。我不会用C编写Web应用程序,我不会用Python编写操作系统。这并不是说你不能做这些事情。只是这样做不合适。如果你接受这个逻辑,那么你就有可能写一个不适合解析的通用语言,因此不应该用它来解析它自己。 – Imagist 2009-08-22 09:46:23

+1

下面是一个很好的例子:STEPS项目的* entire * JavaScript解释器只有170行的OMeta源代码,一个下午写了一个人。在Narcissus JavaScript解释器中,解析器*单独*超过1000行JavaScript,另有1000行AST访问者。所以,使用JavaScript来实现JavaScript比使用OMeta要冗长10倍。 – 2009-08-22 15:56:27

+0

但是如果你真的使用了你的解析器/编译器,你会抛出大量的错误。你真的通过在这种语言中实现它来使用它。 – Mnementh 2009-08-22 21:05:20

如果您从头开始实施编译器,大多数编程语言都可以完成该任务。 (我甚至知道使用Fortran IV和COBOL编写的编译器/解析器,尽管我不会推荐尝试这样做!)

但是,如果您尝试实现的语言甚至有一个不平凡的语法,使用词法分析器生成器和/或解析器生成器来实现前端更好。你会得到一个更快,更可靠的解析器。

因此,在此基础上,可以使用合适的编程语言,可以使用合适的编程语言。在Wikipedia上有一个页面比较了大量的解析器生成器。我没有意识到有这么多!

如果你的目标是学习解析器(和标记器)背后的技术,也许最好从头开始编写一个。你可以在大多数编程语言中做到这一点,所以你可以选择一个你感觉舒服的。

前段时间,我写了一系列博客文章,展示了用C#编写一个类似小型虚构类BASIC编程语言的解析器是多么容易。我不想在此处发送垃圾邮件,所以我不会提供直接链接,但是如果您访问博客(请参阅我的个人资料)并进入底部,可以在“我的帖子”中找到“编写分析程序”链接“-部分。

你会想看看解析器生成器。如果你是CS学生,那么你可能会想看看Dragon Book:http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools

使用C#或Java构建解析器可能是最容易的,因为您不必担心内存管理等问题,并且可以专注于语法。

一个好的C#解析器生成器是GPPG:http://plas.fit.qut.edu.au/gppg/

+0

有人可以解释为什么这是downvoted?龙书是一个很好的资源,并且c#/ java恰好遵循了这个问题的单词。虽然我认为这个问题本身很愚蠢。 – gimpf 2009-08-22 09:23:05

解析器和编译器是两个独立的问题。例如,我可能会在C编写一个编译器,但我绝不会在C中编写解析器(我会使用解析器生成器)。对于速度不是高优先级的非常简单的解析器,我可能用Perl或Python手动编码解析器,它们具有良好的文本操作功能。但对于非常基本的解析器之外的任何东西,我都会使用某种解析器生成工具。最常用的是ANTLR,Coco/RLex/Yacc以及GNU实现Flex/Bison。我的个人偏好是Coco/R,但ANTLR似乎现在更受欢迎。

如果您正在编写通用编程语言,您可能需要考虑自己编写它。这有很多好处,包括可移植性(人们只需要移植第一版本的语言)和功能演示(解析是一个难题,所以如果可以用您的语言来完成,那么这是对您的语言的证明)。如果您的语言被解释,这可能不适合性能方面的原因。