Grammaires locales étendues mise en œuvre
Anatomie de l’appel à une fonction étendue
Dans notre implémentation une fonction étendue est appelée en suivant différents types de conventions, dont la plus simple est : $@fonction(arg1, arg2, . . ., argn)$ Sous forme de graphe : $@fonction(arg1, arg2, …, argn)$ Graphe 5.1 – Convention pour appeler une fonction étendue Le symbole dollar ($) comme préfixe et suffixe sert à délimiter la partie de la sortie étendue qui doit être évaluée, autrement dit, les séquences en dehors de l’appel à la fonction étendue sont interprétées séparément soit comme des symboles terminaux (des chaînes de caractères littérales), soit comme des appels à d’autres fonctions. S’il s’agit des symboles de l’alphabet de sortie et si la sortie est satisfaite, alors ces symboles seront concaténés à la valeur retournée par la fonction. Dans le cas où une sortie étendue comporte plus d’une fonction, l’évaluation est effectuée de la fonction la plus à gauche vers celle la plus à droite. Dans tous les cas, l’évaluation est effectuée seulement si la fonction qui la précède est aussi satisfaite. Le nom d’une fonction est précédé par le symbole arobase (@).
Nous avons choisi cette convention puisque l’arobase est communément associé à la préposition « à » (« at », en anglais). En effet, cela sert à évoquer le fait que la définition de la fonction, c’est-à-dire, le code source contenant les instructions à exécuter se trouve dans un fichier externe (que nous appelons extension) du même nom et se terminant par .upp (dans l’exemple, fonction.upp). Le nom d’une fonction est valide s’il est composé uniquement de caractères appartenant à la classe [a-zA-Z0-9_], soit des lettres latines minuscules ou majuscule, des chiffres et des tirets bas. Cette restriction suit celle déjà utilisée dans Unitex pour créer des noms de variables (d’entrée ou de sortie, manuel, p. 105) et permet ainsi de garantir une cohérence vis-à-vis de la création des identifiants associés aux grammaires.
Dans certains cas il est plus propice de définir plus d’une fonction étendue dans une seule extension .upp, par exemple, afin de créer des bibliothèques de fonctions qui partagent un but ou une sémantique commune. Il est alors admis de faire appel à une fonction en utilisant la convention suivante : $@extension.fonction(arg1, arg2, . . ., argn)$ Dans le graphe 5.2, string est le nom du fichier .upp contenant la fonction étendue du nom substring. Le nom d’une extension doit respecter les mêmes caractéristiques que celles établies pour les noms de variables et de fonctions étendues, en d’autres termes, 5 Grammaires locales étendues : mise en œuvre 93 être composé uniquement de lettres latines minuscules ou majuscules, de chiffres et de tirets bas.
En outre, aussi bien les noms de variables, de fonctions étendues et d’extensions doivent avoir une longueur inférieure ou égale à 127 caractères et sont sensibles à la casse, c’est-à-dire, les noms avec des lettres minuscules sont considérés comme étant différents de ceux contenant des lettres majuscules. ( var ) var $@string.substring(${var},1,1)$ Graphe 5.2 – Convention pour appeler une fonction étendue avec un nom différent du fichier où elle est définie Immédiatement après le nom de la fonction étendue, il est requis d’écrire une parenthèse ouvrante qui délimite avec une autre parenthèse fermante les arguments qui sont passés à la fonction étendue. Le nombre des arguments situées entre parenthèses doit normalement correspondre au nombre des paramètres attendus par la définition de la fonction.
Cependant, il n’existe pas de restriction de cardinalité, si un appel est réalisé avec un nombre d’arguments différents que celui de paramètres, alors les arguments en excès sont ignorés et les paramètres manquants sont assignés à la valeur nulle. Comme évoqué précédemment, une fonction étendue peut recevoir un ensemble d’arguments, séparés par des virgules, en tant que paramètres d’entrée. Tandis que les paramètres sont les variables utilisées pour définir l’implémentation de la fonction étendue (dans un fichier .upp externe à la grammaire), les arguments sont les valeurs qui sont passées à la fonction lorsqu’elle est appelée dans un graphe. Une liste d’arguments peut être vide.
En d’autres termes, la fonction étendue peut avoir zéro paramètres d’entrée ou se voir affectée la valeur nulle à chacun de ses paramètres manquants. Par contre, si la fonction étendue reçoit un ou plusieurs paramètres, chaque argument transmis peut correspondre à une valeur nulle, à une valeur booléenne (vraie ou fausse), à une chaîne de caractères, au contenu d’une variable d’entrée (manuel, p. 105) ou de sortie (manuel, p. 147), ou à une référence des variables précitées (entrée ou sortie).
Nuls et booléens
Pour passer un argument de valeur nulle il est nécessaire d’utiliser le mot-clé nil. Un argument de valeur nulle peut être compris comme un argument dépourvu de valeur. Pour la valeur booléenne vraie, le mot-clé est true et pour la valeur fausse le mot-clé est false. Nous avons adopté cette convention en accord avec les mot-clés nil | false | true qui peuvent être utilisés avec une connotation similaire dans la définition des fonctions. Par ailleurs, il est utile de remarquer que ces trois mot-clés doivent toujours être écrits en respectant la casse.
Chaînes de caractères littérales
Pour construire un argument contenant une chaîne littérale de caractères, telle que « chaîne » ou « autre chaîne », il est juste requis d’écrire la suite de caractères, sans aucun autre symbole particulier l’entourant. Autrement dit, une chaîne littérale est uniquement délimitée par les virgules ou par les parenthèses qui séparent les arguments.
Afin d’utiliser les caractères qui ont un sens spécial dans la syntaxe d’appel dans une fonction étendue, tels que le symbole dollar ($) ou « et » commercial (&), l’implémentation courante permet de les déspécialiser (mode d’« échappement »). Ainsi, pour utiliser ces symboles dans une chaîne littérale, il suffit de les redoubler : $$ → $, && → &. En outre, dans une liste d’arguments non-vide, une chaîne littérale est vide si elle ne contient pas de caractères et dans ce cas elle prend la valeur nulle. Finalement, les chaînes littérales peuvent se concaténer aux variables que nous décrivons ensuite. Il est aussi utile de remarquer que la longueur maximale d’un argument du type chaîne littérale est de 4095 caractères.
Variables d’entrée et de sortie
Il est possible de passer un argument à une fonction étendue contenant la valeur d’une variable d’entrée ou de sortie. Contrairement à la convention utilisée dans Unitex pour faire référence aux variables en encadrant leur nom avec le caractère $, par exemple $variable$, dans les arguments d’une fonction étendue les valeurs des variables sont indiquées en utilisant la convention : ${variable} Le nom de la variable est entouré par des accolades ({ et }) et préfixé par le symbole dollar $. Lorsqu’une variable est retrouvée, sa valeur (une chaîne de caractères) est assignée à l’argument passé à la fonction. Si la variable fait partie d’un argument du type chaîne littérale, alors sa valeur est concaténée à la chaîne dans laquelle se trouve.
En outre, les variables non assignées, qui ne font pas partie d’un argument du type chaîne, sont assignées par défaut à la valeur nulle. Dans le traitement des arguments des fonctions étendues, ce comportement est plus pertinent que celui d’utiliser une politique unique (manuel, p. 154) lorsqu’une variable n’est pas définie. En effet, cela permet d’autoriser des chemins qui définissent une variable ainsi que d’autres chemins qui ne la définissent pas sans considérer ces derniers comme des erreurs (voir le graphe 5.3). Il est alors de la responsabilité de la fonction étendue (l’implémentation) de prendre en charge les deux cas.
Nous avons trouvé cette approche utile dans la réalisation de certaines tâches qui sont prises en charge par des fonctions étendues : • D’une part, pour générer des sorties de graphes dictionnaires (manuel, p. 69) avec une fonction étendue qui met en forme des ensembles de variables éventuellement non définies. 5 Grammaires locales étendues : mise en œuvre 95 • D’autre part, pour passer des variables, éventuellement non définies, à des fonctions étendues qui ont la charge de faire des requêtes à une ressource externe telle qu’une base de données.