2011-06-09 13 views
28

Czy istnieje prosty sposób na integrację Bison/Flex/Yacc z XCode?Integracja Bison/Flex/Yacc w XCode

Chcę napisać własny język do przetwarzania, który współdziała z moimi obiektami ObjC.

Ale narzędzia przyjmą tylko STDIN jako dane wejściowe i będą produkować tylko kod C zamiast ObjC. Zasadniczo wydają się one przydatne tylko dla narzędzi wiersza poleceń, w przeciwnym razie potrzebują ogromnego bólu, aby przesłonić dane wyjściowe za każdym razem, gdy ponownie generuję kod parsera.

Odpowiedz

19

W skrócie, nadaj plikom gramatycznym rozszerzenie .ym zamiast .y. Xcode następnie uruchomi Bison z niezbędną magią do obsługi Objective-C.

Dziwne, znalazłem to pytanie, ponieważ chciałem zrobić to samo. Przypomniałem sobie dyskusję na ten temat na liście mailingowej Apple'a, ale pytanie to znalazło się wyżej w mojej wyszukiwarce Google. Znalazłem dyskusję, którą zapamiętałem, on CocoaBuilder - na końcu jest całkiem obszerny przykład. Mam nadzieję, że pomoże nam to obu, LOL!

(Edytuj) Uderza mnie, jak ktoś zdążył to odkryć, przy okazji - I nadal nie znalazłem żadnej oficjalnej dokumentacji na ten temat.

+2

'kod źródłowy.yacc' jest jednym z typów plików obsługiwanych przez Xcode. jeśli otworzysz Info.plist Xcode, zobaczysz listę uznanych rozszerzeń plików źródłowych Yacc (Bison); "ym" jest jednym z nich. –

+2

Dobrze wiedzieć, ale to nie jest to, co nazywam "dokumentacją". :-) –

+0

Uh ok, ale co jeśli chcę po prostu użyć flex? Czy flex jest obsługiwany poza skrzynką z Xcode? Jestem początkującym więc zastanawiam się ... – fooledbyprimes

16

Xcode wie, jak przetwarzać pliki yacc i flex, i automatycznie skompiluje wygenerowane pliki kodu do projektu. Sztuczka polega na ustaleniu, jakich rozszerzeń oczekuje. W Xcode 4 kliknij pozycję najwyższego poziomu na liście źródłowej, aby uzyskać ustawienia projektu. Kliknij swój cel na następnej liście, a następnie Utwórz reguły w nagłówku widoku tabeli. Przewiń w dół do "Reguły systemu Lexusa" i "Reguły systemu Yacc", a następnie umieść kursor nad "plikami źródłowymi" w każdym z nich, aby uzyskać wskazówkę narzędzia z rozszerzeniami, których używa dla tej reguły. (? ... co to nie było oczywiste)

Dla Lex, to: * dł * .lm * .lmm * .lpp * .LP * .lxx

Dla Yacc, to: * .y * .ym * .ymm * .ypp * .yp * .yxx

Jeśli posiadasz dowolny kod Objective-C w plikach lex/yacc, musisz użyć rozszerzenia.? m, aby nakazać Xcode wygenerowanie plik .m; podobnie,.? mm dla Objective-C++. (Zgaduję.? Pp,.? P, i.? Xx są C++.) Z tego, co widziałem, to właśnie działa, nie potrzeba Makefile. Jeśli chcesz zachować rozszerzenie .flex, możesz kliknąć przycisk "Kopiuj do celu" w regule Lex i utworzyć nową regułę dla tego rozszerzenia.

Teraz część "zabawna" próbuje zintegrować yacc z kodem. Domyślnie funkcja yyparse(), która sprawia, że ​​wszystko idzie, oczekuje wejścia od STDIN, chyba że przeskoczysz przez kilka kółek, aby działało inaczej. Jeśli nie chcesz już używać Yacc, w internecie znajdziesz mnóstwo informacji o tym, jak pogiąć go ze swoimi zachciankami. Ale możesz skończyć z mniejszą liczbą wgnieceń klawiatury na twoim czole, jeśli używasz nowoczesnego generatora analizatora składni, takiego jak lemon. Składnia jest oparta na Yacc, i jest LALR (1) (cokolwiek to znaczy), więc wszystko, co wiesz o przesunięciu/zmniejszeniu konfliktów, nadal trwa. Znalazłem o wiele łatwiej pracować z niż Yacc/Flex.

Edycja: Przypominam sobie, że Xcode nie dodał automatycznie pliku .l do fazy kompilacji, ale dodał plik .y. Sprawdź fazy kompilacji, klikając pozycję najwyższego poziomu na liście źródeł Xcode, kliknij cel, kliknij nagłówek tabeli Build Phases, a następnie rozwiń wiersz Compile Sources. Jeśli Twojego pliku .l nie ma, przeciągnij go z listy źródłowej.