Jest to polecenie cpphs, które można uruchomić u dostawcy bezpłatnego hostingu OnWorks przy użyciu jednej z naszych wielu bezpłatnych stacji roboczych online, takich jak Ubuntu Online, Fedora Online, emulator online systemu Windows lub emulator online systemu MAC OS
PROGRAM:
IMIĘ
cpphs - zliberalizowany preprocesor podobny do cpp dla Haskell
STRESZCZENIE
cppph [NAZWA PLIKU|OPCJA] ...
OPIS
cppph jest zliberalizowanym ponownym wdrożeniem Cpp (1) preprocesor C, w i dla
Haskella.
Po co ponownie wdrażać cpp? Słusznie czy nie, preprocesor C jest szeroko stosowany w Haskell
kod źródłowy. Umożliwia kompilację warunkową dla różnych kompilatorów, różnych
wersje tego samego kompilatora i różne platformy systemu operacyjnego. Jest również sporadycznie używany
za język makr, który może umożliwiać pewne formy szczegółów specyficznych dla platformy-
wypełnianie, takie jak żmudne, szablonowe generowanie definicji instancji i FFI
deklaracje. Jednak z cpp są dwa problemy, poza oczywistą estetyką
te:
W przypadku niektórych systemów Haskella, w szczególności Hugs w systemie Windows, prawdziwy cpp nie jest dostępny przez
domyślna.
Nawet dla innych systemów Haskella, wspólny cpp dostarczany przez serię gcc 3.x
zmienia się subtelnie w sposób, który jest niezgodny ze składnią Haskella. Nie ma
zawsze były problemy z, na przykład, przerwami w ciągach znaków i znakami pierwszymi w
identyfikatory. Te problemy będą się tylko pogłębiać.
Wydawało się więc słuszne, aby spróbować zapewnić alternatywę dla cpp, obie bardziej zgodne z
Haskell i sam napisany w Haskell, aby mógł być rozpowszechniany z kompilatorami.
cppph jest prawie kompletny i kompatybilny z -tradycyjny styl cpp.
Posiada dwa tryby:
tylko kompilacja warunkowa (--nomakro),
i pełne makrorozwijanie (domyślne).
In --nomakro tryb, cppph wykonuje tylko warunkowe akcje kompilacji, tj. #zawierać's,
#Jeśli's, i #ifdefsą przetwarzane zgodnie z definicjami zastępowania tekstu (zarówno polecenie-
liniowe i wewnętrzne), ale nie jest wykonywane rozszerzenie sparametryzowanego makra. W pełni
tryb zgodności (domyślny), zamienniki tekstowe i rozszerzenia makr są również
przetwarzane w pozostałej części tekstu innego niż cpp.
Funkcje:
#ifdef prosta kompilacja warunkowa
#Jeśli pełny język boolowski funkcji define(), &&, ||, ==, itd.
#elif połączone warunkowe
#definiować
definicje w tekście (zamienniki tekstu i makra)
#niedef in-line cofanie definicji
#zawierać
włączenie pliku
#linia dyrektywy dotyczące numerów linii
\n kontynuacje linii we wszystkich # dyrektywach
/ ** / katenacja tokenów w ramach definicji makra
## Katenizacja tokenów w stylu ANSI
# Ciąg znaków w stylu ANSI
__PLIK__
specjalny zamiennik tekstu dla komunikatów o błędach DIY
__LINIA__
specjalny zamiennik tekstu dla komunikatów o błędach DIY
__DATA__
specjalna zamiana tekstu
__CZAS__
specjalna zamiana tekstu
Ekspansja makro jest rekurencyjna. Redefinicja nazwy makra nie generuje ostrzeżenia.
Makra można zdefiniować w wierszu poleceń za pomocą -D podobnie jak zamienniki tekstowe. Makro
nazwy mogą być identyfikatorami Haskella, np. z pierwszą ` i backtickiem ´
znaków, które są nieco luźniejsze niż w C, ale nadal mogą nie zawierać operatora
symbolika.
Numeracja wierszy na wyjściu jest zachowana, aby każdy późniejszy procesor mógł podać
znaczące komunikaty o błędach. Kiedy plik jest #zawierać'D, cppph Wkłady #linia dyrektywy dla
z tego samego powodu. Numeracja powinna być prawidłowa nawet w przypadku kontynuacji wierszy.
Jeśli nie chcesz #linia dyrektyw w końcowym wyniku, użyj --nolina opcja.
Wszelkie błędy składniowe w dyrektywach cpp wysyłają komunikat do stderr i zatrzymują program.
Niepowodzenie w znalezieniu pliku #include'd powoduje wyświetlenie ostrzeżenia na stderr, ale przetwarzanie jest kontynuowane.
Możesz podać dowolną liczbę nazw plików w wierszu poleceń. Wyniki są katenowane w dniu
standardowe wyjście.
-Dsym zdefiniuj zamiennik tekstowy (wartość domyślna to 1)
-Dsym=val
zdefiniować zamiennik tekstowy o określonej wartości
-Iścieżka dodaj katalog do ścieżki wyszukiwania dla #include's
-Ofilet określ plik do wyjścia (domyślnie jest stdout)
--nomakro
przetwarzaj tylko #ifdef i #include,
nie rozwijaj makr
--nolina
usuń #liniowe odchody z wyjścia
--rozebrać się
konwertuj komentarze w stylu C na białe znaki, nawet na zewnątrz
dyrektywy cpp
--haszy
rozpoznaje operator ciągów ANSI #, a ## dla
katenacja tokenów, w ramach makr
--tekst traktuj dane wejściowe jako zwykły tekst, a nie kod Haskella
--układ
zachowaj nowe linie w rozszerzeniach makro
--nie oświetlony
usuń komentarze w stylu piśmiennym
--wersja
zgłoś numer wersji cppph i zatrzymaj
Domyślnie NIE są zdefiniowane żadne zamienniki tekstowe. (Normalne cpp zwykle ma definicje
dla maszyny, systemu operacyjnego itp. Można je łatwo dodać do kodu źródłowego cpphs, jeśli chcesz.)
Ścieżka wyszukiwania jest przeszukiwana w kolejności -I opcje, z wyjątkiem tego, że katalog
plik wywołujący, a następnie katalog bieżący, są zawsze przeszukiwane jako pierwsze. Znowu nie ma
domyślna ścieżka wyszukiwania (i znowu można to łatwo zmienić).
RÓŻNICE OD CPP
Ogólnie rzecz biorąc, cpphs opiera się na -tradycyjny zachowanie, a nie ANSI C, i ma
następujące główne różnice w stosunku do standardowego cpp.
Ogólne
Kurs # która wprowadza jakąkolwiek dyrektywę cpp musi znajdować się w pierwszej kolumnie wiersza (podczas gdy
ANSI zezwala na białe znaki przed # ).
Generuje #linia n "filename" składnia, a nie # n "filenamewariant.
Komentarze C są usuwane tylko z dyrektyw cpp. Nie są odarte z innych
tekst. Weź pod uwagę na przykład, że w Haskell wszystkie poniższe są prawidłowymi operatorami
symbolika: /* */ * / * Możesz jednak włączyć usuwanie komentarzy C za pomocą --rozebrać się opcja.
Macro język
Akceptuje / ** / do wklejania tokenów w definicji makra. Jednakże, /* */ (z dowolnym tekstem
między komentarzem otwórz/zamknij) wstawia spację.
ANSI ## operator wklejania tokenów jest dostępny z --haszy flaga. Ma to na celu uniknięcie
błędną interpretację dowolnego prawidłowego operatora Haskella o tej samej nazwie.
Zastępuje formalny parametr makra rzeczywistym, nawet wewnątrz ciągu (podwójny lub pojedynczy)
zacytowany). Jest to -tradycyjne zachowanie, nieobsługiwane przez ANSI.
Rozpoznaje # operator ciągów w definicji makra tylko wtedy, gdy używasz --haszy
opcja. (Jest to dodatek ANSI, potrzebny tylko dlatego, że w cudzysłowie (powyżej) jest
zabronione przez ANSI.)
Dokładnie zachowuje białe znaki w definicji zastępowania tekstu (nowe wiersze modulo),
ale przestrzeń wiodąca i końcowa jest wyeliminowana.
Zachowuje białe znaki w definicji makra (i końcowe) dokładnie (modulo
znaki nowej linii), ale wiodąca spacja jest eliminowana.
Dokładnie zachowuje białe znaki w argumentach wywołania makr (w tym znaki nowej linii), ale wiodące
a końcowe spacje są eliminowane.
Z --układ opcja, kontynuacje linii w zastępstwie tekstowym lub definicji makra
są zachowywane jako podziały linii w wywołaniu makra. (Przydatne w przypadku kodu wrażliwego na układ w
Haskella.)
Korzystaj z cpphs online, korzystając z usług onworks.net