Il s'agit de la commande cpphs qui peut être exécutée dans le fournisseur d'hébergement gratuit OnWorks en utilisant l'un de nos multiples postes de travail en ligne gratuits tels que Ubuntu Online, Fedora Online, l'émulateur en ligne Windows ou l'émulateur en ligne MAC OS
PROGRAMME:
Nom
cpphs - préprocesseur cpp-a-like libéralisé pour Haskell
SYNOPSIS
cpph [NOM DE FICHIER|OPTION] ...
DESCRIPTION
cpph est une re-mise en œuvre libéralisée de cpp (1), le préprocesseur C, dans et pour
Haskel.
Pourquoi ré-implémenter cpp ? A tort ou à raison, le préprocesseur C est largement utilisé en Haskell
code source. Il permet la compilation conditionnelle pour différents compilateurs, différents
versions du même compilateur et différentes plates-formes de système d'exploitation. Il est aussi occasionnellement utilisé
pour son langage macro, qui peut permettre certaines formes de détails spécifiques à la plate-forme-
le remplissage, comme la génération fastidieuse de définitions d'instances et de FFI
déclarations. Cependant, il y a deux problèmes avec cpp, mis à part l'esthétique évidente
les uns:
Pour certains systèmes Haskell, notamment Hugs sous Windows, un véritable cpp n'est pas disponible par
défaut.
Même pour les autres systèmes Haskell, le cpp commun fourni par la série gcc 3.x
change subtilement d'une manière incompatible avec la syntaxe de Haskell. Il y a
toujours eu des problèmes avec, par exemple, les espaces entre les chaînes et les caractères premiers dans
identifiants. Ces problèmes ne feront qu'empirer.
Il nous a donc semblé juste de tenter de proposer une alternative au cpp, à la fois plus compatible avec
Haskell, et lui-même écrit en Haskell afin qu'il puisse être distribué avec des compilateurs.
cpph est à peu près complet en fonctionnalités et compatible avec le -traditionnel style de cpp.
Il a deux modes :
compilation conditionnelle uniquement (--nomacro),
et extension complète des macros (par défaut).
In --nomacro Mode, cpph n'effectue que des actions de compilation conditionnelles, c'est-à-dire #comprendre« S,
#si'le sable #ifdefsont traités selon les définitions de remplacement de texte (à la fois les commandes
line et internal), mais aucune extension de macro paramétrée n'est effectuée. En entier
mode de compatibilité (par défaut), les remplacements textuels et les extensions de macro sont également
traité dans le reste du texte non-cpp.
Fonctionnalités de travail :
#ifdef compilation conditionnelle simple
#si le langage booléen complet de define(), &&, ||, ==, etc.
#elif conditionnels enchaînés
#define
définitions en ligne (remplacements de texte et macros)
#undef révocation en ligne des définitions
#comprendre
inclusion de fichiers
#ligne directives de numéro de ligne
\n continuations de ligne dans toutes les # directives
/ ** / caténation de jetons dans une définition de macro
## Caténation de jetons de style ANSI
# Stringisation de jetons de style ANSI
__DÉPOSER__
remplacement de texte spécial pour les messages d'erreur DIY
__LIGNE__
remplacement de texte spécial pour les messages d'erreur DIY
__DATE__
remplacement de texte spécial
__TEMPS__
remplacement de texte spécial
L'expansion des macros est récursive. La redéfinition d'un nom de macro ne génère pas d'avertissement.
Les macros peuvent être définies sur la ligne de commande avec -D tout comme les remplacements textuels. Macro
les noms sont autorisés à être des identifiants Haskell, par exemple avec le premier ` et le backtick ´
caractères, ce qui est légèrement plus lâche qu'en C, mais ils peuvent toujours ne pas inclure l'opérateur
symboles
La numérotation des lignes dans la sortie est préservée afin que tout processeur ultérieur puisse donner
messages d'erreur significatifs. Lorsqu'un fichier est #comprendre'ré, cpph inserts #ligne directives pour
la même raison. La numérotation doit être correcte même en présence de continuations de ligne.
Si tu ne veux pas #ligne directives dans la sortie finale, utilisez le --pas de ligne option.
Toute erreur de syntaxe dans les directives cpp envoie un message à stderr et arrête le programme.
L'impossibilité de trouver un fichier #include génère un avertissement sur stderr, mais le traitement se poursuit.
Vous pouvez donner n'importe quel nombre de noms de fichiers sur la ligne de commande. Les résultats sont catégorisés sur
sortie standard.
-Dsym définir un remplacement textuel (la valeur par défaut est 1)
-Dsym=vague
définir un remplacement textuel avec une valeur spécifique
-Ichemin ajouter un répertoire au chemin de recherche de #include
-Ofilet spécifier un fichier pour la sortie (la valeur par défaut est stdout)
--nomacro
ne traiter que les #ifdef et les #include,
ne pas développer les macros
--pas de ligne
supprimer les excréments de #ligne de la sortie
--déshabiller
convertir les commentaires de style C en espaces, même à l'extérieur
directives cpp
--hachages
reconnaître l'opérateur ANSI # stringise, et ## pour
caténation de jetons, dans les macros
--texte traiter l'entrée comme du texte brut, pas du code Haskell
--disposition
préserver les sauts de ligne dans les extensions de macro
--non éclairé
supprimer les commentaires de style lettré
--version
rapporter le numéro de version de cpphs et arrêter
Il n'y a AUCUN remplacement textuel défini par défaut. (Le cpp normal a généralement des définitions
pour la machine, le système d'exploitation, etc. Ceux-ci pourraient facilement être ajoutés au code source de cpphs si vous le souhaitez.)
Le chemin de recherche est recherché dans l'ordre du -I options, sauf que le répertoire du
le fichier appelant, puis le répertoire courant, sont toujours recherchés en premier. Encore une fois, il n'y a pas
chemin de recherche par défaut (et encore une fois, cela pourrait facilement être modifié).
DIFFÉRENCES De RPC
En général, cpphs est basé sur le -traditionnel comportement, pas ANSI C, et a le
suivant les principales différences par rapport au cpp standard.
Général
La # qui introduit une directive cpp doit être dans la première colonne d'une ligne (alors que
ANSI autorise les espaces avant le # ).
Génère le #ligne n "nom de fichier" syntaxe, pas la # n "nom de fichier" une variante.
Les commentaires C ne sont supprimés que dans les directives cpp. Ils ne sont pas dépouillés des autres
texte. Considérez par exemple qu'en Haskell, tous les éléments suivants sont des opérateurs valides
symboles: /* */ * / * Cependant, vous pouvez activer la suppression du commentaire C avec le --déshabiller option.
Macro langue
Accepte / ** / pour le collage de jetons dans une définition de macro. Cependant, /* */ (avec n'importe quel texte
entre le commentaire d'ouverture/fermeture) insère un espace.
L'ANSI ## l'opérateur de collage de jetons est disponible avec le --hachages drapeau. C'est pour éviter
mal interpréter tout opérateur Haskell valide du même nom.
Remplace un paramètre formel de macro par le réel, même à l'intérieur d'une chaîne (double ou simple
cité). Il s'agit d'un comportement traditionnel, non pris en charge dans ANSI.
Reconnaît le # opérateur de stringisation dans une définition de macro uniquement si vous utilisez le --hachages
option. (Il s'agit d'un ajout ANSI, uniquement nécessaire car la chaîne de caractères (ci-dessus) est
interdit par l'ANSI.)
Préserve exactement les espaces blancs dans une définition de remplacement textuel (nouvelles lignes modulo),
mais l'espace de début et de fin est éliminé.
Préserve les espaces blancs dans une définition de macro (et à sa fin) exactement (modulo
nouvelles lignes), mais l'espace de début est éliminé.
Préserve exactement les espaces blancs dans les arguments d'appel de macro (y compris les nouvelles lignes), mais en tête
et l'espace de fuite est éliminé.
Avec la --disposition option, continuations de ligne dans un remplacement textuel ou une définition de macro
sont conservés sous forme de sauts de ligne dans l'appel de macro. (Utile pour le code sensible à la mise en page dans
Haskel.)
Utiliser cpphs en ligne à l'aide des services onworks.net