2016-04-06 25 views
1

Küçük bir DSL oluşturmaya çalışıyorum, ancak basit şeylerle bile uğraşıyorum. Aşağıdaki komut dosyası bana bir hata veriyor.Groovy yöntemi adlandırma kuralı mı yoksa sihir mi?

def DEMON(String input) { 
    ['a': input] 
} 
DEMON 'Hello thingy' a 

Bazı nedenlerle, parametreler çevresindeki parantezler isteğe bağlı değildir ve bir hata alıyorum. Bu komut dosyası iyi çalışır:

def dEMON(String input) { 
    ['a': input] 
} 
dEMON 'Hello thingy' a 

Not: Tek fark küçük ilk karakteri olduğunu. Peki, burada neler oluyor? Senaryolar neden yorumlanmış (derlenmiş?) Farklı? Takip etmem gereken bir çeşit yöntem/sınıf adlandırma şeması var mı?

Güncelleme: Hata mesajı.

unexpected token: Hello thingy @ line 4, column 7. 
+0

bir sınıf ancak bir yöntem değil anlıyorum ama bir hata hakkında isterken, hata sonrası. –

+0

@JB Nizet Üzgünüz, eklendi. –

cevap

2

harika sözdizimi bazen karmaşıktır ve derleyici bunu ne yapması gerektiğini seçmek için bazı kurallar kullanın: Bir sözdizimi hatası sanırım. Bu kurallardan biri basittir: Bir kelime büyük harfle başlarsa, muhtemelen bir sınıftır.

Örneğin, f String groovy'de geçerli bir sözdizimi ve derleyici f(String.class)'a dönüştürür.

size harika yardımcı olmak için parantez kullanabilirsiniz senin DEMON Herhalde yine cevap vermez DEMON('Hello thingy', a)

+0

Peki, tamam. Yani derleyici, DEMON'u tanımına dayanan bir yöntem olarak belirleyemez mi? Tanımı bir şekilde değiştirebilir miyim, böylece büyük harfli adı saklayabilirim ve parantez kullanmak zorunda kalmam. –

+1

Bunun mümkün olduğunu düşünmüyorum. "Ayrıştırma" aşamasında başarısız olur: semantik veya bağlamın kullanılmadığı ilk AST aşaması. Dilbilgisi bu yapıyı reddeder. –