Lex (yazılım) - Lex (software)

Lex
Orijinal yazar (lar)Mike Lesk, Eric Schmidt
İlk sürüm1975; 45 yıl önce (1975)
Depo Bunu Vikiveri'de düzenleyin
YazılmışC
İşletim sistemiUnix, Unix benzeri, Plan 9
TürKomut

Lex bir bilgisayar programı bu üretir sözcük çözümleyicileri ("tarayıcılar" veya "lexers").[1][2]

Lex, yaygın olarak yacc ayrıştırıcı oluşturucu. Orijinal olarak yazan Lex Mike Lesk ve Eric Schmidt[3] ve 1975'te tanımlanmıştır,[4][5] standarttır sözcük çözümleyici birçok jeneratör Unix sistemler ve eşdeğer bir araç, POSIX standart.[6]

Lex bir girdi okur Akış sözcüksel çözümleyiciyi ve çıktıları belirleme kaynak kodu lexer'ı C programlama dili C'ye ek olarak, Lex'in bazı eski sürümleri de bir lexer oluşturabilir. Ratfor.[7]

Açık kaynak

Orijinal olarak özel mülk yazılım olarak dağıtılmış olsa da, Lex'in bazı sürümleri artık açık kaynak. Orijinal tescilli kodu temel alan Lex'in açık kaynaklı sürümleri, artık aşağıdaki gibi açık kaynaklı işletim sistemleriyle dağıtılmaktadır: OpenSolaris ve Bell Labs'tan Plan 9. Lex'in popüler bir açık kaynak sürümü esnek veya "hızlı sözcük analizcisi", tescilli kodlamadan türetilmez.

Bir Lex dosyasının yapısı

Bir Lex dosyasının yapısı kasıtlı olarak bir yacc dosyasının yapısına benzer; dosyalar aşağıdaki gibi yalnızca yüzde iki işareti içeren satırlarla ayrılmış üç bölüme ayrılmıştır:

  • tanım bölüm tanımlar makrolar ve ithalatlar başlık dosyaları yazılmış C. Buraya herhangi bir C kodunu yazmak da mümkündür, bunlar üretilen kaynak dosyaya birebir kopyalanacaktır.
  • kurallar bölüm ortakları Düzenli ifade C ile desenler ifadeler. Sözlükçi, girdideki belirli bir örüntüyle eşleşen metin gördüğünde, ilgili C kodunu çalıştıracaktır.
  • C kodu bölüm C ifadeleri içerir ve fonksiyonlar oluşturulan kaynak dosyaya birebir kopyalanır. Bu ifadeler muhtemelen kurallar bölümündeki kurallar tarafından çağrılan kodu içerir. Büyük programlarda, bu kodu şurada bağlantılı ayrı bir dosyaya yerleştirmek daha uygundur. derlemek zaman.

Lex dosyası örneği

Aşağıdaki örnek bir Lex dosyasıdır. esnek Lex sürümü. Girişteki sayı dizilerini (pozitif tamsayılar) tanır ve basitçe yazdırır.

/ *** Tanım bölümü *** /%{/ * Bire bir kopyalanacak C kodu * /#Dahil etmek <stdio.h>%}/ * Bu, flex'e yalnızca bir girdi dosyasını okumasını söyler * /%seçenek noyywrap%%    / *** Kurallar bölümü *** /    / * [0-9] +, bir veya daha fazla basamaktan oluşan bir dizeyle eşleşir * /[0-9]+  {            / * yytext, eşleşen metni içeren bir dizedir. * /            printf("Bir tam sayı gördü:% s n", yytext);        }.|\n    {   / * Diğer tüm karakterleri göz ardı et. * /   }%%/ *** C Kodu bölümü *** /int ana(geçersiz){    / * Lexer'ı çağırın, sonra çıkın. * /    yylex();    dönüş 0;}

Bu girdi verilirse esnek, bir C dosyasına dönüştürülecek, lex.yy.c. Bu, tamsayıların dizeleriyle eşleşen ve çıktı veren bir yürütülebilir dosyada derlenebilir. Örneğin, girdi verildiğinde:

abc123z.! & * 2gj6

program yazdıracak:

Bir tamsayı gördü: 123 Bir tam sayı gördü: 2 Bir tam sayı gördü: 6

Lex'i diğer programlama araçlarıyla kullanma

Lex'i ayrıştırıcı oluşturucularla kullanma

Lex ve ayrıştırıcı üreteçleri, örneğin Yacc veya Bizon, genellikle birlikte kullanılır. Ayrıştırıcı üreteçleri bir resmi gramer bir giriş akışını ayrıştırmak için, Lex'in basit kullanarak yapamayacağı bir şey düzenli ifadeler (Lex basitle sınırlıdır sonlu durum otomatı ).[açıklama gerekli ]

Tipik olarak, bir (Yacc tarafından üretilen, diyelim) ayrıştırıcının, giriş karakter akışını doğrudan tüketmesi yerine, girdi olarak bir belirteç akışıyla beslenmesi tercih edilir. Lex genellikle böyle bir simge akışı üretmek için kullanılır.

Tarayıcısız ayrıştırma giriş karakter akışının ayrı bir sözcük olmadan doğrudan ayrıştırılması anlamına gelir.

Lex ve yap

Yapmak Lex içeren programları sürdürmek için kullanılabilen bir yardımcı programdır. Make, uzantısı olan bir dosyanın .l bir Lex kaynak dosyasıdır. Dahili makro oluşturma LFLAGS make ile otomatik olarak çağrılacak Lex seçeneklerini belirtmek için kullanılabilir.[8]

Ayrıca bakınız

Referanslar

  1. ^ Levine, John R.; Mason, Tony; Brown, Doug (1992). lex & yacc (2 ed.). O'Reilly. pp.1 –2. ISBN  1-56592-000-7.
  2. ^ Levine, John (Ağustos 2009). esnek ve bizon. O'Reilly Media. s. 304. ISBN  978-0-596-15597-1.
  3. ^ Lesk, M.E .; Schmidt, E. "Lex - Bir Sözcüksel Analizör Üreteci". Alındı 16 Ağustos 2010.
  4. ^ Lesk, M.E .; Schmidt, E. (21 Temmuz 1975). "Lex - Bir Sözcüksel Analizör Üreteci" (PDF). UNIX ZAMAN PAYLAŞIM SİSTEMİ: UNIX PROGRAMMER'İN EL KİTABI, Yedinci Baskı, Cilt 2B. bell-labs.com. Alındı 20 Aralık 2011.
  5. ^ Lesk, ME (Ekim 1975). "Lex - Bir Sözcüksel Analizör Üreteci". Comp. Sci. Tech. Rep. No. 39. Murray Hill, New Jersey: Bell Laboratuvarları.
  6. ^ Açık Grup Temel Özellikleri Sayı 7, 2018 baskısı § Shell & Utilities § Utilities § lex
  7. ^ John R. Levine; John Mason; Doug Brown (1992). Lex ve Yacc. O'Reilly.
  8. ^ "Yapmak". Açık Grup Tabanı Özellikleri. IEEE ve Açık Grup (6). 2004. IEEE Std 1003.1, 2004 Basımı.

Dış bağlantılar