Ayrıştırıcının çıktısı ağaç mı olmalı yoksa genel grafik de olabilir mi?
Dahası, sözdizimleri için ağaçlar yerine genel grafik temsilini kullanan mevcut bir dil veya makul bir dil var mı?
Ayrıştırıcının çıktısı ağaç mı olmalı yoksa genel grafik de olabilir mi?
Dahası, sözdizimleri için ağaçlar yerine genel grafik temsilini kullanan mevcut bir dil veya makul bir dil var mı?
Yanıtlar:
Ayrıştırıcının çıktısının ağaç olması gerekmez. Gerçekten de, bir değişkenin USE'sinden soyut sözdizimi ağacının üzerine yerleştirilen DEFinition'a yapılan referanslar gibi şeyleri düşündüğünüzde, hemen bir grafiğiniz olur.
Mesele şu ki, ayrıştırma genellikle tek bir geçişte gerçekleşecek şekilde tasarlanmıştır - bu, alan eksikliği ve işlemci hızı gibi tarihsel nedenlerden dolayı önemliydi, aynı zamanda akıl yürütmenin daha basit olduğu için. Daha sonraki aşamalar ayrıştırma ağacını ek bilgilerle süsler.
Grafik dilbilgisi gibi şeyler var, ancak programlama dillerini ayrıştırmak için kullanılıp kullanılmadıklarını bilmiyorum.
OP'nin sorusu biraz geriye dönük. Tabii ki, bir ayrıştırma algoritması istediği her şeyi çıkarabilir. Soru, ayrıştırmanın ne için olduğunu ve ayrıştırıcının bu hedefe ulaşan bir sonuç çıkıp çıkmadığını anlamaktır. O zaman bir ağaç veya grafik gibi bunun için uygun temsilin ne olduğunu merak edebiliriz.
Sanırım bir ayrıştırıcı, dilin sözdiziminin belirli bir resmi tanımına göre, girdi olarak verilen bir cümlenin sözdizimsel yapısını verecek bir algoritmadır.
İnsanların dilin sözdizimini neyin oluşturduğuna katılmayabileceğini unutmayın. Bazıları bunu saf bir biçimsel dil omurgasıyla sınırlayabilir, bazıları ise tür, tür, sayı veya daha karmaşık olanlar gibi biraz daha anlamsal düşünceler getirebilir (NLP veya programlama dillerini ayırt etmiyorum). Çoğu dil, grafiklerin temsil edilmesini gerektiren özelliklere sahiptir, ancak sözdizimine dahil etmek isteyip istemediğine karar vermek "uygulayıcı" ya (daha iyi bir kelime olmaması nedeniyle) bağlıdır.
Dolayısıyla, söz dizimini ne olarak tanımladığınıza bağlı olarak, farklı türde bir biçimsel yapı çıkarmanız gerekebilir.
Basit Bağlamdan bağımsız ayrıştırma durumunda, aşağıda ele alınan belirsizlik sorunu veya bir AST almak için biraz değiştirmek isteyebileceğiniz durumlar dışında bir ayrıştırma ağacı yapabilir (aşağıya bakın).
Bununla birlikte, daha karmaşık durumlarda, genellikle ağaçtaki bağlantılarla temsil edilen ve böylece bir grafik yapısına yol açan farklı yapılara ihtiyacınız olabilir. Bu büyük ölçüde dil sözdizimi tanımınıza bağlıdır.
Ayrıca, hangi ağacı vermeniz gerektiği açık değildir. Eğer ağaç bitişik gramerler (TAG) söz konusuysa, sözdizimi ağacı türetme ağacı ile aynı olmayacak şekilde çalışır, ancak birincisi ikincisinden türetilebilir. Hangi çıktıyı almak istediğiniz ilgili bir soru olabilir.
Belirsizlikle ilgili başka bir konu daha var. Belirli bir cümle, dilinize ait olsa da, bunu birçok farklı şekilde yapabilir, birçok farklı yolla sözdizimsel bir yapıya atanabilir.
Daha sonra rastgele veya iyi tanımlanmış bir kritere göre (örneğin benzerlik) seçilen bu yapılardan sadece birini çıkarmayı seçebilirsiniz. Bunların birkaçını veya tümünü çıktısını almayı da seçebilirsiniz. Birkaç çıktı almak istiyorsanız, genellikle ortak olan şeyleri paylaşacak benzersiz bir yapıda paketlemek uygundur. Bu yerden ve bilgi işlem zamanından ve karmaşıklığından tasarruf etmek gerçek bir sorun olabilir.
Hepsini çıkarmayı seçtiğinizde, paylaşmaktan başka seçeneğiniz yoktur, çünkü sonsuz sayıda olası ayrıştırma olabilir. Ve sonsuz bir şekilde sadece bir grafikte bir döngüye sahip olarak temsil edilebilir. Yani genel olarak bir grafik yapısı üretmelisiniz. Ancak bu grafik yapısının özellikleri, seçtiğiniz resmi sözdizimi türüyle ilişkilidir.
Şimdi soru da Soyut Sözdizimi Ağaçları ile ilgili idi. Kargaşa getireceğinden "soyut" kısmı atladım, imho. Gerçekten de, soru çeşitli düzeltmelerinde zaten kafa karıştırıcıdır.
Tarihsel açıdan AST ile ilgili olarak, 1960-1970 yıllarında Lisp dili ve program manipülasyon sistemleri ile başlarlar. Fikir, programları hem manipülasyon amaçlı hem de özellikleri analiz etmek veya anlambilimi resmi bir şekilde tanımlamak için matematiksel formüller olarak büyük ifadeler, matematiksel formüller üzerinde nasıl yapılacağını bildikleri düşünmekti. Formüller olarak, doğal olarak ağaç yapılıydılar, ancak bu ağaçları grafiklere dönüştüren çeşitli bilgilerle dekore edilebilirler. Bu hem resmi hem de pragmatik olarak kullanışlıdır ve derleyiciler ve programlama sistemleri tarafından da kullanılmıştır.
Yani temelde, AST adından da anlaşılacağı gibi bir ağaçtır, ancak daha fazla bilgi taşıyabilir. Gerisi uygulayıcının tercihlerinde ve izleyicinin gözünde. Bir grafik mi yoksa süslü bir ağaç mı? Ancak, temel AS ağacı önemlidir, çünkü bu hem teoride hem de programlamada inşa ettiğiniz iskele.
AST'nin, biçimsel dil teorisinde çalışıldığı gibi ayrıştırma algoritması tarafından üretilen ayrıştırma ağacından (sözdiziminin bağlamdan bağımsız olduğu) farklı olduğunu unutmayın. Bunun nedeni, sözdiziminin tasarımının zamanın ayrıştırma teknolojisi tarafından, mevcut düşük bilgi işlem gücü ile kısıtlanmış olmasıydı. Sonuç, sözdizimi ağaçlarının yalnızca programın yapısını doğal olarak dikkate alacağı şeyin işkence varyantları olmasıydı ve AST olarak daha temiz ve daha basit bir versiyon elde etmek için temel resmi ayrıştırma işleminin gerçek bir parçası olmayan daha fazla işlemin gerçekleştirilmesi gerekti.
Bununla birlikte, soyut olsun ya da olmasın, bilgisayardaki ağaçların temsili, belirsiz bir cümlenin tüm yapılarını temsil etmek istediğinizde biraz kısıtlıdır. Özellikle, bu karmaşıklık sorunlarını gizler. Ayrıştırma ağaçlarından AS Ağaçlarına çeviri yaparken grafik yapısındaki belirsizliklerin korunması da bir sorun olabilir. Bununla birlikte, bununla ilgili endişeleriniz varsa, beton sözdiziminizi, ayrıştırma ağacının AST olarak hizmet edebileceği şekilde tanımlamak genellikle mümkündür. Buna, belirsizliği ele alan çok genel algoritmalar ve mevcut bilgisayarların gücü izin verir.
GLR ayrıştırma (Genelleştirilmiş LR) kullanarak ayrıştırırsanız ve girdinin ayrıştırması belirsizse (girdiyi ayrıştırmanın birden çok yolu varsa), ayrıştırma sonucu bir ayrıştırma DAG'si olarak düşünülebilir. ayrıştırma ağacı. Ayrıştırma DAG, olası birçok ayrıştırmayı kompakt bir şekilde kodlar: olası çoklu ayrıştırma ağaçları.
Bununla birlikte, alt satırda, bağlamsız bir dilbilginiz varsa ve giriş dizeniz açıkça ayrıştırılabilirse (bu giriş dizesini üreten dilbilgisinde yalnızca tek bir türetme varsa) ve ayrıştırma işi üretmekse bu türetme ... o zaman bu koşullar altında, ayrıştırma çıktısı her zaman mutlaka bir ayrıştırma ağacı olacaktır, çünkü bağlamsız bir dilbilgisi üretimi doğal olarak bir ağaç yapısına sahiptir.
Bir zamanlar C için bir tercüman yazdım, burada + = operatörü için "AST" (örneğin) bir ağaç değildi. Düşünün a[i++] += d
nerede a[i++]
olduğunu int
ve d
bir double
. Örtük dönüştürme ve getirme işlemleri ağaçta açıktı, bu yüzden sorun getirme işleminin nereye yerleştirileceği a[i++]
ve dönüşümün ikiye katlanması. Bizim çözümümüz ağaçları terk etmekti. Ortaya çıkan "ASG" şöyle görünüyordu
+=
/ | \
/ | \
/ | \
/ convert \
| | \
| fetch fetch
| / |
index d
/ \
a postinc
|
i
Soyut olan ağaç olmadığını fark edene kadar kendim şaşkındım, ne soyut bir "sözdizimi ağacı" ile ilgili değil, sözdizimi de soyut.
Bu nedenle, sorunuzu cevaplamak için soyut bir sözdizimi ağacının yanı sıra somut bir sözdizimi ağacının veya bir karar ağacının veya başka bir ağacın bir ağaç olması gerektiği sonucuna varıyorum.
Öte yandan, hiçbir şey kimsenin soyut bir sözdizimi grafiği veya soyut bir sözdizimi diyagramı veya soyut bir sözdizimi küpü veya soyut bir sözdizimi belirtimi kullanmasını engellememelidir.
Sanırım "soyut sözdizimi ağacının" soyut bir sözdizimi ağacının karışıklıktan kaçınmama yardımcı olacağını düşünüyorum.