2012-08-25 19 views
10

Scala 2.10 AST'lerde bir eleman için ardışık olarak arama yapmanın en iyi yolu nedir?Scala İçinde Arama 2.10 ASTs

ağaç power.trees(code) veya mirror.mkToolBox().parseExpr(code) Edit bir sonucu olabilir. 2.10.0-RC1'de parseExpr, parse olarak yeniden adlandırılmıştır.

Elimde kullandığım somut kullanım durumu, bir yöntem/yöntem koduyla bir yöntem kodunu, yöntem adına göre ( ) ayıklamaktaysa da, daha genel bir şekilde formüle edilirse sorunun başkaları için daha uygun olacağını varsayalım. .

cevap

5

Belki özellikle sınıflar Traverser, Trafo ve ikame için yöntemleri (Tree.substituteSymbols, Tree.substituteTypes veya Tree.substituteThis) de, https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 bir göz olmalıdır. Bir ağaçtan bir yöntem çıkarmak isterseniz, Traverser'u kullanabilir ve traverse yöntemini geçersiz kılabilirsiniz. Travers yönteminde, düğümün istediğiniz yöntemle eşleşip eşleşmediğini kontrol edersiniz. Eğer öyleyse, bitirdiniz. Değilse, super.traverse'u arayın.

+1

Bağlantılı kod, gövde ile karşılaştırıldığında oldukça eskidir. İşte doğru bağlantılar: 1) ağaç AST sınıfları: https://github.com/scala/scala/blob/2.10.x/src/library/scala/reflect/base/Trees.scala, 2) transformatörler ve traverserler: https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 –

+0

Oops, teşekkürler ... –

+1

Burada bir transformatör örneği: https://github.com/scala/scala/blob/46d57d47e81c8794a9a3594e080576788cc92324/src/compiler/scala/reflect/reify/phases/Reshape.scala (kod kesinlikle bir temizleme kullanır, ancak bunu görmezden gelmek çok güzel). 'Super.transform' ve' copyAttrs' parçalarını not edin. –

İlgili konular