Какой генератор парсера научит моих учеников?

Я преподаю (с другими) относительно вводный курс по информатике для ИТ-специалистов без опыта работы в CS. Поскольку я разработал учебные материалы по автоматам и грамматикам, я также отвечаю за обучение компиляторам и построению компилятора.

Несколько лет назад, когда я изучал компиляцию в колледже, все наши примеры взяты из Lex и Yacc. Являются ли они все еще широко распространенными? Есть ли что-то более привычное для Java? Студенты владеют C и Java, но никогда не использовали генераторы парсеров.

Любые советы о том, чему научить, будут оценены

Ответы

Ответ 1

Antlr широко используется, хорошо документировано и свободно. Он поддерживается Ant и может настраивать Java среди многих других языков.

Ответ 2

Я не использую генераторы lexer и parser. Они достаточно просты для создания вручную и являются самыми легкими частями компилятора для записи. Кроме того, когда вы их создаете вручную, вы можете сделать их очень быстрыми.

Ответ 3

Жаль, что ваши ученики не хорошо разбираются в С++. Когда я столкнулся с библиотекой Spirit с ее концепцией богатого DSL-стиля в стиле EBNF, я оставил Antlr, Lex и Yacc позади! Это гораздо более гибкое, с грамматикой, описанной рядом с кодом.

Блестящая библиотека, хотя, по общему признанию, нетривиальная кривая обучения.

Однако, без С++, Antlr, вероятно, лучший выбор.

Ответ 4

Lex и Yacc все еще используются. Один из новейших языков, F #, имеет собственные версии (fslex, fsyacc - см. здесь для примера.) Поэтому я думаю, что обучение они по-прежнему актуальны.

Ответ 5

Yacc и все другие партизаны LALR (1) относятся к эпохе, когда машинные ресурсы были недостаточными, и нужно было потратить много времени на разработку грамматики, чтобы вы могли вообще запускать парсер на PDP-11 с 64 КБ оперативной памяти. Сегодня нет смысла преподавать такой инструмент, как yacc с ужасным человеческим интерфейсом и очень ограниченным набором грамматик, которые он может использовать.

Я бы рекомендовал один из парсеров на основе PEG, таких как Rats!, или парсер GLR Elkhound, разработанный Джорджем Некула и Скотт МакПик (спасибо кварк). Извините, я не могу рекомендовать определенный инструмент для Java, но Rats! хорошо для C.

ANTLR в порядке, но слишком сложна для моего вкуса.

Ответ 6

Системы парсера PEG, такие как RATS, проще, чем комбинация lex/yacc. Это может быть или не быть плюсом для вашего класса: ваша цель - научить регулярным выражениям и конечным автоматам, а также грамматикам LR и автоматам отталкивания и т.д.? Или вам нужны простейшие практические инструменты для компилятора?

(Так как я не программирую в Java в эти дни, я не пробовал RATS в частности.)

Ответ 7

Javacc это очень легко.
В том же файле у вас есть грамматика и список токенов.

https://javacc.dev.java.net/

Ответ 8

Я помню, как использовал CUP и любил его. Взгляните на CUP Parser Generator для Java.

CUP поддерживается в Техническом университете Мюнхена. Я считаю, что основной целью является обучение студентов.

В нем также есть бесплатная лицензионная модель.

... Разрешение на использование, копирование, изменение и распространять это программное обеспечение и его документации для любых целей и без комиссии предоставляется, при условии, что вышеуказанные авторские права уведомление появляется во всех копиях и что как уведомление об авторских правах, так и уведомление о разрешении и гарантия отказ от поддержки документация...

Ответ 9

Вы можете пропустить часть генератора и посмотреть комбинаторы синтаксического анализа Scalas.

Ответ 10

Если вы планируете работать с Java, JavaCC или ANTLR должно быть достаточно. Этот последний также поддерживает C и Python. Но если вы планируете работать с С++, возможно, вам стоит взглянуть на Boost:: Spirit.

Ответ 11

Еще не пробовал, но я нашел jparsec несколько дней назад. Он не является генератором синтаксического анализатора, вместо этого парсер строит в java комбинаторы в стиле EBNF.

Ответ 12

Мне нравится GOLD Parsing System, потому что он в основном генерирует нужные таблицы, и вам тогда нужно использовать (общий) реализация процессора, который использует информацию таблицы для обработки токенов. Этот движок (как его называют) довольно прост в написании и в основном представляет собой чистую реализацию с использованием таблиц LALR и DFA для обработки ввода, и написание такой реализации может быть хорошим упражнением для их обучения.

Ответ 13

В настоящее время я беру курс компиляторов, который использует Lex и Yacc. Я действительно не знаю о каких-либо других типах там, но теория, которую мы изучаем, по-видимому, хорошо отображает эти инструменты.

Ответ 14

Я помню, как использовал Bison в одном из моих классов компиляторов. Мы также использовали flex и YACC.

Ответ 15

OCaml имеет фантастический набор генераторов парсера. Вот несколько простых примеров.

JavaCC также неплохо.

Я бы настоятельно рекомендовал избегать C (и С++) для этой цели, потому что в этом контексте они необычайно болезненны.