L'analyseur générique de langage repose sur algorithme très rudimentaire pour décomposer un fichier. Le besoin est de seulement diviser le texte en régions homogènes, telles que chaîne, commentaire ou code. Certaines de ces régions subissent un traitement secondaire pour en extraire les identificateurs qui seront recherchés dans un dictionnaire.
En conséquence, LXR ne nécessite pas toutes les complications d'un véritable analyseur de compilateur.
Chaque description de langage est une liste délimitée par des accolades
de paires clef/valeur séparées par des virgules:
Le paramètre le plus important est 'spec'
qui indique comment diviser le fichier en régions.
'spec'
doit définir les régions par:
'comment'
,
'string'
ou 'include'
.
'code'
.
Exemples:
Commentaire /* ... */
en C
Commentaire //
en C++
(\$
représente la fin de ligne)
Chaîne en C: nous devons rester à l'intérieur de la chaîne si nous rencontrons des caractères protégés (sinon nous pourrions décréter la fin de la chaîne et nous retrouver dans une situation désynchronisée).
Le second paramètre important est 'identdef'
utilisé
à l'intérieur des régions code pour trouver les identificateurs
et les mots-clef:
Exemple:
Fourre-tout pour de nombreux langages (couvre les identificateurs et les mots-clef du préprocesseur C)
Vous donnez ensuite la liste des mots réservés qui ne seront pas pris en compte dans la recherche:
'case_insensitive'
est activé:
Exemple:
Extrait de la table C
Enfin, vous donnez une traduction intelligible des indicateurs ctags de façon que les listes de références croisées marquent les identificateurs avec des descriptions compréhensibles. Consultez la page man ctags pour une liste complète concernant un langage donné.
Exemple:
Extrait de la table C
Si un langage peut "importer" des fichiers (ne vous tracassez pas au sujet de C/C++, ses règles sont incorporées), vous donnez à LXR des règles pour transformer l'expression du fichier dans le langage en une référence système pour permettre de plaquer un hyperlien cliquable sur le nom en question:
'pre'
et 'post'
étaient nommés
'first'
et 'last'
.
'separator'
est nouveau dans 1.2.
'directive'
définit une expression régulière
pour séparer l'instruction en 5 composants, à savoir:
Exemple pour use
ou require
en Perl:
'separator'
définit l'éventuel séparateur des noms
de fichier dans le langage.
Il est remplacé par le séparateur du système avant de tenter
d'accéder au fichier.
'pre'
, 'global'
et 'post'
sont des règles optionnelles de substitution
(cible est un motif et remplacement est
substituté si correspondance).
'pre'
est appliqué une seule fois au début.
'global'
est ensuite appliqué répétitivement
jusqu'à ce qu'il n'y ait plus de correspondance.
'separator'
est remplacé par le séparateur du système.
'post'
est appliqué une seule fois après les autres règles.
Exemple pour use
ou require
en Perl:
est plus efficace que l'équivalent:
'include'
.