Интеграция Bison / Flex / Yacc в XCode - PullRequest
30 голосов
/ 09 июня 2011

Есть ли простой способ интеграции Bison / Flex / Yacc в XCode?

Я хочу написать собственный язык для анализа, который взаимодействует с моими объектами ObjC.

Но инструменты будут принимать только STDIN в качестве входных данных и будут генерировать только C-код вместо ObjC. В основном они кажутся полезными только для инструментов командной строки, в противном случае им требуется огромная боль для переопределения вывода каждый раз, когда я перегенерирую код анализатора.

Ответы [ 3 ]

21 голосов
/ 11 июня 2011

В двух словах, дайте вашим файлам грамматики расширение .ym вместо .y.Затем Xcode запустит Bison с необходимой магией для поддержки Objective-C.

Как ни странно, я нашел этот вопрос, потому что хотел сделать то же самое.Я вспомнил дискуссию об этом в списке рассылки Apple по разработке какао, но этот вопрос поднялся выше в моем поиске в Google.Я нашел обсуждение, которое я запомнил, хотя, на CocoaBuilder - есть довольно обширный пример в конце.Я надеюсь, что это поможет нам обоим, LOL!

(Правка) Черт возьми, как мне кто-нибудь когда-нибудь удалось выяснить это, кстати - я до сих пор не нашеллюбые официальные документы об этом.

18 голосов
/ 24 февраля 2012

Xcode знает, как обрабатывать файлы yacc и flex, и автоматически скомпилирует сгенерированные файлы кода в ваш проект. Хитрость в том, чтобы выяснить, каких расширений он ожидает. В Xcode 4 нажмите на элемент верхнего уровня в списке источников, чтобы получить настройки проекта. Нажмите на цель в следующем списке, затем выберите «Правила сборки» в заголовке табличного представления. Прокрутите вниз до «System Lex rule» и «System Yacc rule», затем наведите курсор на «исходные файлы» в каждом из них, чтобы получить подсказку с расширениями, которые он использует для этого правила. (... Что? Это не было очевидно?)

Для Лекса это: * .l * .lm * .lmm * .lpp * .lp * .lxx

Для Yacc это: * .y * .ym * .ymm * .ypp * .yp * .yxx

Если в ваших файлах lex / yacc есть какой-либо код Objective-C, вам нужно использовать расширение.? M, чтобы сообщить Xcode о создании файла .m; аналогично.? мм для Objective-C ++. (Я предполагаю.? Pp,.? P, и.? Xx - все это C ++.) Из того, что я видел, этот Just Works, Makefile не нужен. Если вы хотите сохранить расширение .flex, вы можете нажать кнопку «Копировать в цель» в правиле Lex и создать новое правило для этого расширения.

Теперь «забавная» часть пытается интегрировать yacc в ваш код. По умолчанию функция yyparse (), которая заставляет все это работать, ожидает ввода от STDIN, если вы не перепрыгнете через кучу обручей, чтобы заставить ее работать иначе. Если вы не уверены в использовании yacc, в Интернете достаточно информации о том, как согнуть его в соответствии с вашими прихотями. Но вы можете столкнуться с меньшим количеством вмятин на лбу, если вы используете современный генератор синтаксических анализаторов, такой как lemon . Синтаксис основан на yacc, и это LALR (1) (что бы это ни значило), поэтому все, что вы знаете о конфликтах сдвига / уменьшения, остается в силе. Мне было гораздо легче работать с yacc / flex.

Редактировать: Кажется, я вспомнил, что XCode не добавил файл .l в фазу сборки автоматически, но он добавил .y файл. Проверьте фазы сборки, щелкнув по элементу верхнего уровня в списке источников XCode, выберите цель, щелкните заголовок таблицы фаз сборки, а затем разверните строку «Источники компиляции». Если вашего файла .l там нет, перетащите его из списка источников.

4 голосов
/ 12 августа 2015

Я нашел отличный пример: https://github.com/epatel/ParserTest. Ему 3 года, но он работает в Xcode 6 и 7.

...