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