2012-03-27 15 views
12

Tôi đang bắt đầu một dự án lớp liên quan đến việc thêm một số chức năng vào Go.Đi sử dụng Đi để phân tích cú pháp chính nó?

Tuy nhiên, tôi hoàn toàn nhầm lẫn về cấu trúc của Go. Tôi đã có ấn tượng rằng Go sử dụng flex và bison nhưng tôi không thể tìm thấy bất cứ điều gì quen thuộc trong mã nguồn Go.

Mặt khác, thư mục go/src/pkg/go có các thư mục có tên quen thuộc (ast, token, parser, vv) nhưng tất cả chúng chứa các tệp .go. Tôi bối rối!

Yêu cầu của tôi là của bất kỳ ai quen thuộc với Go, bạn có thể cho tôi biết tổng quan về cách Go bị lexed, phân tích cú pháp, v.v ... và nơi tìm tệp để chỉnh sửa ngữ pháp và không?

+2

Tôi sẽ không ngạc nhiên nếu họ đã viết trình phân tích cú pháp bằng tay (và bàn tay cuộn một từ vựng không quá kỳ cục). Nó thực sự khá phổ biến cho các trình biên dịch trưởng thành, và có nhiều ưu điểm khác nhau. – delnan

Trả lời

8

Cấu trúc thư mục:

src/cmd/5* ARM 
src/cmd/6* amd64 (x86-64) 
src/cmd/8* i386 (x86-32) 

src/cmd/cc C compiler (common part) 
src/cmd/gc Go compiler (common part) 
src/cmd/ld Linker  (common part) 
src/cmd/6c C compiler (amd64-specific part) 
src/cmd/6g Go compiler (amd64-specific part) 
src/cmd/6l Linker  (amd64-specific part) 

lexer được viết bằng C tinh khiết (không flex). Ngữ pháp được viết bằng Bison:

src/cmd/gc/lex.c 
src/cmd/gc/go.y 

Nhiều thư mục dưới src/cmd chứa một tập tin doc.go với mô tả ngắn về nội dung của thư mục.

Nếu bạn định sửa đổi ngữ pháp, cần lưu ý rằng ngữ pháp Bison đôi khi không phân biệt giữa các biểu thức và loại.

3

Trình biên dịch Go được viết bằng c, đó là lý do tại sao bạn cần flex và bison. Gói Go để phân tích cú pháp không được sử dụng. Nếu bạn muốn viết một trình biên dịch tự lưu trữ trong Go, bạn có thể sử dụng gói phân tích cú pháp Go.

+0

Nó thậm chí còn có bộ định tuyến AST đầu tiên và giao diện khách truy cập được xây dựng. Tôi thực sự đang xem xét viết codegen cho các bit đơn giản nhất của ngôn ngữ (về cơ bản, bất cứ thứ gì không cần các phần phức tạp hơn của thời gian chạy, goroutines và bộ sưu tập rác, vì vậy nó sẽ kết thúc được C với một cú pháp đẹp hơn). – matthias

4
+0

Cảm ơn bạn! Vì 8g là trình biên dịch Go trên máy tính của tôi, tôi đã nghĩ rằng các tệp sẽ nằm trong src/cmd/8g. Các tập tin trong thư mục 8g làm gì? – calvin

+0

@ user736932: Các nguồn cung cấp tạo mã kiến ​​trúc cụ thể. Gc là/nên là phần độc lập của trình biên dịch. – zzzz

Các vấn đề liên quan