2013-11-27 7 views
8

Czy istnieje lepszy sposób obsługi unarnego "-" w konwersji wyrażenie infiksowe na postfiks?obsługa unarnego minusa dla algorytmu shunting-yard

Oczywisty będzie prefiks każdy unarny "-" z 0. Czy ktoś wie lepiej realizacji? Dzięki!

+0

Istnieje kilka sposobów rozwiązania tego problemu, ponieważ niektóre z nich są w pewnym stopniu hackowskie. – harold

+0

Dwa lata po twoim poście, po prostu miałem to samo pytanie. Jest to pytanie, które zawsze ma znaczenie. Oto spostrzeżenie: Dodanie zera (co również uważałem) nie zawsze będzie działać: Przykład: - 3 zostanie przekonwertowany na 0-3-3 = -6 Większość analizatorów zastosuje minus jako razy minus jeden produkt , która byłaby: - (-3) = 6. Pozdrawiam, – MrVelez

+0

@MrVelez: Masz rację, że prefiksowanie zera nie działa, ale z innego powodu. Wstępne przetwarzanie "- 3" poprzedzające zerowanie powinno dawać "0-0-3" (nie "0-3-3", skąd pochodzą te drugie 3)? Ie ', - 3' -> '0 -, - 3' -> '0-0-, 3' -> '0-0-3,' co powoduje, że przyrostka '0 0 - 3 - ". To oznacza -3, co prawdopodobnie nie jest tym, czego chcemy od -3. \ Jeśli moglibyśmy uzyskać "0-0-3", aby przetłumaczyć na postfiks "0 0 3 - -", to oceniłoby to pożądane 3. –

Odpowiedz

6

Sposób, w jaki robiłem to lata temu, to wymyślić nowego operatora dla mojego wyrażenia postfix. Więc kiedy napotkałem jednoargumentowy minus w infiksie, przekonwertowałem go na #. Więc mój postfix dla a + -b stał się ab#+.

I, oczywiście, mój oceniający musiał wiedzieć, że # wyświetlił tylko jeden operand.

Rodzaj zależy od tego, w jaki sposób używasz wyrażenia Postfiks po jego zbudowaniu. Jeśli chcesz go wyświetlić, twój specjalny operator # prawdopodobnie pomyliłby ludzi. Ale jeśli używasz go wewnętrznie (co ja), to działa świetnie.

+1

Robię to też. Jedyny sposób, w jaki mogę stwierdzić, że "napotkałem jednoargumentowy minus w infiksie", to utrzymywanie kontekstu logicznego, który określa, czy operator lub operand są oczekiwane w następnej kolejności. Chciałbym wiedzieć, co zrobili inni, aby zdecydować, kiedy łącznik jest jednokierunkowy lub binarny. –

+0

@ A.I.Breveleri: Jeśli używasz parsera rekursywno-potomnego do infiksowania, możesz rozpoznać jednoargumentowy operator bez jawnego utrzymywania stanu. Zobacz na przykład http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm. –

Powiązane problemy