-
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
- 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??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
Najnowsze wątki
- 2025-01-19 Test - nie czytać
- 2025-01-19 qqqq
- 2025-01-19 Tauron przysyła aneks
- 2025-01-19 Nowa ładowarka Moya a Twizy -)
- 2025-01-18 Power BANK z ładowaniem przelotowym robi PRZERWY
- 2025-01-18 Pomoc dla Filipa ;)
- 2025-01-18 znowu kradno i sie nie dzielo
- 2025-01-18 Zieloni oszuchiści
- 2025-01-18 Zielonka => Specjalista ds. public relations <=
- 2025-01-18 Warszawa => Frontend Developer (JS, React) <=
- 2025-01-18 Warszawa => Software .Net Developer <=
- 2025-01-18 Warszawa => Developer .NET (mid) <=
- 2025-01-18 Katowice => Administrator IT - Systemy Operacyjne i Wirtualizacja <=
- 2025-01-17 Zniknął list gończy za "Frogiem". Frog się nam odnalazł?
- 2025-01-17 Kto wytłumaczy "głupiemu" prezydentowi Dudzie wielką moc prawną "dekretu premiera" TUSKA? [(C)Korneluk (2025)]