【问题标题】:Parsing, where can I learn about it解析,在哪里可以了解
【发布时间】:2008-08-29 06:57:20
【问题描述】:

我的工作是将一种语言“翻译”成另一种语言。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。在哪里可以了解有关词法分析和解析器的更多信息?

【问题讨论】:

    标签: parsing lex


    【解决方案1】:

    如果您想对主题“感性”,请获取“The Dragon Book”的副本。 通常是编译器设计课程中的文本。它肯定会满足您“了解更多关于词法分析和解析器的知识”以及一堆其他有趣的东西!

    IMH(umble)O,给自己留一条胳膊和/或一条腿,买一个旧版本——它会满足你的信息需求。

    【讨论】:

    • 马特,有 3 个版本,所以请为您建议的版本添加 ISBN,或者使用所有书籍的 ISBN 改进您的 cmets,并就每本书说一两句话。
    • 真的是@Ostati吗?我明确表示要节省一些钱并购买旧版本......或者不省钱,并购买当前版本。
    • 马特,我花了一段时间才知道哪个版本是哪个。但是有你的答案,顺便说一句,ISBN....无论如何,我读了这本书,开始了我的旅程。谢谢。
    【解决方案2】:

    试试ANLTR:

    ANTLR,另一种语言工具 识别,是一种语言工具 提供构建框架 识别器,解释器,编译器, 和语法翻译 包含动作的描述 多种目标语言。

    还有一个book

    【讨论】:

      【解决方案3】:

      Niklaus Wirth 的书“编译器构造”(以免费 PDF 格式提供) http://www.google.com/search?q=wirth+compiler+construction

      【讨论】:

        【解决方案4】:

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

        解析很快就会成为一个技术性很强的话题,如果您使用像 PLY 这样的解析器构建器,您可能不需要了解解析算法的所有细节。

        【讨论】:

          【解决方案5】:

          很多人都推荐过书。对于许多人来说,这些在具有分配和截止日期等的结构化环境中更有用。即使没有,以不同的方式呈现材料也会有很大帮助。

          (a) 您是否考虑过去一所提供不错的 CS 课程的学校?
          (b) 有很多在线讲座,例如MIT's Open Courseware。他们的EE/CS section 有许多涉及解析的课程,尽管我看不到任何关于解析本身的课程。它通常作为最早的理论课程之一引入,因为语言分类和自动机是大部分 CS 理论的核心。

          【讨论】:

          • +1 为 mit 的 ocw,我一直用它来做数学。出于某种原因,按我的时间表上课比 6:30 起床要好得多。
          【解决方案6】:

          如果您更喜欢基于 Java 的工具,Java Compiler Compiler JavaCC 是一个不错的解析器/扫描器。它是由配置文件驱动的,并且会生成可以包含在程序中的 java 代码。不过我几年没用过,所以我不确定当前版本如何。你可以在这里找到更多信息:https://javacc.dev.java.net/

          【讨论】:

            【解决方案7】:

            Lexing/Parsing + typecheck + code generation 是一个很棒的 CS 练习,我会向任何想要坚实基础的人推荐它,所以我完全支持 Dragon Book

            【讨论】:

              【解决方案8】:

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

              Lex and YACC primer/HOWTO

              我第一次使用 lex/yacc 是为了一个相对简单的项目。这个教程是我真正需要的。当我后来处理更复杂的项目时,我对本教程的熟悉和一个简单的项目让我能够构建一些更奇特的东西。

              【讨论】:

                【解决方案9】:

                在学习了(相当多)一些编译器类之后,我同时使用了The Dragon BookC&T。我认为 C&T 在使编译器结构易于理解方面做得更好。不要从 The Dragon Book 中拿走任何东西,但我认为 C&T 是一本实用得多的书。

                另外,如果您喜欢用 Java 编写代码,我建议您使用 JFlexBYACC/J 来满足您的词法分析和解析需求。

                【讨论】:

                  【解决方案10】:

                  另一个需要考虑的教科书是Programming Language Pragmatics。我更喜欢它而不是龙书,但是 YMMV。

                  如果您使用 Perl,另一个需要考虑的工具是 Parse::RecDescent

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

                  【讨论】:

                    【解决方案11】:

                    Parsing Techniques - A Practical Guide 作者:Dick Grune 和 Ceriel J.H.雅各布斯

                    这本书(以 PDF 格式免费提供)对不同的解析技术/算法进行了广泛的概述。如果你真的想了解不同的解析算法,这个 IMO 是比 Dragon Book 更好的参考(因为 Parsing Techniques 完全专注于解析,而 Dragon Book 仅将解析作为编译器构建过程的一个 - 虽然很重要 - 一部分) .

                    【讨论】:

                    【解决方案12】:

                    flex 和 bison 是新的 lex 和 yacc。 BNF 的语法经常被嘲笑为有点迟钝。出于这个原因,有些人已经转向 ANTLR 和 Ragel。

                    如果您不做太多翻译,您可以使用 Perl 或 Ruby 的多行正则表达式一次性完成。为现有语言编写兼容的 BNF 语法并不是一件容易的事。

                    另一方面,如果任何给定语言的 .l 和 .y 文件可作为开源文件使用,则完全可以利用它们。然后,您可以从现有的解析树构造新代码。

                    【讨论】:

                      猜你喜欢
                      • 2013-01-23
                      • 2011-09-15
                      • 2011-04-06
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-02-08
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多