Génération d'un analyseur lexical à l'aide de la commande lex

La commande lex permet d'écrire un programme en langage C qui peut recevoir et traduire des entrées de flux de caractères en actions de programme.

Pour utiliser la commande lex , vous devez fournir ou écrire un fichier de spécifications contenant:

Expressions régulières étendues
Motifs de caractères reconnus par l'analyseur lexical généré.
Instructions d'action
Fragments de programme en langage C qui définissent comment l'analyseur lexical généré réagit aux expressions régulières étendues qu'il reconnaît.
La commande lex génère un programme en langage C qui peut analyser un flux d'entrée à l'aide des informations du fichier de spécifications. La commande lex stocke ensuite le programme de sortie dans un fichier lex.yy.c . Si le programme de sortie reconnaît une structure d'entrée simple à un mot, vous pouvez compiler le fichier de sortie lex.yy.c avec la commande suivante pour générer un analyseur lexical exécutable:
cc lex.yy.c -ll

Toutefois, si l'analyseur lexical doit reconnaître une syntaxe plus complexe, vous pouvez créer un programme d'analyseur syntaxique à utiliser avec le fichier de sortie pour garantir un traitement correct des entrées.

Vous pouvez déplacer un fichier de sortie lex.yy.c vers un autre système s'il possède un compilateur C prenant en charge les fonctions de bibliothèque lex .

L'analyseur lexical compilé exécute les fonctions suivantes:
  • Lit un flux de caractères en entrée.
  • Copie le flux d'entrée dans un flux de sortie.
  • Divise le flux d'entrée en chaînes plus petites qui correspondent aux expressions régulières étendues dans le fichier de spécifications lex .
  • Exécute une action pour chaque expression régulière étendue qu'elle reconnaît. Ces actions sont des fragments de programme en langage C dans le fichier de spécification lex . Chaque fragment d'action peut appeler des actions ou des sous-routines en dehors de lui-même.

L'analyseur lexical généré par la commande lex utilise une méthode d'analyse appelée automate déterministe à états finis. Cette méthode prévoit un nombre limité de conditions dans lesquelles l'analyseur lexical peut exister, ainsi que les règles qui déterminent l'état de l'analyseur lexical.

L'automate permet à l'analyseur lexical généré de regarder en avant plus d'un ou deux caractères dans un flux d'entrée. Par exemple, supposons que vous définissiez deux règles dans le fichier de spécifications lex : l'une recherche la chaîneabet l'autre recherche la chaîneabcdefg. Si l'analyseur lexical reçoit une chaîne d'entrée deabcdefh, il lit les caractères à la fin de la chaîne d'entrée avant de déterminer qu'elle ne correspond pas à la chaîneabcdefg. L'analyseur lexical revient ensuite à la règle qui recherche la chaîneab, décide qu'il correspond à une partie de l'entrée et commence à essayer de trouver une autre correspondance à l'aide de l'entrée restantecdefh.

Compilation de l'analyseur lexical

Pour compiler un programme lex , procédez comme suit:
  1. Utilisez le programme lex pour remplacer le fichier de spécifications par un programme en langage C. Le programme résultant se trouve dans le fichier lex.yy.c .
  2. Utilisez la commande cc avec l'indicateur -ll pour compiler et lier le programme à une bibliothèque de sous-routines lex . Le programme exécutable résultant se trouve dans le fichier a.out .
Par exemple, si le fichier de spécifications lex est appelé lextest, entrez les commandes suivantes:
lex lextest
cc lex.yy.c -ll