5

tôi đang tạo ra một cây phân tích cú pháp mà sẽ chứa các biểu thức tương tự nhưunary Và Binary Trừ trong Parse Tree

3 - 4 * 8

hoặc

8 * -5

hoặc

-(10 * 1)

Tôi cần một cách để phân biệt giữa unary và nhị phân trừ đi. Cách ngữ pháp của tôi bây giờ là nhị phân trừ đi đạt được đầu tiên, nhưng tôi đang nghĩ đến việc thay đổi điều đó và thêm một biến cờ giữ biến cuối cùng.

Ex: nếu nó là 5 - 6

Lá cờ đang nắm giữ 5 và nếu nó thấy trừ và cờ là một số các skip unary và đi đến nhị phân.

Tuy nhiên tôi không chắc chắn cách thực hiện điều này trong C++

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn

+1

Bạn có nghĩa là một cách để phân biệt chúng như bạn đang làm phân tích cú pháp, hoặc một cách để phân biệt chúng trong phân tích cú pháp cây? Trong cây phân tích cú pháp, nó tầm thường - chỉ có các toán tử 'UNARY_MINUS' và' BINARY_MINUS' riêng biệt. Nếu bạn có nghĩa là bạn đang phân tích cú pháp, một trừ đi đơn nhất xảy ra khi bạn đang mong đợi một toán hạng, chứ không phải toán tử. –

+0

Trong trình phân tích cú pháp của tôi, tôi muốn nó phân biệt giữa -5 và 4 -5. Phần tiếp theo của tôi chuyển đổi lá của cây này thành cây AST (đang hoạt động) nhưng trình phân tích cú pháp của tôi thấy mọi thứ dưới dạng nhị phân trừ (4 - 5). – Dfranc3373

Trả lời

6

Cách đơn giản nhất để thực hiện một phân tích cú pháp là theo phương pháp Recursive Descent. Hãy chắc chắn để cung cấp cho nhị phân trừ một ưu tiên cao hơn trừ unary, giống như trong các trang web tham khảo:

E --> | E "+" E 
     | E "-" E 
     | "-" E 
     | E "*" E 
     | E "/" E 
     | E "^" E 
     | "(" E ")" 
     | v 
+0

Sau khi xem trang web, tôi có thể viết lại các quy tắc ngữ pháp của mình để tuân thủ các quy tắc của trang web, nhưng một vấn đề với điều này là trình phân tích cú pháp này cũng phải có khả năng xử lý =, < , <=, >,> = và, hoặc, không – Dfranc3373

+0

@ Dfranc3373 xem http://en.cppreference.com/w/cpp/language/operator_precedence cho ưu tiên vận hành hoàn chỉnh cho C++ – TemplateRex

+0

Cảm ơn bạn rất nhiều! – Dfranc3373