В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
Antlr широко используется, хорошо документируется и свободный. Это поддерживается Муравьем и может предназначаться для Java среди многих других языков.
Еще не попробовали его, но я нашел jparsec несколько дней назад. Это не парсер-генератор, вместо этого синтаксический анализатор является сборкой в Java combinators в стиле EBNF.
Системы синтаксического анализатора ШТЕПСЕЛЯ как КРЫСЫ более просты, чем lex/yacc комбинация. Это может или не может быть плюс для Вашего класса: Ваша цель состоит в том, чтобы учить регулярным выражениям и конечным автоматам, и LR-грамматикам и автоматам с магазинной памятью, и т.д.? Или Вы хотите самый простой практический компилятор frontend инструменты?
(Так как я не программирую в Java в эти дни, я не попробовал КРЫС в частности.)
Я не забываю использовать Бизона в одном из моих классов компиляторов. Мы также использовали гибкий провод и YACC.
Если Вы планируете работать с Java, JavaCC или ANTLR должны быть достаточными. Этот последний также поддерживает C и Python. Но если Вы планируете работать с C++, возможно, необходимо смотреть на Повышение:: Дух.
Я в настоящее время беру курс компиляторов, который использует Lex и Yacc. Я действительно не знаю ни о каких других типах там, но теория, которую мы изучаем, кажется, отображается вполне прилично на эти инструменты.
Вы могли пропустить часть генератора и взглянуть на синтаксический анализатор Scalas combinators.
Javacc это очень легко.
В том же файле у Вас есть грамматика и маркерный список.
Yacc и все другие LALR (1) дата синтаксических анализаторов с эры, когда ресурсы машины были дефицитными и было необходимо потратить большую разработку времени грамматика так, чтобы Вы могли запустить синтаксический анализатор вообще на PDP-11 с 64K RAM. Сегодня не имеет смысла преподавать инструмент как yacc с ужасным интерфейсом пользователя и очень ограниченным набором грамматик, которые это может использовать.
я рекомендовал бы любой из ОСНОВАННЫХ НА ШТЕПСЕЛЕ синтаксических анализаторов, таких как Крысы!, или GLR парсер Elkhound, разработанный George Necula и Scott McPeak (благодарит кварк). Извините я не могу рекомендовать определенный инструмент для Java, но Крыс! хорошо для C.
ANTLR в порядке, но слишком сложен для моего вкуса.
Lex и Yacc все еще используются. Один из новейших языков вокруг, F#, имеет свои собственные версии (fslex, fsyacc - см. здесь для примера.), Таким образом, я думаю, преподавая им, все еще релевантно.
Жаль, что Ваши студенты не являются сведущими в C++. После того как я столкнулся библиотека Spirit с ее понятием богатого, EBNF-стиля DSL, я покинул Antlr, Lex и Yacc позади! Это очень более гибкое описание грамматики вместе с кодом.
библиотека Brilliant, хотя с по общему признанию нетривиальной кривой обучения.
Однако без C++, Antlr является, вероятно, Вашим лучшим выбором.
Я не использую лексический анализатор и парсеры-генераторы. Они достаточно просты генерировать вручную и являются самыми легкими частями компилятора для записи. Кроме того, при создании их вручную можно сделать их действительно быстро.
Я не забываю использовать КУБОК и любить его. Смотрите на Парсер-генератор КУБКА для Java.
КУБОК сохраняется в Мюнхенском техническом университете. Я полагаю, что это - основная цель, должен учить студентов.
Это также имеет свободную модель лицензирования.
... Разрешение использовать, скопируйте, измените и распределите это программное обеспечение, и его документацию для любой цели и без сбора настоящим предоставляют, при условии, что вышеупомянутое уведомление об авторском праве появляется во всех копиях и что и уведомление об авторском праве и эта правовая оговорка уведомления и гарантии разрешения появляются в сопроводительной документации...
Мне очень нравится GOLD Parsing System , потому что она в основном генерирует необходимые таблицы, и вам остается только использовать (общую) реализацию процессора, который использует информация таблицы для обработки токенов. Этот движок (как его называют) довольно легко написать и в основном представляет собой чистую реализацию, использующую таблицы LALR и DFA для обработки ввода, и написание такой реализации может быть хорошим упражнением для их обучения.
OCaml имеет фантастический набор генераторов парсеров. Вот несколько простых примеров .
JavaCC тоже неплох.
Я настоятельно рекомендую избегать C (и C ++) для этой цели, потому что они чрезвычайно болезненны в этом контексте.