2011-06-09 10 views
28

Có cách nào đơn giản để tích hợp Bison/Flex/Yacc vào XCode không?Tích hợp Bison/Flex/Yacc vào XCode

Tôi muốn viết ngôn ngữ của riêng mình để được phân tích cú pháp, tương tác với các đối tượng ObjC của tôi.

Nhưng các công cụ sẽ chỉ lấy STDIN làm đầu vào và sẽ chỉ tạo mã C thay vì ObjC. Về cơ bản, chúng chỉ có vẻ hữu ích đối với các công cụ dòng lệnh, nếu không chúng sẽ cần đến nỗi đau lớn để ghi đè đầu ra mỗi khi tôi tạo lại mã trình phân tích cú pháp.

Trả lời

19

Tóm lại, cung cấp cho tệp ngữ pháp của bạn một phần mở rộng .ym thay vì .y. Xcode sau đó sẽ chạy Bison với ma thuật cần thiết để hỗ trợ Objective-C.

Thật kỳ lạ, tôi đã tìm thấy câu hỏi này vì tôi muốn làm điều tương tự. Tôi nhớ một cuộc thảo luận về nó trên danh sách gửi thư ca cao của Apple, nhưng câu hỏi này lại xuất hiện cao hơn trong tìm kiếm của Google của tôi. Tôi tìm thấy các cuộc thảo luận mà tôi nhớ mặc dù, on CocoaBuilder - có một ví dụ khá rộng rãi ở cuối. Tôi hy vọng nó sẽ giúp cả hai chúng tôi, LOL!

(Chỉnh sửa) Hãy đánh bại tôi bằng cách nào mà mọi người đã từng tìm cách này, bằng cách này - tôi vẫn không tìm thấy bất kỳ tài liệu chính thức nào về nó.

+2

'mã nguồn.yacc' là một trong các loại tệp được hỗ trợ bởi Xcode. nếu bạn mở Info.plist của Xcode, bạn sẽ thấy danh sách các tiện ích mở rộng được công nhận cho các tệp nguồn Yacc (Bison); 'ym' là một trong số đó. –

+2

Điều cần biết, nhưng đó không phải là những gì tôi gọi là "tài liệu". :-) –

+0

Uh ok nhưng nếu tôi chỉ muốn sử dụng flex? Flex được hỗ trợ ra khỏi hộp w/Xcode? Tôi là một người mới vì vậy tôi tự hỏi ... – fooledbyprimes

16

Xcode không biết cách xử lý tệp yacc và flex, đồng thời sẽ tự động biên dịch các tệp mã được tạo trong dự án của bạn. Bí quyết là tìm ra những phần mở rộng mà nó mong đợi. Trong Xcode 4, nhấp vào mục cấp cao nhất trong danh sách nguồn để nhận cài đặt dự án. Nhấp vào mục tiêu của bạn trong danh sách tiếp theo, sau đó xây dựng Quy tắc trong tiêu đề chế độ xem bảng. Cuộn xuống "Quy tắc hệ thống Lex" và "Quy tắc hệ thống Yacc", sau đó di con trỏ qua "tệp nguồn" trong mỗi tệp để tìm mẹo công cụ với các tiện ích mở rộng mà nó sử dụng cho quy tắc đó. (? ... Đó là gì không rõ ràng)

Đối với Lex, đó là: * .l * .lm * .lmm * .lpp * .lp * .lxx

Đối Yacc, đó là: * .y * .ym * .ymm * .ypp * .yp * .yxx

Nếu bạn có bất kỳ mã Mục tiêu-C nào trong các tệp lex/yacc, bạn sẽ cần sử dụng phần mở rộng.? m để báo cho Xcode tạo tệp .m; tương tự,.? mm cho Objective-C++. (Tôi đoán.? Pp,.? P, và.? Xx là tất cả C++.) Từ những gì tôi đã thấy, điều này chỉ cần làm việc, không cần Makefile. Nếu bạn muốn giữ phần mở rộng .flex, bạn có thể nhấp vào nút "Sao chép vào mục tiêu" trong quy tắc Lex và tạo quy tắc mới cho tiện ích mở rộng đó.

Giờ phần "thú vị" đang cố gắng tích hợp yacc vào mã của bạn. Theo mặc định, hàm yyparse() mà làm cho toàn bộ mọi thứ mong đợi đầu vào từ STDIN trừ khi bạn nhảy qua một loạt các vòng để làm cho nó hoạt động theo cách khác. Nếu bạn đã chết khi sử dụng yacc, có rất nhiều thông tin trên web về cách uốn cong nó theo ý thích của bạn. Nhưng bạn có thể gió lên với ít vết lõm bàn phím trên trán hơn nếu bạn sử dụng trình tạo trình phân tích cú pháp hiện đại như lemon. Cú pháp được dựa trên yacc's, và nó là LALR (1) (bất cứ điều gì có nghĩa là) vì vậy tất cả mọi thứ bạn biết về thay đổi/giảm xung đột vẫn giữ. Tôi thấy nó dễ dàng hơn nhiều so với yacc/flex.

Chỉnh sửa: Tôi dường như nhớ lại rằng Xcode không tự động thêm tệp .l vào giai đoạn xây dựng, nhưng nó đã thêm tệp .y. Kiểm tra các giai đoạn xây dựng của bạn bằng cách nhấp vào mục cấp cao nhất trong danh sách nguồn Xcode, nhấp vào bạn nhắm mục tiêu, nhấp vào tiêu đề bảng Xây dựng giai đoạn, sau đó mở rộng hàng Nguồn biên dịch. Nếu tệp .l của bạn không có trong đó, hãy kéo nó vào từ danh sách nguồn.