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.
cc lex.yy.c -llToutefois, 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 .
- 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
- 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 .
- 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 .
lex lextest
cc lex.yy.c -ll