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

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

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

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

Это будет по теме на cseducators.stackexchange.com (хотя, поскольку он все еще находится в частной бета-версии, проще всего войти через area51.stackexchange.com/proposals/92460/…)

Ben I. 02.06.2017 22:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
1
2 334
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Ответ принят как подходящий

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

Верно. Если они уже знают Java, Antlr - это то, что вам нужно.

tunaranch 02.11.2008 04:44

Я помню, как использовал 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 (хотя, поскольку он все еще находится в частной бета-версии, проще всего ввести через здесь)

Ben I. 02.06.2017 22:18

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

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

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

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

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

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

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

Однако без C++, вероятно, лучше всего использовать Antlr.

Я даже использовал дух для анализа аргументов командной строки ... :)

xtofl 04.11.2008 13:48

Не нравится библиотека program_options, а? :)

MattyT 07.11.2008 13:12

в нашем университете (я все еще учусь) мы используем Boost :: Spririt как основу для обучения как синтаксическому анализу, так и продвинутому C++. Это действительно хорошо работает для тех, кто заинтересован в обучении, но, конечно, кажется слишком глубоким для крутых студентов.

Alex Lim 26.11.2008 01:46

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

Очевидно, вы никогда не писали сложных парсеров / лексеров ... вы действительно не хотите поддерживать их вручную, если они усложняются.

Jorn 26.11.2008 01:52

Да, я вручную создал парсеры и лексеры, которые выполняют произвольный просмотр вперед и назад, и даже один для C++! (C++ немного сложнее из-за его взаимодействия с препроцессором, существующими или отсутствующими токенами на основе переключателей компилятора и т. д.)

Walter Bright 27.11.2008 20:08

Еще некромантия ... Мне нравится высокомерие молодежи. Йорн, если у тебя еще осталось немного внимания ... www.digitalmars.com

JimR 02.01.2011 13:20

@Jorn Вы знаете, к кому обращаетесь? ржу не могу

Gary Willoughby 31.12.2011 18:22

Я не знаю, но я поддерживаю свой комментарий. Простите, если я кого-то обидел.

Jorn 01.01.2012 14:33

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

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

Я помню, как использовал 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++.

quark 03.08.2009 11:45

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

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

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

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

Другие вопросы по теме