Derleyiciler: İlkeler, Teknikler ve Araçlar (2. Baskı) (aka "Ejderha Kitabı") başlıklı 4.1.4, bölüm 4'teki birkaç makaleyi, makaleyi okudum . Ancak, birkaç modern derleyiciyi denedikten sonra, semantik hatalardan ve sözdizimsel hatalardan da kurtulduklarını gördüm .
Sözdizimsel olarak ilgili hatalardan kurtarma derleyicilerin arkasındaki algoritmaları ve teknikleri oldukça iyi anlıyorum, ancak bir derleyicinin semantik bir hatadan nasıl kurtulabileceğini tam olarak anlamıyorum.
Şu anda benim soyut sözdizim ağacından kod oluşturmak için ziyaretçi desen hafif bir varyasyon kullanıyorum. Derleyicimin aşağıdaki ifadeleri derlediğini düşünün:
1 / (2 * (3 + "4"))
Derleyici aşağıdaki soyut sözdizimi ağacını oluşturur:
op(/)
|
-------
/ \
int(1) op(*)
|
-------
/ \
int(2) op(+)
|
-------
/ \
int(3) str(4)
Kod oluşturma aşaması, daha sonra soyut sözdizimi ağacını özyinelemede dolaşmak ve tür denetimi yapmak için ziyaretçi desenini kullanır. Soyut sözdizimi ağacı, derleyici ifadenin en iç kısmına gelene kadar geçecektir; (3 + "4")
. Derleyici daha sonra ifadelerin her iki tarafını kontrol eder ve anlamsal olarak eşdeğer olmadığını görür. Derleyici bir tür hatası oluşturur. Sorun burada yatmaktadır. Derleyici şimdi ne yapmalı ?
Derleyici Bu hatadan kurtulmak ve ifadelerin dış kısımlarını kontrol türünü devam etmek için, geri dönmek zorunda kalacak bazı tip ( int
veya str
etmek, ifade içteki bölümünü değerlendiren itibaren) bir sonraki ifadenin en iç kısmında. Ancak geri dönmek için bir türü yoktur . Bir tür hatası oluştuğundan hiçbir tür çıkarılmadı.
Tahmin ettiğim olası bir çözüm, bir tür hatası meydana gelirse, bir hatanın yükseltilmesi ve bir tür hatasının oluştuğunu belirten özel bir değerin önceki soyut sözdizimi ağacı geçiş çağrılarına döndürülmesi gerektiğidir. Önceki geçiş çağrıları bu değerle karşılaşırsa, soyut sözdizimi ağacında daha derin bir tür hatası oluştuğunu bilirler ve bir tür çıkarmaya çalışmaktan kaçınmalıdırlar. Bu yöntem işe yarıyor gibi görünse de, çok verimsiz görünüyor. Bir ifadenin en iç kısmı soyut sözdizimi ağacının derinliklerinde ise, derleyici yalnızca gerçek bir işin yapılamayacağını anlamak ve her birinden geri dönmek için birçok özyinelemeli çağrı yapmak zorundadır.
Yukarıda tarif ettiğim yöntem kullanıldı mı (şüpheliyim). Eğer öyleyse, verimli değil mi? Değilse, derleyiciler anlamsal hatalardan kurtulduğunda kullanılan yöntemler tam olarak nedir?