2013-11-27 12 views
8

Có cách nào tốt hơn để xử lý unary "-" trong chuyển đổi một biểu thức infix thành một postfix không?xử lý đơn trừ trừ cho thuật toán shunting-yard

Điều hiển nhiên sẽ là tiền tố mọi "" thống nhất với 0. Có ai biết triển khai tốt hơn không? Cảm ơn!

+0

Có một số giải pháp cho vấn đề này, nhưng tất cả chúng đều bị hack một số mở rộng. – harold

+0

Hai năm sau khi đăng bài của bạn, tôi chỉ có cùng một câu hỏi. Đó là loại câu hỏi luôn có liên quan. Dưới đây là một quan sát: Thêm một số không (mà tôi xem xét, quá) sẽ không phải lúc nào cũng hoạt động: Ví dụ: --3 sẽ được chuyển thành 0 - 3 -3 = -6 Hầu hết các trình phân tích cú pháp sẽ áp dụng trừ đi một lần trừ đi một sản phẩm , đó sẽ là: - (-3) = 6. Chúc mừng, – MrVelez

+0

@MrVelez: Bạn đúng rằng tiền tố 0 không hoạt động, nhưng vì một lý do khác. Tiền xử lý '--3' bằng cách bắt đầu số 0 sẽ mang lại '0-0-3' (không phải '0-3-3', vị trí thứ 3 sẽ xuất phát từ đâu?). Tức là, - 3 '->' 0 -, - 3 '->' 0-0-, 3 '->' 0-0-3, 'dẫn đến hậu tố' 0 0 - 3 - '. Điều này đánh giá là -3, mà có lẽ không phải là những gì chúng ta muốn từ --3. \ Nếu chúng ta có thể nhận được '0-0-3' để dịch sang postfix '0 0 3 - -' thì nó sẽ đánh giá thành mong muốn 3. –

Trả lời

6

Cách tôi đã làm điều này năm trước đã được phát minh ra một nhà điều hành mới cho biểu thức postfix của tôi. Vì vậy, khi tôi gặp phải một unary trừ trong infix, tôi muốn chuyển đổi nó để #. Vì vậy, postfix của tôi cho a + -b đã trở thành ab#+.

Và, tất nhiên, người đánh giá của tôi phải biết rằng # chỉ xuất hiện một toán hạng.

Loại phụ thuộc vào cách bạn đang sử dụng biểu thức postfix sau khi nó được tạo. Nếu bạn muốn hiển thị nó thì nhà điều hành # đặc biệt của bạn có thể gây nhầm lẫn cho mọi người. Nhưng nếu bạn chỉ sử dụng nó trong nội bộ (mà tôi đã), sau đó nó hoạt động tuyệt vời.

+1

Tôi cũng làm như vậy. Cách duy nhất tôi có thể xác định rằng tôi đã "gặp phải một ngoại lệ trừ trong infix" là duy trì một bối cảnh boolean xác định liệu một toán tử hay toán hạng được mong đợi tiếp theo. Tôi muốn biết những gì người khác đã làm để quyết định khi một dấu gạch nối là đơn nhất hoặc nhị phân. –

+0

@ A.I.Breveleri: Nếu bạn sử dụng trình phân tích cú pháp đệ quy gốc cho tệp thông tin, bạn có thể nhận ra toán tử đơn nhất mà không cần duy trì trạng thái một cách rõ ràng. Xem, ví dụ: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm. –

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