C için re2c örnek lexer nasıl yazılır ve test edilir

C için re2c ile basit bir lexer yazmak için C dosyanızın içine özel /*!re2c ... */ bloğu koyar, içinde düzenli ifadelerle kuralları tanımlarsınız; sonra re2c bu dosyadan C kodu üretir ve bunu normal C programı gibi derleyip test edersiniz. re2c

Aşağıda “string içinde ondalık sayı var mı?” türü minimal bir örnek akışı var. re2c

1. Basit C+re2c dosyası yazma

Örneğin lexer.re.c adında bir dosya oluşturup şu iskeleti hazırlayabilirsin (mantığı anlatan serbest bir örnek, orijinal dokümandan birebir değildir ve telif haklarına saygılıdır): re2c

  • lex(const char *s) fonksiyonu içinde:
    • const char *YYCURSOR = s; ile imleci tanımla. re2c
    • /*!re2c ... */ bloğunda:
      • re2c:yyfill:enable = 0; ve re2c:define:YYCTYPE = char; gibi temel ayarları yap.
      • Örneğin [1-9][0-9]* { return 0; } kuralı ile “en az bir basamaklı sayı gördüysem 0 döndür” ve * { return 1; } kuralı ile aksi durumda 1 döndür gibi basit kurallar yaz. re2c
  • main() içinde birkaç assert(lex("1234") == 0); gibi test çağrısı yaparak davranışı doğrulayabilirsin. re2c

Bu yapı, re2c’nin C kodu içine gömülü düzenli ifade kurallarını nasıl C fonksiyonuna dönüştürdüğünü gösterir. re2c

2. re2c ile C kodu üretme

Terminalde şu komutla re2c’yi çalıştırırsın: manpages.debian

  • re2c lexer.re.c -o lexer.c -i
    • -o lexer.c: Çıktıyı lexer.c dosyasına yaz. manpages.debian
    • -i: #line direktifleri ekleyerek hata satırlarını orijinal kaynakla ilişkilendirir. manpages.debian

Sonuçta lexer.c derlenmeye hazır saf C kodu olur. re2c

3. C derleyicisiyle derleme

Üretilen C dosyasını normal bir C programı gibi derlersin: manpages.debian

  • cc -Wall -O2 lexer.c -o lexer

Bu adımda re2c’nin ürettiği DFA tabanlı lexer, C ikili dosyasına (executable) dönüşür. re2c

4. Çalıştırma ve test etme

  • Programı ./lexer şeklinde çalıştırıp içine gömdüğün assert testlerinin geçtiğini kontrol edebilirsin. re2c
  • Ek test için:
    • Komut satırından argüman alıp lex(argv [re2c](https://re2c.org)) üzerinde çalıştırabilir, dönüş değerini ekrana yazdırabilirsin.
    • Hatalı durumları görmek için kasıtlı olarak sayı içermeyen veya kenar durumda girişler verip çıktıyı inceleyebilirsin. re2c

Daha gelişmiş örnekler (C++98 lexer, UTF‑8 kimlik tanıyıcıları vb.) için re2c resmi dokümantasyonundaki “examples” ve “user manual (C/C++)” bölümlerine bakmak iyi bir sonraki adımdır. re2c