Neden ayrı lexing ve ayrıştırma?


15

Durum makinesinden tek geçiş kullanarak bir belgeyi ayrıştırmak mümkündür. İki geçişe sahip olmanın yararı nedir, yani. metni jetonlara dönüştürmek için bir lexer ve bu jetonlardaki üretim kurallarını test etmek için bir ayrıştırıcıya sahip olmak? Neden üretim kurallarını doğrudan metne uygulayan tek bir geçişiniz olmasın?



2
Bu zaten CS, stackexchange üzerinde tartışıldı , lexer + ayrıştırıcının Etkileyici gücüne bir cevap olarak birçok teknik yorum . Ancak başka cevaplar için yer olabilir.
babou

Boru hattı tarzı paralelliğin (oldukça dengesiz aşamalar da olsa) bir yan avantaj olup olmadığını merak ediyorum. Hem talimat hem de veri önbellek davranışı ilginç olabilir. Böyle bir durumda derleme süresini ne kadar azaltacağı belirli donanıma bağlıdır.
Paul A. Clayton

Oldukça açık olan (en azından benim için) bir sebep, tarayıcı aracını ayrı olarak kullanabilmenizdir. Pratikte, girişi taramak için sık sık flex kullanıyorum, ancak nadiren yacc'nin tam gücüne ihtiyacım var.
jamesqf

Yanıtlar:


13

Onları ayırmanıza gerek yok. İnsanlar onları tarayıcısız ayrıştırıcılarla birleştiriyor .

Tarayıcısız ayrıştırıcıların temel dezavantajı, ortaya çıkan gramerlerin oldukça karmaşık olduğu anlaşılmaktadır - lexing yapan normal bir ifadenin ve token akışında ayrıştırma yapan bağlamsız bir gramer kombinasyonundan daha karmaşıktır. Özellikle, tarayıcısız ayrıştırma dilbilgisi belirsizliğe yönelir. Bir token akışında çalışan gramerler için belirsizliği kaldırmak daha kolaydır.

Özel bir açık lexing aşaması kullanmanın pragmatik bir yararı, sonraki ayrıştırıcıyı sözlük ayrıntılarıyla birleştirmemenizdir. Bu, sözcüksel ve sözdizimsel ayrıntıların hala sık sık değiştiği erken programlama dili gelişimi sırasında faydalıdır.


1
TPPPT

@babou Evet, doğru. LL (k) ile bestelenen düzenli ifade formunun LL (k) veya benzeri bir formdan çıktığı biçimsel bir sonuç bilmiyorum. Dahası, lexing genellikle normal dillerle değil, daha güçlü, yani en uzun eşlemeli ve anahtar kelime ilk öncelikleriyle genişletilen normal dillerle yapılır. Tam olarak hangi dil sınıfının ve kapanış özelliklerinin ne olduğundan emin değilim.
Martin Berger

2
İleriye doğru bakmanız bir tanımlayıcıyı okumayı içeriyorsa, (ilke olarak) tanımlayıcıların uzunluğuna bağlı olmadığı için kompozisyon sınırsız ileriye doğru bakmayı gerektirir.
babou

@babou Emin değilim. En uzun anahtar kelime 17 karakter uzunluğundaysa, daha uzun olan herhangi bir dize bir tanımlayıcı veya sözlü olarak geçersiz olmalıdır.
Martin Berger

Ancak, tanımlayıcı veya muhtemelen bir dize, sayı veya başka bir değişmez değer, gerçekten ihtiyacınız olan simgeden önce duran 17'den fazla sembolden oluşan bir dizidir. Bu büyük bir ileri, sınırsız. Sonunda belirleyici olmayan bir dil elde edebilirsiniz.
babou
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.