-
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
- Can you activate BMW 48V 10Ah Li-Ion battery, connecting to CAN-USB laptop interface ?
- We Wrocławiu ruszyła Odra 5, pierwszy w Polsce komputer kwantowy z nadprzewodzącymi kubitami
- Ada-Europe - AEiC 2025 early registration deadline imminent
- John Carmack twierdzi, że gdyby gry były optymalizowane, to wystarczyły by stare kompy
- Ada-Europe Int.Conf. Reliable Software Technologies, AEiC 2025
- Linuks od wer. 6.15 przestanie wspierać procesory 486 i będzie wymagać min. Pentium
- ,,Polski przemysł jest w stanie agonalnym" - podkreślił dobitnie, wskazując na brak zamówień.
- Rewolucja w debugowaniu!!! SI analizuje zrzuty pamięci systemu M$ Windows!!!
- Brednie w wiki - hasło Dehomag
- Perfidne ataki krakerów z KRLD na skrypciarzy JS i Pajton
- Instytut IDEAS może zacząć działać: "Ma to być unikalny w europejskiej skali ośrodek badań nad sztuczną inteligencją."
- Instytut IDEAS może zacząć działać: "Ma to być unikalny w europejskiej skali ośrodek badań nad sztuczną inteligencją."
- Instytut IDEAS może zacząć działać: "Ma to być unikalny w europejskiej skali ośrodek badań nad sztuczną inteligencją."
- U nas propagują modę na SI, a w Chinach naukowcy SI po kolei umierają w wieku 40-50lat
- C++. Podróż Po Języku - komentarz
Najnowsze wątki
- 2025-07-12 Warszawa => PC Hardware Expert / Specjalista PC <=
- 2025-07-12 Warszawa => Account Manager - Usługi rekrutacyjne <=
- 2025-07-12 Warszawa => Administrator IT <=
- 2025-07-12 Warszawa => IT Administrator <=
- 2025-07-12 Warszawa => Asystent/tka ds. Administracji <=
- 2025-07-12 Warszawa => Specjalista/stka ds. Organizacji <=
- 2025-07-12 Warszawa => MENA New Business Manager <=
- 2025-07-12 Gdynia => Controlling systems Consultant <=
- 2025-07-12 Warszawa => Developer Microsoft Dynamics 365 Finance & Operations (D36
- 2025-07-12 Warszawa => Programista Microsoft Dynamics 365 Finance & Operations (D
- 2025-07-12 Warszawa => Dyrektor IT <=
- 2025-07-12 Warszawa => IT Director <=
- 2025-07-12 Czy wypowiedź Kaczyńskiego o Braunie jest skarżalna? ["działa z OBCEJ inspiracji"]
- 2025-07-11 Rejestrator temperatur - termopara, siec
- 2025-07-11 DPD, przeniesienie numerów z a2mobile i z Orange