我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法,源代码太灵活(复杂)。我在哪里可以了解有关词法分析和解析器的更多信息?
答案 0 :(得分:12)
如果您想对主题感到“情绪化”,请选择“The Dragon Book”的副本。 通常编译器设计课程中的文本。它肯定会满足您的需求“了解有关词法分析和解析器的更多信息”以及其他一些有趣的东西!
IMH(umble)O,保存自己的手臂和/或腿并购买旧版本 - 它将满足您的信息需求。
答案 1 :(得分:8)
答案 2 :(得分:5)
Niklaus Wirth的书“编译器构造”(以免费PDF格式提供) http://www.google.com/search?q=wirth+compiler+construction
答案 3 :(得分:2)
我最近一直在使用PLY,它是Python中lex和yacc的实现。开始使用它很容易,文档中有一些简单的例子。
解析可以很快成为一个非常技术性的主题,如果你使用像PLY这样的解析器构建器,你会发现你可能不需要知道解析算法的所有细节。
答案 4 :(得分:2)
很多人推荐书籍。对于许多人来说,这些在具有分配和截止日期等的结构化环境中更有用。即使不是,以不同的方式呈现材料也会有很大帮助。
(a)您是否考虑过去一所拥有体面的CS课程的学校? (b)有许多在线讲座,例如MIT's Open Courseware。他们的EE/CS section有许多涉及解析的课程,但我看不到解析本身。它通常被引入作为语言分类的第一个理论课程之一,自动机是CS理论的核心。
答案 5 :(得分:1)
如果您更喜欢基于Java的工具,Java Compiler Compiler,JavaCC,是一个很好的解析器/扫描器。它是配置文件驱动的,并将生成您可以包含在程序中的Java代码。我有几年没用过它,所以我不确定当前版本是怎么回事。您可以在此处找到更多信息:https://javacc.dev.java.net/
答案 6 :(得分:1)
如果你没有做太多的翻译,你可以选择使用Perl或Ruby的多行正则表达式。为现有语言编写兼容的BNF语法不是一项轻率的任务。
另一方面,完全可以利用任何给定语言的.l和.y文件(如果它们作为开源提供)。然后,您可以从现有的解析树构造新代码。
答案 7 :(得分:1)
Lexing / Parsing + typecheck +代码生成是一个伟大的CS练习我会推荐给任何想要坚实基础的人,所以我都是为了龙书
答案 8 :(得分:1)
另一本要考虑的教科书是Programming Language Pragmatics。我比龙书更喜欢它,但YMMV。
如果您使用的是Perl,则需要考虑的另一个工具是Parse::RecDescent。
如果您只需要进行一次翻译并且对编译器技术一无所知,我建议您尽可能使用一些相当简单的翻译,然后手动修复。是的,这是很多工作。但是,与学习复杂的主题并为一项工作编写正确的解决方案相比,它的工作量更少。也就是说,你仍然应该学习这个主题,但不要因为不知道它是完成你当前项目的障碍。
答案 9 :(得分:1)
我发现这个网站很有用:
我第一次使用lex / yacc是为了一个相对简单的项目。本教程是我真正需要的。当我稍后接触到更复杂的项目时,我对本教程的熟悉程度和一个简单的项目让我能够构建更高级的东西。
答案 10 :(得分:1)
在完成一些编译器类之后,我使用了The Dragon Book和C&T。我认为C& T在使编译器构造易于消化方面做得更好。不要拿走龙书,但我认为C& T是一本更实用的书。
答案 11 :(得分:1)
Parsing Techniques - A Practical Guide 作者:Dick Grune和Ceriel J.H.雅各布斯
本书(以PDF格式免费提供)概述了不同的解析技术/算法。如果你真的想要理解不同的解析算法,这个IMO是一个比龙书更好的参考(因为解析技术完全侧重于解析,而龙书只涵盖解析 - 虽然重要 - 编译器构建过程的一部分)