Düzenli İfadeler Olmadan Sözcüksel Analiz


9

Çeşitli üst düzey dillerde ( Python , PHP , diğerleri arasında Javascript ) birkaç lexer bakıyordum ve hepsi bir şekilde veya başka bir şekilde düzenli ifadeler kullanıyor gibi görünüyor. Regex'in muhtemelen bunu yapmanın en iyi yolu olduğundan emin olmakla birlikte, düzenli ifadeler olmadan temel lexing elde etmenin herhangi bir yolu olup olmadığını merak ediyordum, belki bir çeşit doğrudan dize ayrıştırma falan.

Peki evet, herhangi bir biçimde düzenli ifadeler kullanmadan daha üst düzey bir dilde * bir tür temel sözcük uygulaması yapmak mümkün müdür?

* Üst düzey diller Perl / PHP / Python / Javascript vb. Şeylerdir. Eminim C yapmak için bir yol var


2
Görünüşe göre "matematik hakkında tüm Yunan harflerini ve garip kıvrımlı şeyleri kullanmayan bir kitap var mı?"
kevin cline

@kevincline Gökyüzünde mükemmel derecede iyi uçaklar olduğunda insanlar neden Atlantik boyunca kürek çekiyor?
Leke

1
kürek çekme ve sürme farklı yan etkilere sahiptir.
kevin cline

Yanıtlar:


3

Her şeyden önce, "üst düzey" dillerin icat edilmeden önce C için düzenli ifade kütüphaneleri vardı. Sadece söylemek gerekirse, C programları bazı insanların düşündüğü kadar podunk değildir.

Çoğu dilbilgisi için lexing, boşluk ve () [] {}; kelimeleri bölmek ve daha sonra eşleşme olup olmadığını görmek için bir anahtar kelime listesiyle eşleştirmek.


1
C'nin regex'leri yapamayacağı anlamına gelmiyordum, bu tür şeyler yapmak için daha güçlü özelliklere sahip demek istedim. C'de gelişmiş ve performanslı bir lexer oluşturmanın daha üst düzey bir dilden daha kolay olduğunu hayal ediyorum.
Leke

1
@sam bir lexer veya ayrıştırıcının karmaşıklığı ve performansı, ayrıştırılan dilin karmaşıklığının, ayrıştırıcının uygulandığı dilden daha fazla bir fonksiyonudur, bu nedenle hayır.
jk.

+1. Bir lexer inanılmaz derecede basittir; sadece bir dizeye, belirteçleriniz için bir veri türüne ve önceden tanımlanmış anahtar kelimeler tablosuna ihtiyacınız vardır. En zor kısım, boşluk ve yorumlarla uğraşıyor: P
Mason Wheeler


1

Normal ifadelerle ilgili özel bir şey yok. Bunlar, kodu daha kolay oluşturmanıza olanak tanıyan kısa strestir ve uygulamalar genellikle gönderilir. Bununla birlikte, temelde, sözlükler FSM'lerdir ve düzenli ifadeler bu hedefe ulaşmanın sadece bir yoludur.


0

Elbette diğer ayrıştırıcıları da kullanabilirsiniz, çünkü her normal dil bağlamdan bağımsızdır. Soru gerçekten neden isteyeceğinize iniyor.

Normal ifadelerden daha basit bir şey yoktur (O (N) 'yi nasıl geliştirebilirsiniz?) Ve basitleştirmeye çalışmak yardımcı olmaz. Jetti'nin işaret ettiği gibi, her zaman basit geri izlemeyi kullanabilirsiniz, ancak mümkünse kaçınmanızı öneririz.

Lexing için daha gelişmiş bir ayrıştırıcı kullanacaksanız, muhtemelen bir lexing aşamasına ihtiyacınız yoktur. Aslında, bir lexing aşamasına sahip olmamızın nedenleri, lexed jetonlarını ayrıştırmanın karakterleri ayrıştırmaktan daha hızlı olmasının yanı sıra, ayrıştırma adımımızı büyük ölçüde basitleştirmesidir. Daha gelişmiş bir ayrıştırıcı kullanarak, ilk etapta lexing'in tüm avantajlarını kaybedersiniz.


Regex bunu nasıl yapıyor? Hala karakter karakter gitmek zorunda kalmaz mıydı (en azından sözlükte kullanılan çoğu model için)?
Şubat'ta Jetti

@Jetti Evet, elbette.
Pubby

Her bir karakteri okumak ve daha sonra bir jeton çıkarmak için gerekirse geri gitmek kadar kolay olacaktır. Daha fazla kod olurdu ama daha zor değil.
Şubat'ta Jetti

@Jetti Naif geri izlemenin ne kadar iyi olduğunu göremiyorum.
Pubby

Hiç daha iyi söylemedim. Ancak OP başka yollar olup olmadığını sordu ve bu gelişmiş bir ayrıştırıcı olmayan başka bir yol.
Jetti

0

Düzenli ifadelerle sözcüksel bir analiz yapmak veya bu geçişi hiç atlamak ve PEG veya GLR ile çok daha esnek ve güçlü bir sözcüksüz ayrıştırma yapmak mantıklıdır.

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.