2013-11-27 11 views
8

Bir infix ifadesini bir postfix'e dönüştürmede unary "-" işlemek için daha iyi bir yolu var mı?Shunting-yard algoritması için unary eksi işleme

Açık olanı, her unary "-" öneki olur. Daha iyi bir uygulama biliyor mu? Teşekkürler!

+0

Bu soruna birçok çözüm var, afaiklerin hepsi bir kısmına hack oluyor. – harold

+0

Yayınınızdan iki yıl sonra, aynı soruyu yeni aldım. Her zaman alakalı olan bir tür soru. İşte bir gözlem: Sıfır eklemek (benim de düşündüğüm) her zaman işe yaramaz: Örnek: --3, 0 - 3 -3 = -6'ya dönüştürülecektir. Çoğu ayrıştırıcı, eksi bir ürün eksi bir ürün olarak uygular - (-3) = 6. Şerefe, – MrVelez

+0

@MrVelez: Sıfır ön ekinin işe yaramadığını, ancak farklı bir nedenden dolayı doğrudur. Sıfırlama önekiyle '--3' öneklemesi '0-0-3' ('0-3-3' değil, ikinci 3 nereden gelir? ') Vermelidir. Yani, - 3 '->' 0 -, - 3 '->' 0-0-, 3 '->' 0-0-3, 'postfix' 0 0 - 3 ile sonuçlanır - '. Bu -3 için değerlendirir - bu muhtemelen --3'ten istediğimiz şey değildir. Eğer '0-0-3' ifadesini '0 0 3 - -' postfixine çevirebilirsek, o zaman bunu istediğimiz 3. –

cevap

6

Bunu yıllar önce yaptığım gibi postfix ifadem için yeni bir operatör icat etti. Bu yüzden, infix'de bir tane eksi ile karşılaştığımda, onu #'a dönüştürürdüm. Bu nedenle, a + -b için postfixim ab#+ oldu.

Ve tabi ki, değerlendiricim, #'un yalnızca bir işleneni attığını bilmek zorundaydı.

Oluşturulduktan sonra postfix ifadesini nasıl kullandığınıza bağlıdır. Göstermek isterseniz, özel # operatörünüz muhtemelen insanları karıştırır. Ama eğer onu sadece içsel olarak kullanıyor olursanız, o zaman harika çalışır.

+1

olarak değerlendiririm. "İnci'de tek bir eksi ile karşılaştığımı" belirleyebilmemin tek yolu, bir operatörün veya işlenenin bir sonraki aşamada beklenip beklenmeyeceğini tanımlayan bir boolean bağlamını korumaktır. Tire'nin ne zaman ikili veya ikili olduğu konusunda karar vermek için başkalarının ne yaptığını bilmek isterim. –

+0

@ A.I.Breveleri: Eğer infix için özyinelemeli bir ayrıştırıcı kullanırsanız, durumu açıkça sürdürmeden unary operatörü tanıyabilirsiniz. Bkz., Örneğin, http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm. –