Ana Sayfa

Ters Parantezler: Programlama Dillerinde Anti-Gruplama

1 dk okuma

Programlama dillerinde parantezlerin işlenenleri gruplamak için kullanıldığını biliyoruz, peki ya onları ayırmak için kullansaydık? Bu makale, 'ters parantezler' veya 'anti-gruplama' adı verilen bu ilginç konsepti ele alıyor. Geleneksel dilbilgisi kurallarına göre bir ifadeyi parantezlerle gruplamak nispeten kolayken, tam tersi bir işlemi gerçekleştirmek, yani bir ifadeyi parantezlerle 'gruplamadan çıkarmak', çok daha karmaşık bir sorun teşkil ediyor. Çünkü ayrıştırma işlemi, parantezlerin yapısını takip edemezdi, zira amaç tam da bu yapının dışına çıkmaktı. Saf bir ayrıştırıcının bu işi yapıp yapamayacağı belirsizliğini korurken, yazar farklı bir yaklaşım denemeye karar veriyor.

Bu soruna çözüm bulmak için Python'ın ayrıştırma mekanizmasından ilham alınıyor. Python'ın tokeniser'ı, girinti seviyelerini takip ederek özel INDENT ve DEDENT token'ları ekler ve parantez içindeyken girintinin anlamını bastırır. Makalede önerilen yöntem de benzer bir prensibe dayanıyor: tokeniser, parantez yuvalama derinliğini izleyecek ve her token için bir 'dostluk puanı' (friendliness score) atayacak. Bu puan, token akışına dahil edilecek ve ayrıştırıcı, operatörleri bu dostluk puanının artan sırasına göre işleyecektir. Bu sayede, parantezler token akışında kalsa da, ayrıştırıcının görevi sadece yanlış yerleştirilmiş parantezleri tespit etmekle sınırlı kalacak; gruplama tamamen token akışına gömülü öncelik seviyeleri tarafından yönetilecektir.

Bu yaklaşım, ayrıştırma sorununu çözse de, dilde sonsuz sayıda öncelik seviyesi yaratma gibi yeni bir zorluk ortaya çıkarıyor. Geleneksel özyinelemeli iniş ayrıştırıcıları için bu durum karmaşık olsa da, 'öncelik tırmanma ayrıştırıcısı' (precedence climbing parser) bu tür senaryoları ele almak için uygun bir çözüm sunuyor. Bu ayrıştırıcılar, operatörleri karşılaştıkları sıraya göre işleyebildikleri için sonsuz öncelik seviyeleriyle başa çıkabilirler. Sonuç olarak, bu 'saçma' ama işlevsel sistem, (1 + 2) * 3 gibi bir ifadenin 1 + 2 * 3 olarak yorumlanmasına olanak tanıyarak, programlama dillerinin sözdizimi tasarımına farklı bir bakış açısı getiriyor.

İçgörü

Programlama dillerinde parantezlerin geleneksel gruplama işlevinin ötesine geçerek 'anti-gruplama' kavramını tokeniser seviyesinde ele alması, dilbilgisi tasarımına yenilikçi bir bakış açısı sunuyor.

Kaynak