C ++ 'ın ayrıştırılması zorlaşıyor. Java'yı ayrıştırmak da zorlaşıyor.
C'nin (ve C ++) neden ayrıştırılmasının "zor" olduğunu tartışan bu SO yanıtına bakın . Kısa özet, C ve C ++ gramerlerinin doğası gereği belirsiz olduğudur; bunlar size birden fazla çözümleme sağlar ve belirsizlikleri çözmek için bağlam kullanmanız gerekir . İnsanlar daha sonra siz ayrıştırırken belirsizlikleri çözmeniz gerektiğini varsayma hatasını yaparlar; öyle değil, aşağıya bakın. Ayrıştırırken belirsizlikleri çözmekte ısrar ederseniz, ayrıştırıcınız daha karmaşık hale gelir ve inşa etmesi çok daha zor hale gelir; ama bu karmaşıklık kendi kendine verilen bir yaradır.
IIRC, Java 1.4'ün "açık" LALR (1) dilbilgisi belirsiz değildi, bu nedenle ayrıştırılması "kolay" idi. Modern Java'nın en azından uzun mesafeli yerel belirsizliklere sahip olmadığından pek emin değilim; "... >>" iki şablonu kapatır mı yoksa bir "sağa kaydırma operatörü" mü olduğuna karar verme sorunu her zaman vardır. Modern Java'nın artık LALR (1) ile ayrıştırılmadığından şüpheleniyorum .
Ancak, her iki dil için de güçlü ayrıştırıcılar (veya C ve C ++ ön uçlarının çoğunlukla yaptığı gibi zayıf ayrıştırıcılar ve bağlam toplama saldırıları) kullanarak ayrıştırma problemi aşılabilir. C ve C ++, bir önişlemciye sahip olmanın ek karmaşıklığına sahiptir; bunlar pratikte göründüklerinden daha karmaşıktır. Bir iddia, C ve C ++ ayrıştırıcılarının çok zor olduğu ve elle yazılmaları gerektiğidir. Doğru değil; Java ve C ++ ayrıştırıcılarını GLR ayrıştırıcı oluşturucularla gayet iyi bir şekilde oluşturabilirsiniz.
Ancak ayrıştırma, sorunun gerçekte olduğu yerde değildir.
Ayrıştırdıktan sonra, AST / ayrıştırma ağacı ile bir şeyler yapmak isteyeceksiniz. Pratikte, her tanımlayıcı için tanımının ne olduğunu ve nerede kullanıldığını bilmeniz gerekir ("ad ve tür çözünürlüğü", dikkatsizce, sembol tabloları oluşturma). Bu, kalıtım, arayüzler, aşırı yükleme ve şablonlarla birleştirilen ayrıştırıcıyı doğru bir şekilde elde etmekten çok daha fazla işe yarıyor ve tüm bunların anlamsallığının onlarca ila yüzlerce sayfaya yayılmış gayri resmi doğal dilde yazılmış olması gerçeğiyle karıştırılıyor. dil standardı. C ++ burada gerçekten kötü. Java 7 ve 8, bu açıdan oldukça kötü olmaya başlıyor. (Ve ihtiyacınız olan tek şey sembol tabloları değil; "Ayrıştırmadan Sonra Yaşam" üzerine daha uzun bir makale için biyografime bakın).
Çoğu insan saf ayrıştırma kısmıyla mücadele eder (çoğu zaman asla bitmez; gerçek diller için çalışan ayrıştırıcıların nasıl oluşturulacağına ilişkin birçok soru için SO'nun kendisini kontrol edin), böylece ayrıştırmadan sonra hayatı asla görmezler. Ve sonra neyin ayrıştırılmasının zor olduğu hakkında halk teoremleri alırız ve bu aşamadan sonra ne olacağı hakkında hiçbir sinyal almayız.
C ++ sözdizimini düzeltmek sizi hiçbir yere götürmez.
C ++ sözdizimini değiştirmeyle ilgili olarak: Herhangi bir C ++ dilbilgisindeki yerel ve gerçek belirsizliklerin çeşitliliği ile ilgilenmek için birçok yeri yamalamanız gerektiğini göreceksiniz. Israr ediyorsanız, aşağıdaki liste iyi bir başlangıç noktası olabilir . C ++ standartları komitesi değilseniz bunu yapmanın bir anlamı olmadığını iddia ediyorum; Bunu yaptıysanız ve bunu kullanarak bir derleyici oluşturduysanız, aklı başında kimse onu kullanmaz. Ayrıştırıcı oluşturan adamların rahatlığı için mevcut C ++ uygulamalarına çok fazla yatırım yapıldı; ayrıca, acıları bitti ve mevcut ayrıştırıcılar iyi çalışıyor.
Kendi ayrıştırıcınızı yazmak isteyebilirsiniz. Tamam sorun değil; sadece topluluğun geri kalanının sizin için daha kolay hale getirmek için kullanmaları gereken dili değiştirmenize izin vermesini beklemeyin. Hepsi kendileri için daha kolay olmasını istiyor ve bu da dili belgelendiği ve uygulandığı şekliyle kullanmak.