-
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");
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
- 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??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
- Młodzi programiści i tajna policja
- Ada 2022 Language Reference Manual to be Published by Springer
- Press Release - AEiC 2023, Ada-Europe Reliable Softw. Technol.
- Ada-Europe - AEiC 2023 early registration deadline approaching
- Ada-Europe Int.Conf. Reliable Software Technologies, AEiC 2023
- Ile cykli zajmuje mnożenie liczb 64-bitowych?
Najnowsze wątki
- 2024-05-26 O co chodzi?
- 2024-05-26 PJ autobus-tramwaj
- 2024-05-26 Renault Trafic i lampka z czerwonym STOP
- 2024-05-26 cena pięciocyfrowa
- 2024-05-26 Re: Jak dobra KE "okrada" złą Rosję "dla Ukrainy"
- 2024-05-25 supercap
- 2024-05-25 Sulzbach => Technischer Rollouter (d/m/w) <=
- 2024-05-25 Warszawa => Senior Account Manager <=
- 2024-05-25 Warszawa => Mid PHP Developer (Laravel) <=
- 2024-05-25 Warszawa => Mid PHP Developer (Laravel) <=
- 2024-05-25 Warszawa => Interactive/Experience Designer <=
- 2024-05-25 Warszawa => Key Account Manager <=
- 2024-05-25 Warszawa => SAP WM Consultant / Execution <=
- 2024-05-25 Warszawa => Key Account Manager <=
- 2024-05-25 Re: znów ten wrocław