Parsing,我该从哪里学习?

18

我被分配任务将一种语言翻译成另一种语言。源语言过于灵活(复杂),无法使用正则表达式进行简单的逐行处理。我应该去哪里学习有关词法分析器和解析器的知识?

12个回答

13
如果你想对这个主题产生“情感上”的共鸣,可以购买一本 "The Dragon Book"。通常在编译器设计课程中使用,它肯定能满足你“了解更多关于词法分析和解析器”以及其他有趣的内容的需求!IMH(umble)O,建议你买一版旧一点的书,这样可以满足你的信息需求,同时也能省下一大笔钱。

Matt,有三个版本,请在你建议的版本中添加ISBN,或者改进你的评论并提供所有书籍的ISBN,并简要介绍一下每本书。 - Ostati
真的吗,@Ostati?我明确地说要让自己省点钱,买一个旧版本……或者不省钱,买最新版。 - Matt Cummings
Matt,我花了一些时间才找到哪个版本是哪个。但是有了你的答案(顺便说一下,我点了赞),ISBN……无论如何,我拿到了这本书并开始了我的旅程。谢谢。 - Ostati

8

试试ANTLR

ANTLR,全称为 ANother Tool for Language Recognition,是一种语言工具,提供了一个框架来构建包含多种目标语言的文法描述中动作的识别器、解释器、编译器和翻译器。

还有一本可以参考。

alt text


5

2
许多人推荐读书。对于许多人来说,这些在有结构的环境中完成作业和截止日期等更加有用。即使没有这样的环境,以不同的方式呈现材料也可以极大地帮助。
(a) 你考虑过去一所拥有良好计算机科学课程的学校吗?
(b) 有很多在线讲座,例如MIT的开放式课程。他们的EE/CS部分有许多与解析有关的课程,虽然我看不到有任何关于解析本身的内容。它通常是作为第一门理论课程之一介绍的,因为语言分类和自动机是计算机科学理论的核心。

+1 for MIT的OCW,我经常用它来学数学。由于某种原因,按照我的时间表上课比早上6:30起床要好得多。 - Shawn

2

我最近一直在使用PLY,这是Python中lex和yacc的实现。它很容易入门,并且文档中有一些简单的示例。

解析可能很快变成一个非常技术性的话题,如果您使用像PLY这样的解析器生成器,您可能不需要了解所有解析算法的细节。


1

另一本值得考虑的教材是编程语言实践。我更喜欢它而不是龙书,但你的看法可能不同。

如果你正在使用Perl,另一个要考虑的工具是Parse::RecDescent

如果你只需要进行一次翻译,并且对编译器技术一无所知,我建议你尽可能地进行一些相当简单的翻译,然后手动修复它。是的,这是很多工作。但这比学习一个复杂的主题并为一个工作编写正确的解决方案要少得多。话虽如此,你仍然应该学习这个主题,但不要让不了解它成为完成当前项目的障碍。


1
我发现这个网站很有帮助:

Lex and YACC primer/HOWTO

第一次使用lex/yacc是为了一个相对简单的项目。这个教程就足够了。当我后来处理更复杂的项目时,从这个教程和一个简单的项目中获得的熟悉度使我能够构建出更高级的东西。

1

在上了(相当)多的编译器课程后,我使用过The Dragon BookC&T这两本书。我认为C&T更好地让编译器构建易于理解。不是贬低The Dragon Book,但我认为C&T是一本更实用的书。

此外,如果你喜欢用Java编写代码,我推荐使用JFlexBYACC/J来进行词法分析和语法分析。


1

解析技术 - 实用指南 作者:Dick Grune 和 Ceriel J.H. Jacobs

这本书(PDF 免费提供)详细介绍了不同的解析技术/算法。如果你真的想要理解不同的解析算法,我认为这是比《龙书》更好的参考资料(因为《解析技术》完全专注于解析,而《龙书》仅将解析作为编译器构建过程中的一个重要部分)。


我已经修复了链接:第一版实际的PDF可以在这里下载:http://dickgrune.com/Books/PTAPG_1st_Edition/BookBody.pdf;该书的新版本和更广泛的版本现在也可以在亚马逊上获得。 - Gio

1
如果您喜欢基于Java的工具,Java编译器编译器(JavaCC)是一个很好的解析器/扫描器。它是基于配置文件驱动的,并将生成Java代码,您可以将其包含在程序中。虽然我已经有几年没有使用过它了,所以我不确定当前版本如何。您可以在此处了解更多信息:https://javacc.dev.java.net/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接