2014-10-23 11 views
5

Tôi đang tạo trình phân tích cú pháp biểu thức infix, vì vậy tôi phải tạo trình thông báo. Nó hoạt động tốt, ngoại trừ một điều: Tôi không phải bây giờ làm thế nào để phân biệt số âm với toán tử "-".Cách phân biệt toán tử '-' với số âm cho mã thông báo

Ví dụ, nếu tôi có:

23/-23 

Các thẻ nên 23, /-23, nhưng nếu tôi có một biểu hiện như

23-22 

Sau đó, các thẻ nên 23, -22.

Tôi tìm thấy cách giải quyết dơ bẩn là nếu tôi gặp phải dấu "-", sau đó là số, tôi nhìn vào ký tự trước và nếu ký tự này là chữ số hoặc ')', tôi coi "-" là và không phải là số. Ngoài việc bị loại xấu xí, nó không hoạt động cho các biểu thức như

--56 

nơi nó được các thẻ sau: --56 nơi nó sẽ nhận được --56

Bất kỳ đề nghị?

+3

Ngữ pháp C không có hằng số nguyên âm, tất cả đều trừ đi một chút. Có vẻ như đó sẽ là cách tiếp cận đơn giản hơn. –

+2

Điều đó thường sẽ không phải là công việc của một người viết mã thông báo, bạn sẽ phải tìm ra điều này ở cấp độ cú pháp. – nos

Trả lời

8

Trong ví dụ đầu tiên các thẻ nên 23, /, -23.

Giải pháp sau đó là đánh giá mã thông báo theo các quy tắc về tính kết hợp và ưu tiên. - không thể liên kết với / nhưng nó có thể đến 23, ví dụ.

Nếu bạn gặp phải --56, được chia thành -, -, 56 và các quy tắc sẽ giải quyết vấn đề. Không cần cho các trường hợp đặc biệt.

+2

@ 2501: một trường hợp đặc biệt mà bạn có thể cần phải lo lắng là hằng số '- (MAXINT + 1)', là MININT trong các cấu trúc bổ sung 2s, nhưng liên quan đến một hằng số quá lớn cho một số nguyên dương. Điều đó có nghĩa là trình phân tích cú pháp thay vì lexer cần phải chịu trách nhiệm kiểm tra lỗi, điều này phải được thực hiện như là một phần của phép lặp liên tục để gắn cờ chính xác các số nguyên nguyên. – rici

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