ANTLR является инструментом для написания компиляторов, аналогичным Lex/Yacc или Flex/Bison, но гораздо более способным, современным и в целом менее разочаровывающим. В настоящее время я читаю через The Definitive ANTLR 4 Reference создатель ANTLR, Теренс Парр. Это замечательный ресурс на работу и использование ANTLR, но это написано на Java — один из моих наименее любимых языков. К счастью ANTLR цели нескольких языках, так что я понял, я бы следовать вместе в Python — также один из моих наименее любимых языков.
Сама ANTLR написана на Java, поэтому для загрузки файла ANTLR Jar и настройки Java Classpath в среде оболочки необходимо установить Java, загрузить файл ANTLR Jar и настроить Java Classpath. Предполагая, что вы используете Fish, это выглядит что-то вроде этого:
С этим в сторону, мы в значительной степени сделали с Java. Мы можем перейти к более определенным шагам Python, и первый из них заключается в установке времени выполнения Python ANTLR. Это так же просто, как работает пипс установить:
Окончательный бит установки заключается в том, чтобы настроить псевдоним для вызова ANTLR сам инструмент. Хотя это чисто необязательно, я считаю, что это экономит много ввода. Это похоже на сценарий на странице 5 книги ANTLR, но с учетом Python.
Примечание: Не забудьте chmod +x выше сценарий и поместите его где-то в вашем пути.
Теперь мы можем вернуться к наслаждаясь узнать о ANTLR. По большей части следующим вместе с книгой является прямой процесс перевода вперед, с Java класс имена, упоминаемые в книге очень похожи (если не идентичны) на те, которые подвергаются Python ANTLR рамки.
Например, вот пример «основного» файла для вызова грамматики:
Вы просто поменять «YourLexer» и «YourParser» для соответствующих имен вашего lexer и парсер.
Даже создание посетителей и слушателей в значительной степени 1:1 перевод их Примеры Java из книги. Например, план слушателя может выглядеть так:
Это на самом деле очень приятно, что convetions, используемые Java runtime настолько очень похожи на те, которые используются Python один. Я подозреваю, что это преднамеренно, с тем чтобы уменьшить объем работы, необходимой для добавления новых языковых целей, и уменьшить сложность их документации.
Тем не менее, все это имеет оборотную сторону.
Несмотря на язык, который подразумевает контарию в самой книге ANTLR, грамматики ANTLR не являются языковыми агностиком. Вполне возможно соцедать грамматику ANTLR, которая не может быть составлена как есть для любого числа целевых языков. В самом деле, мы сталкиваемся с этой ситуацией довольно рано в книге на странице 43, где мы подвержены слушателя картины.
Грамматика Java.g4 не работает при таргетинге python, ANTLR генерирует следующие ошибки:
Это много ошибок!
Давайте вытащим первую фактическую ошибку и посмотрим немного ближе.
Он жалуется, что правило «тип» вызывает у нас проблемы. Чтобы лучше понять, почему, давайте посмотрим на применимую часть грамматики:
А также Java parser, выродил этот бит грамматики:
И, если это не на 100% ясно, давайте посмотрим на java-код, который нам нужно портировать python, чтобы использовать эту грамматику:
По сути, грамматика определяет правило, называемое «тип», но «тип» является зарезервированным словом в Python. AntLR сама затем производит парсер, который буквально определяет функцию, называемую «тип», который, по-видимому, хорошо в Java, но прекрасно не удается в Python.
Эту проблему можно было бы легко избежать с помощью некоторых общих префикс для правил, или с правилами что-то посмотрел в словаре. Вместо этого, взяв буквальное название правил и ожидая, что каждый из них может быть определен как функция точно такого же имени в целевом языке, ANTLR, по определению, не является агностиком языка. Для любой грамматики, Есть, вероятно, несколько реальных или гипотетических бэкэндов, что такая грамматика не может быть составлена для.
Например, вот грамматика, которая прекрасно работает в Python, но не может быть составлена для Java:
К сожалению, эта проблема Github подразумевает, что это также известная проблема автора, и один они не считают стоит исправить.
Хотя многие, если не большинство, грамматики, скорее всего, не проблема, это довольно грустно, что:
- Такая проблема возникает довольно рано в книге
- Книга очень подразумевает, и другие ресурсы в Интернете прямо сказать, что ANTLR является язык агностик — нет, это не
- Автор, кажется, не склонен более широко исправить ни эту ошибку, ни это заблуждение о своем инструменте.
Это в сторону, ANTLR на самом деле замечательный инструмент, особенно если вы идете в него со знанием и осознанием его бородавки. Я рад видеть, какие замечательные вещи я могу создать с помощью этого удивительного инструмента.