Подтвердить что ты не робот

Интеграция Bison/Flex/Yacc в XCode

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

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

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

4b9b3361

Ответ 1

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

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

(Edit) Избавляет от меня, как кому-то удалось это выяснить, между прочим - я до сих пор не нашел официальной документации об этом.

Ответ 2

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

Для Lex это: *.l *.lm *.lmm *.lpp *.lp *.lxx

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

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

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

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