-
Data: 2011-07-27 08:51:12
Temat: Prosty preprocesor wielojęzykowy
Od: "godek.maciek" <g...@g...com> szukaj wiadomości tego autora
[ pokaż wszystkie 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");
Następne wpisy z tego wątku
- 27.07.11 13:04 Adam Przybyla
- 27.07.11 13:39 Mariusz Marszałkowski
- 27.07.11 22:03 godek.maciek
- 29.07.11 19:10 Mariusz Marszałkowski
- 30.07.11 12:52 Spec
- 02.08.11 04:43 Mariusz Marszałkowski
- 03.08.11 01:01 godek.maciek
- 03.08.11 02:00 A.L.
Najnowsze wątki z tej grupy
- Alg. kompresji LZW
- Popr. 14. Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
Najnowsze wątki
- 2025-02-25 Tak wiem.... To oczywiste ale jak oni dzisiaj dziadują na materiale
- 2025-02-25 rozliczenia policji
- 2025-02-25 Echhhhhh. Marzy mi się SWAP Audi A2 z 1.8 T ;-)
- 2025-02-25 Warszawa => Analityk Biznesowo-Systemowy <=
- 2025-02-25 Warszawa => SQL Developer <=
- 2025-02-25 Zbigniew Ziobro śmie sugerować "niedostatki niezawisłości" sędzi (wątpliwości co do bezstronności)
- 2025-02-25 Kraków => DevOps Engineer (Junior/Regular) <=
- 2025-02-25 Kraków => Front-end Developer <=
- 2025-02-25 Szpital
- 2025-02-24 Gniazdo + wtyk
- 2025-02-24 Dyrektor Toyoty miał rację. Elektryki to ślepa uliczka
- 2025-02-24 Białystok => System Architect (Java background) <=
- 2025-02-24 Białystok => System Architect (background deweloperski w Java) <=
- 2025-02-24 Białystok => Solution Architect (Java background) <=
- 2025-02-24 Warszawa => Data Engineer (Tech Leader) <=