我正在(与其他人一起)为没有CS背景的IT专业人员教授计算机科学的相对入门课程.自从我开发了自动机和语法的课程资料以来,我还负责编写有关编译器和编译器构造的知识.
多年前,当我在大学学习编译时,我们所有的例子都来自Lex和Yacc.这些仍然广泛使用吗?有没有更常用于Java的东西?学生精通C和Java,但从未使用过解析器生成器.
任何关于教什么的提示都将不胜感激
Antlr被广泛使用,文档齐全,免费.它受Ant支持,可以将Java作为许多其他语言的目标.
我不使用词法分析器和解析器生成器.它们非常简单,可以手工生成,是编写器编写的最简单的部分.此外,当你手工制作它们时,你可以让它们非常快.
遗憾的是,你的学生并不精通C++.一旦我遇到了一个富有EBNF风格的DSL概念的Spirit库,我就离开了Antlr,Lex和Yacc!这是很多更灵活有旁边的代码来描述语法.
辉煌的图书馆,虽然有一个公认的非平凡的学习曲线.
但是,如果没有C++,Antlr可能是你最好的选择.
Lex和Yacc仍在使用中.F#的最新语言之一有它自己的版本(fslex,fsyacc - 请看这里的例子.)所以我认为教它们仍然是相关的.
Yacc和所有其他LALR(1)解析器可以追溯到机器资源稀缺的时代,并且需要花费大量时间来设计语法,以便您可以在具有64K RAM的PDP-11上运行解析器.今天,使用可怕的人机界面和可以使用的非常有限的语法集教授像yacc这样的工具是没有意义的.
我建议使用其中一种基于PEG的解析器,例如Rats !,或者由George Necula和Scott McPeak(感谢夸克)开发的GLR解析器Elkhound.对不起,我不能推荐一个特定的Java工具,但是老鼠!对C有好处
ANTLR还可以,但对我来说太复杂了.