Bạn phải viết một thông dịch viên cho một ngôn ngữ tuyệt vời gọi là Gà !
Bạn nên đọc chương trình Gà từ một tệp, đầu vào tiêu chuẩn, đối số chương trình hoặc chức năng hoặc bất cứ điều gì thuận tiện nhất cho ngôn ngữ của bạn, cũng như đầu vào cho chương trình.
Bạn nên in hoặc trả về kết quả phiên dịch chương trình theo đặc tả ngôn ngữ Gà.
Tổng quan về chương trình gà
Gà hoạt động trên một ngăn xếp duy nhất, bao gồm toàn bộ mô hình bộ nhớ của nó. Khi các hướng dẫn được thực thi, chương trình sẽ đẩy và bật các giá trị từ ngăn xếp, nhưng cũng có các hướng dẫn cho phép chương trình sửa đổi các phần khác của ngăn xếp theo ý muốn.
Có ba phân đoạn trong ngăn xếp:
- Các thanh ghi, tại các chỉ số 0 và 1. Chỉ mục 0 là tham chiếu đến chính ngăn xếp và chỉ mục 1 là tham chiếu đến đầu vào của người dùng. Chủ yếu được sử dụng cho hướng dẫn 6 (xem bên dưới).
- Mã được tải: đối với mỗi dòng mã có ô trong phân đoạn này chứa số "gà" trong dòng. Điều này được đệm bằng 0 (opcode để kết thúc chương trình) ở cuối.
- Ngăn xếp chương trình thực tế, nơi các giá trị được đẩy / bật khi chương trình chạy. Lưu ý rằng các phân đoạn không bị cô lập, điều đó có nghĩa là có thể tạo mã tự sửa đổi hoặc thực thi mã từ phân đoạn này của không gian ngăn xếp.
Gà ISA
Tập lệnh của gà dựa trên số lần từ "gà" xuất hiện trên mỗi dòng của chương trình. Một dòng trống kết thúc chương trình và in giá trị trên cùng trong ngăn xếp.
Bộ hướng dẫn Gà, theo số lượng "gà" trên mỗi dòng:
- Đẩy chuỗi chữ "gà" vào ngăn xếp
- Thêm hai giá trị ngăn xếp hàng đầu dưới dạng số tự nhiên và đẩy kết quả.
- Trừ hai giá trị hàng đầu dưới dạng số tự nhiên và đẩy kết quả.
- Nhân hai giá trị hàng đầu dưới dạng số tự nhiên và đẩy kết quả.
- So sánh hai giá trị hàng đầu cho đẳng thức, đẩy 1 nếu chúng bằng nhau và 0 khác.
- Xem hướng dẫn tiếp theo để xác định nguồn nào sẽ tải từ: 0 tải từ ngăn xếp, 1 tải từ đầu vào của người dùng. Đầu các điểm xếp chồng đến địa chỉ / chỉ mục để tải từ nguồn đã cho; tải giá trị đó và đẩy nó lên ngăn xếp. Vì đây là một lệnh rộng gấp đôi, con trỏ lệnh bỏ qua lệnh được sử dụng để xác định nguồn.
- Đầu các điểm xếp chồng đến địa chỉ / chỉ mục để lưu trữ. Giá trị bên dưới sẽ được bật và lưu trữ trong ngăn xếp tại chỉ mục đã cho.
- Đầu ngăn xếp là một phần bù tương đối để nhảy tới. Nếu giá trị dưới đây là trung thực, thì chương trình sẽ nhảy bằng bù.
- Giải thích đỉnh của ngăn xếp là ascii và đẩy ký tự tương ứng.
- (10 + N) Đẩy số bằng chữ n-10 lên ngăn xếp.
Thí dụ
Giả sử chương trình là:
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
(an empty line)
(Một chương trình mèo. Lưu ý rằng dòng trống là bắt buộc vì dòng trước có 6 "gà".)
Đầu vào cung cấp cho chương trình Gà
Chicken
Đầu ra
Chicken
Việc triển khai tham chiếu Chicken.js .
Phát hiện lỗi
Trình thông dịch sẽ để lại một lỗi và chấm dứt khi có bất kỳ từ nào không phải là "gà" trong nguồn.
Chúc may mắn!