【发布时间】:2008-08-29 06:57:20
【问题描述】:
我的工作是将一种语言“翻译”成另一种语言。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。在哪里可以了解有关词法分析和解析器的更多信息?
【问题讨论】:
我的工作是将一种语言“翻译”成另一种语言。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。在哪里可以了解有关词法分析和解析器的更多信息?
【问题讨论】:
如果您想对主题“感性”,请获取“The Dragon Book”的副本。 通常是编译器设计课程中的文本。它肯定会满足您“了解更多关于词法分析和解析器的知识”以及一堆其他有趣的东西!
IMH(umble)O,给自己留一条胳膊和/或一条腿,买一个旧版本——它会满足你的信息需求。
【讨论】:
Niklaus Wirth 的书“编译器构造”(以免费 PDF 格式提供) http://www.google.com/search?q=wirth+compiler+construction
【讨论】:
我最近一直在使用PLY,它是 Python 中 lex 和 yacc 的实现。它很容易上手,文档中有一些简单的示例。
解析很快就会成为一个技术性很强的话题,如果您使用像 PLY 这样的解析器构建器,您可能不需要了解解析算法的所有细节。
【讨论】:
很多人都推荐过书。对于许多人来说,这些在具有分配和截止日期等的结构化环境中更有用。即使没有,以不同的方式呈现材料也会有很大帮助。
(a) 您是否考虑过去一所提供不错的 CS 课程的学校?
(b) 有很多在线讲座,例如MIT's Open Courseware。他们的EE/CS section 有许多涉及解析的课程,尽管我看不到任何关于解析本身的课程。它通常作为最早的理论课程之一引入,因为语言分类和自动机是大部分 CS 理论的核心。
【讨论】:
如果您更喜欢基于 Java 的工具,Java Compiler Compiler JavaCC 是一个不错的解析器/扫描器。它是由配置文件驱动的,并且会生成可以包含在程序中的 java 代码。不过我几年没用过,所以我不确定当前版本如何。你可以在这里找到更多信息:https://javacc.dev.java.net/
【讨论】:
Lexing/Parsing + typecheck + code generation 是一个很棒的 CS 练习,我会向任何想要坚实基础的人推荐它,所以我完全支持 Dragon Book
【讨论】:
我发现这个网站很有帮助:
我第一次使用 lex/yacc 是为了一个相对简单的项目。这个教程是我真正需要的。当我后来处理更复杂的项目时,我对本教程的熟悉和一个简单的项目让我能够构建一些更奇特的东西。
【讨论】:
在学习了(相当多)一些编译器类之后,我同时使用了The Dragon Book 和C&T。我认为 C&T 在使编译器结构易于理解方面做得更好。不要从 The Dragon Book 中拿走任何东西,但我认为 C&T 是一本实用得多的书。
【讨论】:
另一个需要考虑的教科书是Programming Language Pragmatics。我更喜欢它而不是龙书,但是 YMMV。
如果您使用 Perl,另一个需要考虑的工具是 Parse::RecDescent。
如果您只需要进行一次翻译并且对编译器技术一无所知,我建议您尽可能使用一些相当简单的翻译,然后手动修复它。是的,这是很多工作。但这比学习一门复杂的学科并为一项工作编写正确的解决方案要少得多。也就是说,您仍然应该学习该主题,但不要让不知道它成为您完成当前项目的障碍。
【讨论】:
Parsing Techniques - A Practical Guide 作者:Dick Grune 和 Ceriel J.H.雅各布斯
这本书(以 PDF 格式免费提供)对不同的解析技术/算法进行了广泛的概述。如果你真的想了解不同的解析算法,这个 IMO 是比 Dragon Book 更好的参考(因为 Parsing Techniques 完全专注于解析,而 Dragon Book 仅将解析作为编译器构建过程的一个 - 虽然很重要 - 一部分) .
【讨论】:
flex 和 bison 是新的 lex 和 yacc。 BNF 的语法经常被嘲笑为有点迟钝。出于这个原因,有些人已经转向 ANTLR 和 Ragel。
如果您不做太多翻译,您可以使用 Perl 或 Ruby 的多行正则表达式一次性完成。为现有语言编写兼容的 BNF 语法并不是一件容易的事。
另一方面,如果任何给定语言的 .l 和 .y 文件可作为开源文件使用,则完全可以利用它们。然后,您可以从现有的解析树构造新代码。
【讨论】: