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!
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!
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.
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. –
@ 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. –
Istnieje kilka sposobów rozwiązania tego problemu, ponieważ niektóre z nich są w pewnym stopniu hackowskie. – harold
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
@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. –