关于lex:解析,我在哪里可以了解到它

Parsing, where can I learn about it

我已经完成了将一种语言"翻译"为另一种语言的工作。 对于使用正则表达式的逐行方法而言,源代码太灵活(复杂)。 在哪里可以了解有关词法分析和解析器的更多信息?


如果您想获得关于该主题的"情感",请拿起《龙书》的副本。通常是编译器设计课程中的文字。它一定会满足您的"学习更多有关词法分析和解析器的知识"以及许多其他有趣的东西!

IMH(umble)O,为自己省下一条胳膊和/或一条腿,然后购买旧版-它将满足您的信息需求。


尝试ANLTR:

ANTLR, ANother Tool for Language
Recognition, is a language tool that
provides a framework for constructing
recognizers, interpreters, compilers,
and translators from grammatical
descriptions containing actions in a
variety of target languages.

也有一本书。

alt text


尼克劳斯·沃思(Niklaus Wirth)的著作"编译器构造"(免费提供PDF)
http://www.google.com/search?q=wirth+compiler+construction


很多人推荐书籍。对于许多人而言,这些在具有任务和截止日期等的结构化环境中更为有用。即使没有,以不同的方式呈现材料也可以极大地帮助您。

(a)您是否考虑过学习CS课程的学校?
(b)有很多在线讲座,例如麻省理工学院的开放课件。他们的EE / CS部分有许多涉及解析的课程,尽管我本身看不到解析的任何课程。它通常是第一门理论课程之一,因为语言分类和自动机是许多CS理论的核心。


我最近一直在使用PLY,后者是python中lex和yacc的实现。入门非常容易,并且文档中有一些简单的示例。

解析很快就会成为一个非常技术性的话题,并且您会发现,如果使用的是诸如PLY之类的解析器构建器,则可能不需要了解解析算法的所有详细信息。


解析技术-实用指南
迪克·格鲁尼(Dick Grune)和塞里尔·J·H(Ceriel J.H.)雅各布斯

本书(以PDF格式免费提供)全面概述了各种解析技术/算法。如果您真的想了解不同的解析算法,那么此IMO比Dragon Book更好(因为Parsing Techniques完全专注于解析,而Dragon Book仅将解析作为编译器构建过程的一部分,尽管很重要),因此它是更好的参考。 。


在(相当)几个编译器课程之后,我同时使用了Dragon Book和C&T。我认为C&T在使编译器结构易于消化方面做得更好。不要无视《龙书》,但我认为C&T是一本实用得多的书。

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


我发现此站点很有帮助:

Lex和YACC底漆/方法

我第一次使用lex / yacc是一个相对简单的项目。本教程是我真正需要的。以后,当我处理更复杂的项目时,对本教程的熟悉程度和一个简单的项目使我可以建立一些更奇特的东西。


还要考虑的另一本教科书是《编程语言语用学》。我喜欢它而不是《龙书》,但是喜欢YMMV。

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

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


Lexing / Parsing + typecheck +代码生成是一个很棒的CS练习,我会推荐给任何想要扎实基础的人,所以我全都支持Dragon Book


flex和bison是新的lex和yacc。 BNF的语法经常因为有点晦涩而被嘲笑。为此,有些人搬到了ANTLR和Ragel。

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

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


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


推荐阅读