2010-04-15 19 views
8

Khi triển khai thông dịch viên cho ngôn ngữ lập trình của tôi, trước tiên tôi nghĩ về một cửa sổ giao diện điều khiển đơn giản cho phép người dùng nhập một số mã mà sau đó được thực hiện dưới dạng chương trình độc lập làm trình bao.Làm thế nào để Ruby và Python thực hiện các bảng điều khiển tương tác của họ?

Nhưng có vấn đề nghiêm trọng: Nếu mỗi dòng mã người dùng nhập được xử lý như một chương trình độc lập, nó phải đi qua trình mã thông báo và trình phân tích cú pháp và sau đó được thực hiện bởi trình thông dịch.

  • Bảng điều khiển tương tác Python/Ruby (IDLE, irb) "chia sẻ" mã như thế nào? Mã được nhập được xử lý như thế nào?

Ví dụ:

>> def x: 
>> print("Blah") 
>> 
>> x() 

Đâu là chức năng lưu trữ để nó có thể được gọi bất cứ lúc nào nữa?

Làm cách nào để bàn điều khiển tương tác đưa mọi thứ được nhập rõ ràng là một chương trình mà không thực thi mọi thứ lặp đi lặp lại?

Trả lời

5

Đối với Python, một biểu thức không hoàn thành cho đến khi tất cả dấu ngoặc đơn, ngoặc vuông, v.v. phù hợp. Điều này khá dễ phát hiện. Định nghĩa hàm/lớp không hoàn thành cho đến khi một dòng hoàn toàn trống được nhập vào. Trình biên dịch sau đó biên dịch biểu thức hoặc định nghĩa đã nhập và chạy nó.

Giống như hàm bình thường, lớp, mô-đun, v.v., REPL có phạm vi địa phương riêng. Phạm vi này được sử dụng cho các biến và định nghĩa được nhập vào REPL.

3

Bạn có thể tìm hiểu thêm về Python console tương tác bằng cách đọc các tài liệu cho các mô-đun mã:

Các mô-đun mã cung cấp cơ sở vật chất để thực hiện đọc eval-in vòng bằng Python. Hai lớp và các chức năng tiện lợi được bao gồm có thể được sử dụng để xây dựng các ứng dụng cung cấp một dấu nhắc thông dịch tương tác.

http://docs.python.org/library/code.html

3

Hầu hết các ngôn ngữ sử dụng một phân tích cú pháp trong đó có một loại "dòng mã thông báo" - có nghĩa là, phân tích cú pháp giữ lấy thẻ (một chuỗi, biểu tượng, nhà điều hành, vv) từ đầu vào cho đến khi nó có biểu thức đầy đủ, sau đó nó trả về biểu thức được phân tích cú pháp mà nó có thể được biên dịch sang bytecode hoặc được thực thi khác. Một vòng lặp REPL tương đối đơn giản để xử lý cho cấu trúc đó, vì trình phân tích cú pháp về cơ bản yêu cầu thêm đầu vào, và bạn cung cấp cho người dùng một dấu nhắc và yêu cầu người dùng nhập thêm đầu vào. Bạn có thể cần một chút giao tiếp từ trình phân tích cú pháp tới trình đọc để làm cho nó hiển thị những thứ như lời nhắc tiếp tục.

Cả Python và Ruby đều thực hiện các câu lệnh ngay lập tức, theo thứ tự (một khai báo hàm là một câu lệnh). Vì vậy, bạn có thể thực hiện mã tuyên bố-by-tuyên bố tại phiên dịch để phần lớn tác dụng tương tự như trong một tập tin nguồn.

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