Có vẻ như bạn đang thực hiện một trình phân tích cú pháp kiểu phân tích cú pháp, khi đó bạn sẽ cần một máy trạng thái đơn giản trong lexer để nhận các mã thông báo riêng biệt và trừ nhị phân. (Trong trình phân tích cú pháp PEG, đây không phải là điều bạn phải lo lắng.)
Trong JavaCC, bạn sẽ có trạng thái DEFAULT
, nơi bạn sẽ xem -
là UNARY_MINUS
. Khi bạn mã hóa kết thúc biểu thức chính (dấu ngoặc đóng hoặc số nguyên, dựa trên ví dụ bạn đã cung cấp), thì bạn sẽ chuyển sang trạng thái INFIX
, trong đó -
sẽ được coi là INFIX_MINUS
. Khi bạn gặp phải bất kỳ toán tử infix nào, bạn sẽ trở về trạng thái DEFAULT
.
Nếu bạn đang cuộn của riêng mình, nó có thể là một chút đơn giản hơn thế. Hãy xem số Python code này để có cách làm thông minh. Về cơ bản, khi bạn gặp phải một số -
, bạn chỉ cần kiểm tra xem mã thông báo trước đó có phải là toán tử infix hay không. Ví dụ đó sử dụng chuỗi "-u"
để biểu thị mã thông báo trừ đơn nhất, thuận tiện cho việc mã thông báo không chính thức. Tốt nhất tôi có thể nói, ví dụ Python không xử lý trường hợp trong đó -
theo sau dấu ngoặc mở, hoặc xuất hiện ở đầu đầu vào. Những người đó nên được coi là thống nhất.
Để thống kê trừ đi được xử lý chính xác trong thuật toán shunting-yard, nó cần phải có ưu tiên cao hơn bất kỳ toán tử nào, và nó cần được đánh dấu là liên kết phù hợp. (Hãy chắc chắn rằng bạn xử lý liên kết phải.Bạn có thể đã bỏ nó ra khỏi phần còn lại của các toán tử của bạn là liên kết bên trái.) Điều này là đủ rõ ràng trong mã Python (mặc dù tôi sẽ sử dụng một số loại struct hơn là hai bản đồ riêng biệt).
Khi có thời gian để đánh giá, bạn sẽ cần phải xử lý các toán tử đơn nhất một chút khác nhau, vì bạn chỉ cần bật một số ra khỏi ngăn xếp, thay vì hai. Tùy thuộc vào việc triển khai của bạn trông như thế nào, có thể dễ dàng hơn trong việc đi qua danh sách và thay thế mọi lần xuất hiện của "-u"
bằng [-1, "*"]
.
Nếu bạn có thể làm theo Python, bạn sẽ có thể thấy mọi thứ tôi đang nói đến trong ví dụ mà tôi đã liên kết tới. Tôi thấy mã dễ đọc hơn phiên bản C mà người khác đã đề cập. Ngoài ra, nếu bạn tò mò, tôi đã viết một chút trong khi quay trở lại sử dụng shunting-yard in Ruby, nhưng tôi xử lý các toán tử đơn nhất như một nonterminal riêng biệt, vì vậy chúng không được hiển thị.
Tôi đã thêm ' java 'tag, tôi nghĩ rằng nó có thể nhận được câu hỏi của bạn nhiều lượt xem hơn. –