106 votes

Quelle est la différence entre un token et un lexème ?

Dans Compiler Construction de Aho Ullman et Sethi, il est indiqué que la chaîne de caractères d'entrée du programme source est divisée en séquences de caractères qui ont une signification logique, et sont connues sous le nom de tokens et lexèmes sont des séquences qui composent le token donc quelle est la différence fondamentale ?

6voto

Rajat Bhatt Points 420

Lexème - Un lexème est une séquence de caractères dans le programme source qui correspond au modèle d'un token et qui est identifiée par l'analyseur lexical comme une instance de ce token.

Token - Un jeton est une paire composée d'un nom de jeton et d'une valeur de jeton facultative. Le nom du jeton est une catégorie d'unité lexicale, les noms de jeton les plus courants sont

  • identifiants : noms choisis par le programmeur
  • mots-clés : noms déjà présents dans le langage de programmation
  • les séparateurs (également appelés ponctuateurs) : caractères de ponctuation et délimiteurs appariés
  • opérateurs : symboles qui opèrent sur des arguments et produisent des résultats
  • littéraux : numériques, logiques, textuels, littéraux de référence

Considérons cette expression dans le langage de programmation C :

somme = 3 + 2 ;

Tokenisé et représenté par le tableau suivant :

 Lexeme        Token category
------------------------------
sum      |    Identifier
 =       |    Assignment operator
 3       |    Integer literal
 +       |    Addition operator
 2       |    Integer literal
 ;       |    End of statement

4voto

mud1t Points 66

Jeton : Le type pour (mots-clés, identificateur, caractère de ponctuation, opérateurs à plusieurs caractères) est ,simplement, un Token.

Modèle : Une règle pour la formation d'un jeton à partir des caractères d'entrée.

Lexème : C'est une séquence de caractères dans le PROGRAMME SOURCE correspondant à un modèle pour un token. En fait, c'est un élément de Token.

4voto

pradip Points 49

Jeton : Un jeton est une séquence de caractères qui peut être traitée comme une entité logique unique. Les jetons typiques sont ,
1) Identifiants
2) mots-clés
3) les opérateurs
4) symboles spéciaux
5)constantes

Motif : Un ensemble de chaînes de caractères en entrée pour lesquelles le même jeton est produit en sortie. Cet ensemble de chaînes de caractères est décrit par une règle appelée motif associée au jeton.
Lexème : Un lexème est une séquence de caractères dans le programme source qui correspond au motif d'un jeton.

4voto

Mayank Narula Points 61

Voyons le fonctionnement d'un analyseur lexical (également appelé Scanner).

Prenons un exemple d'expression :

INPUT : cout << 3+2+3;

FORMATTING PERFORMED BY SCANNER :  {cout}|space|{<<}|space|{3}{+}{2}{+}{3}{;} 

mais pas le résultat réel.

L'ANALYSEUR CHERCHE SIMPLEMENT UN LEXÈME DE MANIÈRE RÉPÉTÉE DANS LE TEXTE DU PROGRAMME SOURCE JUSQU'À CE QUE L'ENTRÉE SOIT ÉPUISÉE.

Le lexème est une sous-chaîne de l'entrée qui forme une chaîne valide de terminaux présents dans la grammaire . Chaque lexème suit un motif qui est expliqué à la fin ( la partie que le lecteur peut sauter à la fin )

(La règle importante est de rechercher le préfixe le plus long possible formant une chaîne de terminaux valide jusqu'à ce que le prochain espace soit rencontré... expliqué ci-dessous).

LEXEMES :

  1. cout
  2. <<

(bien que "<" soit également une chaîne terminale valide, la règle mentionnée ci-dessus doit sélectionner le motif du lexème "<<" afin de générer le jeton renvoyé par l'analyseur).

  1. 3
  2. +
  3. 2
  4. ;

TOKENS : Les jetons sont renvoyés un par un (par le scanneur lorsque le parseur le demande) chaque fois que le scanneur trouve un lexème (valide). Le scanneur crée, si elle n'est pas déjà présente, une entrée dans la table des symboles. ( ayant des attributs : principalement token-category et quelques autres ) lorsqu'il trouve un lexème, afin de générer son jeton.

Le '#' indique une entrée dans la table des symboles. J'ai indiqué le numéro du lexème dans la liste ci-dessus pour faciliter la compréhension, mais techniquement, il devrait être l'index réel de l'enregistrement dans la table des symboles.

Les tokens suivants sont retournés par l'analyseur à l'analyseur syntaxique dans l'ordre spécifié pour l'exemple ci-dessus.

  1. < identifiant, #1 >

  2. < Opérateur, #2 >

  3. < Littéral, #3 >

  4. < Opérateur, #4 >

  5. < Littéral, #5 >

  6. < Opérateur, #4 >

  7. < Littéral, #3 >

  8. < Punctuator , #6 >

Comme vous pouvez le constater, un token est une paire, contrairement au lexème qui est une sous-chaîne de l'entrée.

Et le premier élément de la paire est le classe à jeton/catégorie

Les classes de jetons sont énumérées ci-dessous :

  • MOTS CLÉS
  • IDENTIFICATEURS
  • LITERAUX
  • PUNCTUATEURS
  • OPERATEURS

Et une dernière chose, le scanner détecte les espaces, les ignore et ne forme aucun jeton pour un espace. Tous les délimiteurs ne sont pas des espaces, un espace est une forme de délimiteur utilisé par les scanners pour son but. Les tabulations, les sauts de ligne, les espaces, les caractères échappés en entrée sont tous collectivement appelés délimiteurs d'espacement. Quelques autres délimiteurs sont ';' ',' ':' etc, qui sont largement reconnus comme des lexèmes qui forment des jetons.

Le nombre total de tokens retournés est de 8 ici, mais seulement 6 entrées dans la table des symboles sont faites pour les lexèmes. Les lexèmes sont également 8 au total (voir la définition du lexème).

--- Vous pouvez sauter cette partie

A ***pattern*** is a rule ( say, a regular expression ) that is used to check if a string-of-terminals is valid or not .

If a substring of input composed only of grammar terminals is following the rule specified by any of the listed patterns , it is validated as a lexeme and selected pattern will identify the category of lexeme, else a lexical error is reported due to either (i) not following any of the rules or (ii) input consists of a bad terminal-character not present in grammar itself.

for example :

1. No Pattern Exists : In C++ , "99Id_Var" is grammar-supported string-of-terminals but is not recognised by any of patterns hence lexical error is reported .

2. Bad Input Character : $,@,unicode characters may not be supported as a valid character in few programming languages.`

1voto

zell Points 849

Les chercheurs en CS, comme ceux en Maths, sont friands de créer des termes "nouveaux". Les réponses ci-dessus sont toutes sympathiques, mais apparemment, il n'y a pas un si grand besoin de distinguer les tokens et les lexèmes IMHO. Ce sont comme deux façons de représenter la même chose. Un lexème est concret -- ici un ensemble de caractères ; un token, par contre, est abstrait -- se référant généralement au type d'un lexème ainsi qu'à sa valeur sémantique si cela a un sens. Ce ne sont que mes deux centimes.

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