eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingProsty preprocesor wielojęzykowy › Prosty preprocesor wielojęzykowy
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask
    .pl!news.nask.org.pl!news.unit0.net!feeder.news-service.com!postnews.google.com
    !glegroupsg2000goo.googlegroups.com!not-for-mail
    From: "godek.maciek" <g...@g...com>
    Newsgroups: pl.comp.programming
    Subject: Prosty preprocesor wielojęzykowy
    Date: Wed, 27 Jul 2011 01:51:12 -0700 (PDT)
    Organization: http://groups.google.com
    Lines: 110
    Message-ID: <2...@g...googlegroups.com>
    Reply-To: p...@g...com
    NNTP-Posting-Host: 89.79.28.27
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-2
    Content-Transfer-Encoding: quoted-printable
    X-Trace: posting.google.com 1311756790 22411 127.0.0.1 (27 Jul 2011 08:53:10 GMT)
    X-Complaints-To: g...@g...com
    NNTP-Posting-Date: Wed, 27 Jul 2011 08:53:10 +0000 (UTC)
    Complaints-To: g...@g...com
    Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=89.79.28.27;
    posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
    User-Agent: G2/1.0
    X-Google-Web-Client: true
    Xref: news-archive.icm.edu.pl pl.comp.programming:191656
    [ ukryj nagłówki ]

    Witam wszystkich serdecznie,
    przeglądając swoje archiwalne kody źródłowe, odkryłem, że napisałem kiedyś prosty
    preprocesor. Pomysł polega na tym, że w pliku źródłowym programu można załączyć linie
    @begin [command]

    @end

    która spowoduje wypisanie linii kodu zawartych pomiędzy znacznikami @begin i @end do
    pliku $< oraz wykonanie polecenia [command] i załączenie treści pliku $> w miejsce
    wystąpienia znaczników

    Przykładowo, ktoś mógłby napisać w perlu (albo dowolnym innym języku) generator kodu
    do języka c:
    #include <stdio.h>

    @begin "perl $< > $>"
    print "int values[] = {\n";
    for($i = 0; $i < 20; ++$i) {
    print " $i,";
    }
    print " $i\n};\n";
    @end

    #define NELEMS(a)(sizeof(a)/sizeof(a[0]))

    int main() {
    int i;
    for(i = 0; i < NELEMS(values); ++i) {
    printf("%d, ", values[i]);
    }
    printf("\n");
    return 0;
    }

    Po przepuszczeniu tego pliku przez preprocesor otrzymalibyśmy

    #include <stdio.h>

    int values[] = {
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
    };

    #define NELEMS(a)(sizeof(a)/sizeof(a[0]))

    int main() {
    ...

    Przykład jest oczywiście zabawkowy, ale sam program napisałem z rzeczywistej
    potrzeby.

    Czy może słyszał ktoś, żeby podobne narzędzie już wcześniej istniało, albo żeby
    realizowanie tego typu pomysłów było radykalnie odradzane przez jakieś
    programistyczne autorytety?

    Dla osób zainteresowanych załączam kod źródłowy programu (w perlu). Nie ma w nim
    jakiejś większej głębi (nawet plik do przetworzenia trzeba podawać przy pomocy
    operatora <, bo program obsługuje tylko standardowe wejście i wyjście). Narzędzie
    można by było oczywiście rozwinąć, dodając np. opcję wyboru znaczników (bo @begin i
    @end mogą się chyba kłócić z Objective-C)

    Pozdrawiam serdecznie!
    Panicz

    elp.pl:
    my @infile = <STDIN>;
    my @modified;

    use File::Temp qw/ tempfile tempdir /;
    sub tempfname {
    my $fh = File::Temp->new(TEMPLATE => 'elpXXXXX', SUFFIX => '.tmp');
    return $fh->filename;
    }

    my $mode = 0; # 0 = regular (unprocessed) part of file, 1 = processed file
    my $command; # your $wish

    my $sourcefile; # $<
    my $destfile; # $>

    my $source = tempfname();
    my $dest = tempfname();

    for($i = 0; $i < @infile; $i++) {
    if($infile[$i] =~ /^\@begin/) {
    $mode = 1;
    $firstquote = index($infile[$i], "\"");
    $lastquote = rindex($infile[$i], "\"");
    $length = $lastquote - $firstquote;
    $command = substr($infile[$i], $firstquote+1, $length-1);
    $command =~ s/\$</$source/g;
    $command =~ s/\$>/$dest/g;
    open($sourcefile, ">$source");
    } elsif($infile[$i] =~ /^\@end/) {
    $mode = 0;
    close $sourcefile;
    system($command);
    open($destfile, "$dest");
    while(<$destfile>) { print $_; }
    close $destfile;
    } elsif($mode == 0) {
    print "$infile[$i]";
    } elsif($mode == 1) {
    print $sourcefile $infile[$i];
    }
    }
    system("rm $source $dest");

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: