Ayrıştırıcı (yazılım)

Ayrıştırıcı (İngilizce parser), girdi verilerini (çoğunlukla metin) alır ve girdinin yapısal bir temsilini vererek, süreçte doğru sözdizimini kontrol eden bir veri yapısı (çoğunlukla ayrıştırma ağacı, soyut sözdizimi ağacı veya diğer türlü bir hiyerarşik yapı) oluşturan bir yazılım bileşenidir. Ayrıştırma öncesinde veya sonrasında başka adımlar izlenebilir veya bunlar tek bir adımda birleştirilebilir. Ayrıştırıcı, genelde girilen karakter dizisinden belirteçler oluşturan ayrı bir sözcük tabanlı analiz motorunu takip eder. Ayrıştırıcılar elle programlanabilir veya bir ayrıştırıcı üreteci tarafından otomatik olarak veya yarı otomatik olarak oluşturulabilir. Ayrıştırma, biçimlendirilmiş çıktı üretimlerini tek bir şablonda tamamlama görevi görür. Bunlar, farklı etki alanlarına uygulanabilir, ancak bir derleyicinin girdi ve çıktı aşamaları gibi genellikle bir arada sunulur.
Bir ayrıştırıcıya yapılan girdi genellikle bazı programlama dilindeki metin olmakla birlikte doğal bir dildeki metin ya da daha az kapsamlı metin verileri de olabilir; bu durumda, ayrıştırma ağacı oluşturulmadan, metnin yalnızca belirli bölümleri çıkarılır. Ayrıştırıcılar, scanf gibi çok basit işlevleri, bir C++ derleyicisinin arayüzü veya bir web tarayıcısının HTML ayrıştırıcısı gibi karmaşık programları içerir. Basit bir ayrıştırma sınıfının büyük bir kısmı, düzenli ifadeler ve bir düzenli ifade motoru kullanılarak yapılır; bu da örüntü eşleme ve metin çıkarma işlemine izin verir. Diğer durumlarda düzenli ifadeler ayrıştırmadan önce, lexing adımı (daha sonra ayrıştırıcı tarafından çıktısı kullanılmak üzere) kullanılır.
Ayrıştırıcıların kullanımı girdiye göre değişmektedir. Veri dillerinde, bir ayrıştırıcı, programın HTML veya XML metninde okuma işlemi gibi dosya okuma özelliği olarak bulunur; ancak burada kullanılan diller işaretleme dilleridir. Programlama dillerinde bir ayrıştırıcı, dahili bir programlamanın bazı biçimlerini oluşturmak için bilgisayar programlama dilinin kaynak kodunu ayrıştıran derleyicinin veya yorumlayıcının bir bileşenidir. Çözümleme işlemi derleyici önyüzünde önemli bir adımdır. Programlama dilleri deterministik bir bağlamdan bağımsız dil bilgisi ile belirtilmeye eğilimlidir çünkü bunlar için hızlı ve etkili ayrıştırıcılar yazılabilir. Derleyiciler için, ayrıştırmanın kendisi bir geçiş işlemiyle veya birden çok geçiş işlemiyle yapılabilir (tek geçişli derleyici ve çok geçişli derleyici).
Tek geçişli bir derleyicinin dezavantajları, ileriye doğru geçiş sırasında düzeltme işlemleri için hazırlanan bir denetim mekanizması eklenmesiyle önlenebilir ve girdi olarak verilen kod parçacıklarının mevcut program olanaklarına sahip olduğu durumda düzeltmeler geriye uygulanır. Böyle bir düzeltme mekanizmasının yararlı olacağı bir örnek, GOTO ifadesi verilebilir. Program parçacığı tamamlanıncaya kadar bilinmeyen ve ileriye yönelik bir GOTO ifadesi olduğunu varsayalım. Bu durumda, düzeltmenin uygulanmasıyla, GOTO'nun hedefi tanınıncaya dek ertelenecek ve böylelikle kod parçacığı döngüden çıkarılacaktır. Buna paralel olarak, geriye yönelik bir GOTO'nun düzeltilmesi gerekmemektedir ve bunun için yapılacak bir denetim gereksiz bir kısıtlama gibi görünmektedir.
Bağlamdan bağımsız sözdizimleri, bir dilin tüm gereksinimlerini ne ölçüde ifade edebilecekleri ölçütüyle sınırlıdır. Biçimsel olmayan dillerin hafızası sınırlı olmaktadır. Dil bilgisi, keyfi olarak seçilen bir yapının uzun bir girdinin içerisindeki varlığını hatırlayamaz; Bu duruma örnek olarak, bir değişkenin atıfta bulunulmadan önce tanımlanmasını gerektiren diller verilebilir. Bununla birlikte, bu kısıtlamayı ifade edebilen daha güçlü gramer yapıları ise verimli bir şekilde ayrıştırılamaz. Bu nedenle, istenen dil yapılarının bir üst kümesini baz alan (yani, bazı geçersiz yapıları da dahil eden) bağlamdan bağımsız bir dil bilgisi sayesinde, rahat bir ayrıştırıcı oluşturmak yaygın bir kullanımdır. Bu sayede hem kolay ayrıştırılabilir bir dil oluşturulabilir ve istenmeyen yapılar anlamsal analiz ya da bağlamsal analiz adımında filtrelenebilir.
Örneğin, Python'da aşağıdaki ifade sözdizimsel olarak geçerli bir koddur:x = 1
print(x)Bununla birlikte, aşağıdaki kod, bağlamdan bağımsız dil bilgisi açısından sözdizimsel olarak geçer ve önceki ile aynı yapıya sahip bir sözdizimi ağacı üretir; ancak bağlam-duyarlı dil bilgisi açısından sözdizimsel olarak geçersizdir; kullanılmadan önce bu değişkenlerin tanımlanmış olmasını gerektirir:x = 1
print(y)Kod parçacıkları ayrıştırma aşamasında analiz edilmek yerine, denetim mekanizması söz dizimi ağacındaki değerleri kontrol ederek ve dolayısıyla kod parçacıklarını anlamsal analizin bir parçası olarak yakalamaktadır: Bağlama duyarlı söz dizimi pratikte genellikle anlambilimsel olarak daha kolay analiz edilmektedir.
Bilgisayar bilimi