Archiwum dla listopad, 2008

Rozszerzena gcc: Zagnieżdzanie funkcji

Kto wie że kompilator C z kolekcji kompilatorów GNU pozwala na zagnieżdżanie funkcji wewnątrz sobie ? Mechanizm ten obcy języką programowania nie jest, ma go między innymi Pascal… A natknąłem się na to rozszerzenie poszukując podobnego rozszerzenia składni dla C++ (niestety nie ma…). Mały przykład “cp i jak”:

#include <stdio.h>

void funckja() {
    int poziom = 0;
    __GNUC__; void podfunkja() {
        ++poziom;
        __GNUC__; void kolejna_podfunckja() {
            ++poziom;
            printf("Podfunkcja o poziomie zagnieżdzenia: %d\n", poziom);
        }
        kolejna_podfunckja();
    }
    podfunkja();   
}

int main(int argc, char *argv[]) {
    funckja();

    return 0;
}

Kilka uwag:

  • Przed deklaracją zagnieżdzanej funkcji musimy dodać __GNUC__;
  • Maksymalny poziom zagnieżdżenia funkcji to 4
  • Z racji że jest to rozszerzenie języka wprowadzone przez gcc, kod nie skompiluje się na innym kompilatorze…

W drodze do własnego kompilatora: Mój pierwszy analizator składniowy

Edukacje w kierunku “Teoria języków formalnych” rozpocząłem już w wakacje, po trochu nie spiesząc się, z wymuszoną dłuższą przerwą. Główne źródła informacji to wykłady z przedmiotu “Podstawy kompilatorów” oraz książka “Kompilatory – metody, reguły i narzędzia” czy jakoś tak.

Pochwalić się muszę że do tej pory nauczyłem się pisać analizatory leksykalne (wyrażenia regularne, budowanie, generowanie za pomocą leksa) i analizatory składniowe metodą zejść rekurencyjnych. Jak na razie najbardziej praktycznym przykładem jaki udało  mi się zrealizować jest analizator składniowy wyrażeń arytmetycznych składających się z liczb (zarówno całkowitych jak i wymiernych), operatorów dwuargumentowych i nawiasów (Jeśli ktoś chce kod, to pisać na namiary w panelu obok). Myślę że to dobra droga do stworzenie własnego języka programowania i rzeczy z nim związanych.

Ponadto muszę się przyznać że ta dziedzina informatyki szczególnie przypadła mi do gustu.