![]() |
Un séquentiel Tulip utilise une forme simplifiée du formalisme XML. C’est un ensemble de balises contenant soit d’autres balises, du texte (PCDATA), ou rien.
… <BALISE att1=“val1“ att2=“val2“ att3=“val3“ ..>
<BALISE1 att1=“val1“ att2=“val2“ att3=“val3“ ..> Free text … </BALISE1> </BALISE>
<BALISE2 att1=“val1“ att2=“val2“ att3=“val3“ ../> …
La structure des fichiers XML est décrite dans le fichier commands.dtd. Pendant la compilation, le compilateur tulip vérifie chaque fichier source avec la structure DTD. Un fichier DTD contient des items comme suit:
<!ELEMENT TEST_SEND (#PCDATA)> <!ATTLIST TEST_SEND PIPELINE (INPUT | COMMAND) "INPUT" METHOD CDATA "DATA" >
Cette déclaration est compatible avec la commande suivante: <TEST_SEND METHOD=“command“> Hello TEST </TEST_SEND>
La ligne commençant par <!ELEMENT contient le nom de la commande, et la chaîne (#PCDATA) indique que la commande contient du texte libre entre la balise de début et de fin. Si la commande contient d’autres commandes (exemple, balise DECLARE ci-dessous), ces commandes sont décrites à l’intérieur de cet objet, avec les modifieurs suivants : * (0 ou plus), + (1 ou plus), ? (0 ou 1), rien (1 seul).
<!ELEMENT DECLARE (CONSTANT*,VARIABLE*)>
La balise <!ATTLIST définit les attributs XML associés à la commande, avec leurs valeurs possibles (cf PIPELINE ci-dessus), leur valeur par défaut (“INPUT“ est spécifié comme valeur par défaut pour l’attribut PIPELINE).
Un séquentiel contient seulement une balise <SEQ> racine. Il peut également comporter une section <DECLARE>, dédiée à la déclaration des variables locales au séquentiel.
Séquentiel Hello World :
<SEQ> <PRINT>Hello World!</PRINT> </SEQ>
Tout texte libre (soit un attribut de commande, soit du texte situé entre la balise de début ou de fin (PCDATA) peut contenir des variables/constantes/paramètres de trafic. Dans ce cas, le nom de l’objet est encadré par des caractères ~.
Exemple : <PRINT>Variable ~var~</PRINT> <PRINT_VAR VAR=”NOM_VAR_~nomvar~”/>
Cas particuliers: - S’il est nécessaire d’utiliser le caractère “~“, attention à ce que cela ne corresponde pas à un objet existant. - Attention à le pas inclure la balise de fin de la commande dans le texte libre (ex, </PRINT>), au risque d’avoir une erreur de compilation. Si nécessaire, utiliser une variable pour contenir la balise de fin (pas une constante). - Si le nom encadré par « ~ » ne correspond pas à un objet connu, la chaîne ne sera pas interprétée (pas d’erreur).
Le texte libre PCDATA peut également contenir des variables spéciales JOKER. L’utilisation de ces variables permet de faire correspondre la chaine avec une entrée (typiquement, un paquet reçu). Les types de jokers implémentés sont les suivants : ~**~ : joker de fin de ligne, remplace toute chaîne de caractères jusqu’à un retour chariot. ~$$~ : joker de bloc, remplace toute chaîne de caractères. ~//~ : joker de ligne, ignore toutes les lignes jusqu’au matching de la ligne suivant le joker. ~1~, où « 1 » : peut être remplacé par un nombre quelconque. Remplace un nombre défini de caractères.
|
Syntaxe |
![]() |