Daha önce buna benzer birşeyi çalıştığım bir C# Windows Forms projesinde geliştirmiştim. Proje tersanede yapılan gemilerin standartlara uygunluğunu kontrol eden mühendislik hesaplamaları içeren bir projeydi. Haliyle birçok formüller ve kendine has bir Domain olduğu için aynı şeyi tekrar tekrar kod ile yazmaktansa küçük bir dil(DSL) geliştirdik.(Gerçi karar sadece bana kalsa geliştirirmiydim bilmiyorum bknz.
YAGNI)
Nelerden faydalandım neler kullandım bahsedek olursam: Öncelikle Art Of Java kitabındaki örnekten "
Implementing Language Interpreters in Java" bölümünden oldukça yararlandım diyebilirim eğer böyle birşey yapacaksanız bakmanızı tavsiye ederim. Orada kullanılan ve benimde kullandığım yöntem bu konuda oldukça yaygın olarak kullanılan
Recursive Descent Parser algoritmasıydı. Algoritma küçük çaplı diller implemente etmek için uygun ve basit fakat biraz daha büyük çaplı birşey geliştirmek istiyorsanız biraz kodun karmaşıklığının ve geliştirtilmesinin zor olacağını söyleyebilirim.
Tasarım olarak Recursive Descent parser yaklaşımı pek fazla hoşuma gitti diyemem açıkçası. Çünkü dile yeni yapıların eklenmesi biraz zor oluyor.Bu yüzden eğer geliştirilmesi gereken dile daha sonradan çokca ekleme yapılacaksa
Reverse Polish notation(Prefix,Infix) a çevirip ardından
Interpreter Pattern kullanarak geliştirilmesi çok daha esnek olabilir.
Yazma kısmını geçip biraz daha pratik ve modern çözümlere bakalım.Eğer geliştireceğiniz dil daha büyükse Parser oluşturan modern araçlar kullanmanız daha doğru olabilir.Bunlardan benim kullanmadığım fakat oldukça övülen
ANTLR bir parser generator. geliştirilmek istediğiniz dilin yapısını tanımlayarak sizin için bir parser ve interpreter üretmenizi sağlıyor. Java ve .NET kütüphaneleri mevcut. Daha önce bahsedilen Yacc,ve Lex gibi fakat araştırdığım kadarıyla daha modern gördüğüm kadarıyla.
Ayrıca Visual Studio Extensibility ile de DSL projesi geliştirebiliyorsun bir kitap alıp incelemiştim fakat uygulama imkanım pek olmadı. Ordaki DSL ile ilk başta bahsettiğim bir dil gibi DSL geliştiriliyormu onuda pek anlayamadım.
Son olarak konunun oldukça derin olduğunu belirtip
BNF,
AST.. gibi kavramları öğrenmenizide tavsiye ederim. Eğer iyice öğrenirseniz bizede öğretmenizi rica ederim :)