Я преподаю (вместе с другими) относительно вводный курс информатики для ИТ-специалистов без опыта работы в CS. Поскольку я разработал материалы курса по автоматам и грамматикам, я также отвечаю за обучение компиляторам и построению компиляторов.
Много лет назад, когда я изучал компиляцию в колледже, все наши примеры пришли от Лекса и Якка. Они все еще широко используются? Есть ли что-то, что чаще всего используется для Java? Студенты владеют C и Java, но никогда не использовали генераторы парсеров.
Любые советы о том, чему учить, будут оценены





Antlr широко используется, хорошо документирован и бесплатен. Он поддерживается Ant и может ориентироваться на Java среди многих других языков.
Верно. Если они уже знают Java, Antlr - это то, что вам нужно.
Я помню, как использовал CUP, и он мне понравился. Взгляните на Генератор парсера CUP для Java.
CUP поддерживается Мюнхенским техническим университетом. Я считаю, что его основная цель - обучать студентов.
У него также есть бесплатная модель лицензирования.
...Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation...
Если вы преподаете CS, вас может заинтересовать новый Обмен стеками для преподавателей CS (хотя, поскольку он все еще находится в частной бета-версии, проще всего ввести через здесь)
Lex и Yacc все еще используются. Один из новейших языков, F#, имеет свои собственные версии (fslex, fsyacc - см. Пример здесь). Поэтому я думаю, что обучение им по-прежнему актуально.
Вы можете пропустить часть генератора и взглянуть на комбинаторы синтаксического анализатора Scalas.
Системы синтаксического анализа PEG, такие как КРЫСЫ, проще, чем комбинация lex / yacc. Это может быть, а может и не быть плюсом для вашего класса: ваша цель - научить регулярным выражениям и конечным автоматам, LR-грамматикам, выталкивающим автоматам и т. д.? Или вам нужны простейшие практичные инструменты интерфейса компилятора?
(Так как я сейчас не программирую на Java, я, в частности, не пробовал RATS.)
В настоящее время я прохожу курс компиляторов, который использует Lex и Yacc. Я действительно не знаю о каких-либо других типах, но теория, которую мы изучаем, кажется, очень хорошо согласуется с этими инструментами.
Жалко, что ваши ученики плохо разбираются в C++. Как только я наткнулся на библиотеку Дух с ее концепцией богатого DSL в стиле EBNF, я оставил Antlr, Lex и Yacc позади! много более гибкий, если грамматика описывается вместе с кодом.
Великолепная библиотека, хотя, по общему признанию, нетривиальная кривая обучения.
Однако без C++, вероятно, лучше всего использовать Antlr.
Я даже использовал дух для анализа аргументов командной строки ... :)
Не нравится библиотека program_options, а? :)
в нашем университете (я все еще учусь) мы используем Boost :: Spririt как основу для обучения как синтаксическому анализу, так и продвинутому C++. Это действительно хорошо работает для тех, кто заинтересован в обучении, но, конечно, кажется слишком глубоким для крутых студентов.
Я не использую генераторы лексеров и парсеров. Их достаточно просто сгенерировать вручную, и их проще всего написать в компиляторе. Кроме того, если вы создадите их вручную, вы сможете сделать их очень быстро.
Очевидно, вы никогда не писали сложных парсеров / лексеров ... вы действительно не хотите поддерживать их вручную, если они усложняются.
Да, я вручную создал парсеры и лексеры, которые выполняют произвольный просмотр вперед и назад, и даже один для C++! (C++ немного сложнее из-за его взаимодействия с препроцессором, существующими или отсутствующими токенами на основе переключателей компилятора и т. д.)
Еще некромантия ... Мне нравится высокомерие молодежи. Йорн, если у тебя еще осталось немного внимания ... www.digitalmars.com
@Jorn Вы знаете, к кому обращаетесь? ржу не могу
Я не знаю, но я поддерживаю свой комментарий. Простите, если я кого-то обидел.
Javacc это очень просто. В том же файле у вас есть грамматика и список токенов.
Я помню, как использовал Bison в одном из моих классов компилятора. Мы также использовали flex и YACC.
Если вы планируете работать с Java, достаточно JavaCC или ANTLR. Последний также поддерживает C и Python. Но если вы планируете работать с C++, возможно, вам стоит взглянуть на Boost :: Spirit.
Еще не пробовал, но несколько дней назад нашел jparsec. Это не генератор парсера, вместо этого парсер построен в java комбинаторами в стиле EBNF.
Yacc и все другие парсеры LALR (1) восходят к эпохе, когда машинные ресурсы были ограничены, и необходимо было потратить много времени на разработку грамматики, чтобы вы вообще могли запускать парсер на PDP-11 с 64 КБ ОЗУ. . Сегодня нет смысла обучать такой инструмент, как yacc, с ужасным человеческим интерфейсом и очень ограниченным набором грамматик, которые он может использовать.
Я бы порекомендовал либо один из парсеров на основе PEG, таких как Rats !, либо парсер GLR Элкхаунд, разработанный Джорджем Некулой и Скоттом МакПиком (спасибо, quark). Извините, я не могу рекомендовать конкретный инструмент для Java, но Rats! хорош для C.
ANTLR в порядке, но на мой вкус он слишком сложен.
Парсер GLR с открытым исходным кодом: Elkhound. scottmcpeak.com/elkhound. Его даже использовали для создания синтаксического анализатора C++.
OCaml имеет фантастический набор генераторов парсеров. Здесь - несколько простых примеров.
JavaCC тоже неплох.
Я настоятельно рекомендую избегать C (и C++) для этой цели, потому что они чрезвычайно болезненны в этом контексте.
Мне очень нравится Система парсинга GOLD, потому что он в основном генерирует необходимые таблицы, и вам нужно только использовать (общую) реализацию процессора, который использует информацию таблицы для обработки токенов. Этот движок (как его называют) довольно легко написать и в основном представляет собой чистую реализацию, использующую таблицы LALR и DFA для обработки ввода, и написание такой реализации может быть хорошим упражнением для обучения этим.
Это будет по теме на cseducators.stackexchange.com (хотя, поскольку он все еще находится в частной бета-версии, проще всего войти через area51.stackexchange.com/proposals/92460/…)