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 там нет, перетащите его из списка источников.