web-dev-qa-db-fra.com

Vous cherchez une définition claire de ce qu'est un "tokenizer", un "parser" et des "lexers" et comment ils sont liés les uns aux autres et utilisés?

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

J'ai cherché des exemples et je peux trouver des informations, mais j'ai vraiment du mal à saisir les concepts sous-jacents tels que les règles de grammaire, les arbres d'analyse et l'arbre de syntaxe abstraite et comment ils interagissent les uns avec les autres. Finalement, ces concepts doivent être stockés dans un programme réel, mais 1) à quoi ils ressemblent, 2) existe-t-il des implémentations courantes.

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

128
lordhog

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

Un lexer est fondamentalement un tokenizer, mais il attache généralement un contexte supplémentaire aux jetons - ce jeton est un nombre, ce jeton est un littéral de chaîne, cet autre jeton est un opérateur d'égalité.

Un analyseur prend le flux de jetons du lexer et le transforme en une arborescence de syntaxe abstraite représentant le programme (généralement) représenté par le texte d'origine.

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 "The Dragon Book".

143
Roger Lipscombe

Exemple:

int x = 1;

Un lexer ou un tokeniser divisera cela en jetons 'int', 'x', '=', '1', ';'.

Un analyseur prendra ces jetons et les utilisera pour comprendre en quelque sorte:

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

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

Je ne serais pas trop accroché à une utilisation terminologique précise - les gens utilisent souvent le `` parsing '' pour décrire toute action d'interprétation d'un bloc de texte.

4
Will Dean

( ajout aux réponses données )

  • Tokenizer supprimera également tous les commentaires et ne renverra que jetons au Lexer.
  • Lexer va également définir les portées de ces jetons (variables/fonctions)
  • L'analyseur va alors construire la structure du code/programme
0
mcha