199 votes

Vous cherchez une définition claire de ce que sont un "tokenizer", un "parser" et un "lexer", ainsi que de la manière dont ils sont liés les uns aux autres et utilisés ?

Je cherche une définition claire de ce que sont un "tokenizer", un "parser" et un "lexer" et comment ils sont liés les uns aux autres (par exemple, un parser utilise-t-il un tokenizer ou vice versa) ? J'ai besoin de créer un programme qui parcourra les fichiers source c/h pour en extraire les déclarations et définitions de données.

J'ai cherché des exemples et j'ai pu trouver quelques informations, mais j'ai vraiment du mal à saisir les concepts sous-jacents comme les règles de grammaire, les arbres d'analyse et l'arbre syntaxique abstrait, et comment ils sont liés les uns aux autres. A terme, ces concepts devront être stockés dans un programme réel, mais 1) à quoi ressemblent-ils, 2) existe-t-il des implémentations communes.

J'ai consulté Wikipédia sur ces sujets et des programmes comme Lex et Yacc, mais n'ayant jamais suivi de cours de compilation (spécialisation EE), j'ai du mal à comprendre pleinement ce qui se passe.

2 votes

243voto

Roger Lipscombe Points 34344

Un tokenizer décompose un flux de texte en tokens, généralement en recherchant les espaces blancs (tabulations, espaces, nouvelles lignes).

Un lexeur est fondamentalement un tokenizer, mais il attache généralement un contexte supplémentaire aux tokens -- ce token est un nombre, ce token est une chaîne littérale, cet autre token est un opérateur d'égalité.

Un analyseur syntaxique prend le flux de tokens du lexer et le transforme en un arbre syntaxique abstrait représentant le programme (généralement) représenté par le texte original.

La dernière fois que j'ai vérifié, le meilleur livre sur le sujet était "Compilateurs : Principes, techniques et outils" généralement connu sous le nom de "Livre du Dragon".

13 votes

Il ne fait aucun doute que "The Dragon Book" est un bon livre, mais il exige que le lecteur ait de bonnes bases en CS. Parmi les ouvrages plus pratiques, citons "Writing Compilers and Interpreters" de Ronald Mak, "Modern Compiler Implementation" d'Andrew Appel, "Compiler Construction" de Niklaus Wirth, "Compiling with C# and Java" et "Compilers and Compiler Generators : an Introduction with C++" de Pat Terry et, bien sûr, "The Definitive ANTLR Reference" de Terrence Parr.

0 votes

Bien sûr. La dernière fois que j'ai vérifié, j'étais en train de faire un diplôme CS :-) Je m'en remets à vos recommandations plus récentes.

6 votes

Juste pour être sûr, je ne critique pas votre recommandation. "The Dragon Book" a été mon premier livre sur la technologie des compilateurs, mais il était difficile à lire comparé au livre de Wirth, par exemple, qui est un livre que l'on peut assimiler en quelques heures. À l'époque, j'avais peu d'options car c'était le seul livre sur lequel je pouvais mettre la main (nous étions en 1991, avant Amazon et le WWW). J'avais ce livre et une collection de fichiers texte produite par Jack W. Crenshaw intitulée "LET'S BUILD A COMPILER" (merci Jack !). C'est toujours le livre à consulter pour une compréhension plus complète des principes, mais la plupart des programmeurs ont juste besoin d'une introduction pragmatique.

25voto

Exemple :

int x = 1;

Un lexeur ou un tokeniseur le décomposera en jetons 'int', 'x', '=', '1', ';'.

Un analyseur prendra ces jetons et les utilisera pour les comprendre d'une certaine manière :

  • nous avons une déclaration
  • c'est la définition d'un nombre entier
  • le nombre entier est appelé "x".
  • x" doit être initialisé avec la valeur 1.

8voto

Will Dean Points 25866

Je dirais qu'un lexeur et un tokenizer sont fondamentalement la même chose, et qu'ils décomposent le texte en ses composants (les "tokens"). L'analyseur interprète ensuite les tokens à l'aide d'une grammaire.

Je ne m'attacherais pas trop à une terminologie précise - les gens utilisent souvent le terme "analyse syntaxique" pour décrire toute action d'interprétation d'un morceau de texte.

1 votes

Avec les analyseurs PEG, la distinction entre tokenizer et analyseur est encore moins claire.

1voto

mcha Points 472

( ajouter aux réponses données )

  • Tokenizer sera également supprimer tout commentaire, et ne renvoyer que jetons au Lexer.
  • Lexer va également définir les champs d'application de ces jetons (variables/fonctions)
  • L'analyseur construit ensuite la structure du code/programme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X