Ответ 1
Antlr широко используется, хорошо документировано и свободно. Он поддерживается Ant и может настраивать Java среди многих других языков.
Я преподаю (с другими) относительно вводный курс по информатике для ИТ-специалистов без опыта работы в CS. Поскольку я разработал учебные материалы по автоматам и грамматикам, я также отвечаю за обучение компиляторам и построению компилятора.
Несколько лет назад, когда я изучал компиляцию в колледже, все наши примеры взяты из Lex и Yacc. Являются ли они все еще широко распространенными? Есть ли что-то более привычное для Java? Студенты владеют C и Java, но никогда не использовали генераторы парсеров.
Любые советы о том, чему научить, будут оценены
Antlr широко используется, хорошо документировано и свободно. Он поддерживается Ant и может настраивать Java среди многих других языков.
Я не использую генераторы lexer и parser. Они достаточно просты для создания вручную и являются самыми легкими частями компилятора для записи. Кроме того, когда вы их создаете вручную, вы можете сделать их очень быстрыми.
Жаль, что ваши ученики не хорошо разбираются в С++. Когда я столкнулся с библиотекой Spirit с ее концепцией богатого DSL-стиля в стиле EBNF, я оставил Antlr, Lex и Yacc позади! Это гораздо более гибкое, с грамматикой, описанной рядом с кодом.
Блестящая библиотека, хотя, по общему признанию, нетривиальная кривая обучения.
Однако, без С++, Antlr, вероятно, лучший выбор.
Lex и Yacc все еще используются. Один из новейших языков, F #, имеет собственные версии (fslex, fsyacc - см. здесь для примера.) Поэтому я думаю, что обучение они по-прежнему актуальны.
Yacc и все другие партизаны LALR (1) относятся к эпохе, когда машинные ресурсы были недостаточными, и нужно было потратить много времени на разработку грамматики, чтобы вы могли вообще запускать парсер на PDP-11 с 64 КБ оперативной памяти. Сегодня нет смысла преподавать такой инструмент, как yacc с ужасным человеческим интерфейсом и очень ограниченным набором грамматик, которые он может использовать.
Я бы рекомендовал один из парсеров на основе PEG, таких как Rats!, или парсер GLR Elkhound, разработанный Джорджем Некула и Скотт МакПик (спасибо кварк). Извините, я не могу рекомендовать определенный инструмент для Java, но Rats! хорошо для C.
ANTLR в порядке, но слишком сложна для моего вкуса.
Системы парсера PEG, такие как RATS, проще, чем комбинация lex/yacc. Это может быть или не быть плюсом для вашего класса: ваша цель - научить регулярным выражениям и конечным автоматам, а также грамматикам LR и автоматам отталкивания и т.д.? Или вам нужны простейшие практические инструменты для компилятора?
(Так как я не программирую в Java в эти дни, я не пробовал RATS в частности.)
Javacc это очень легко.
В том же файле у вас есть грамматика и список токенов.
Я помню, как использовал CUP и любил его. Взгляните на CUP Parser Generator для Java.
CUP поддерживается в Техническом университете Мюнхена. Я считаю, что основной целью является обучение студентов.
В нем также есть бесплатная лицензионная модель.
... Разрешение на использование, копирование, изменение и распространять это программное обеспечение и его документации для любых целей и без комиссии предоставляется, при условии, что вышеуказанные авторские права уведомление появляется во всех копиях и что как уведомление об авторских правах, так и уведомление о разрешении и гарантия отказ от поддержки документация...
Вы можете пропустить часть генератора и посмотреть комбинаторы синтаксического анализа Scalas.
Если вы планируете работать с Java, JavaCC или ANTLR должно быть достаточно. Этот последний также поддерживает C и Python. Но если вы планируете работать с С++, возможно, вам стоит взглянуть на Boost:: Spirit.
Еще не пробовал, но я нашел jparsec несколько дней назад. Он не является генератором синтаксического анализатора, вместо этого парсер строит в java комбинаторы в стиле EBNF.
Мне нравится GOLD Parsing System, потому что он в основном генерирует нужные таблицы, и вам тогда нужно использовать (общий) реализация процессора, который использует информацию таблицы для обработки токенов. Этот движок (как его называют) довольно прост в написании и в основном представляет собой чистую реализацию с использованием таблиц LALR и DFA для обработки ввода, и написание такой реализации может быть хорошим упражнением для их обучения.
В настоящее время я беру курс компиляторов, который использует Lex и Yacc. Я действительно не знаю о каких-либо других типах там, но теория, которую мы изучаем, по-видимому, хорошо отображает эти инструменты.
Я помню, как использовал Bison в одном из моих классов компиляторов. Мы также использовали flex и YACC.
OCaml имеет фантастический набор генераторов парсера. Вот несколько простых примеров.
JavaCC также неплохо.
Я бы настоятельно рекомендовал избегать C (и С++) для этой цели, потому что в этом контексте они необычайно болезненны.