web-dev-qa-db-fra.com

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

Dans Compiler Construction de Aho Ullman et Sethi, il est indiqué que la chaîne de caractères du programme source est divisée en une suite de caractères à signification logique; est la différence fondamentale?

70
user1707873

Utilisation de " Principes, techniques et outils des compilateurs, 2e édition. " (WorldCat) de Aho, Lam, Sethi et Ullman, AKA the Purple Book ,

Lexeme pg. 111 

Un lexème est une séquence de caractères du programme source qui correspond au modèle pour un jeton et est identifié par le lexical analyseur en tant qu'instance de ce jeton.

Jeton pg. 111 

Un jeton est une paire composée d'un nom de jeton et d'un attribut facultatif valeur. Le nom du jeton est un symbole abstrait représentant une sorte de unité lexicale, par exemple un mot-clé particulier ou une séquence de saisie caractères désignant un identifiant. Les noms de jeton sont l'entrée symboles que l'analyseur traite.

Modèle pg. 111 

Un motif est une description de la forme que les lexèmes d'un jeton peuvent prendre. Dans le cas d'un mot clé en tant que jeton, le modèle est simplement le séquence de caractères formant le mot-clé. Pour les identifiants et certains autres jetons, le motif est une structure plus complexe qui correspond à beaucoup de cordes.

Figure 3.2: Exemples de jetons pg.112 

[Token]       [Informal Description]                  [Sample Lexemes]
if            characters i, f                         if
else          characters e, l, s, e                   else
comparison    < or > or <= or >= or == or !=          <=, !=
id            letter followed by letters and digits   pi, score, D2
number        any numeric constant                    3.14159, 0, 6.02e23
literal       anything but ", surrounded by "'s       "core dumped"

Pour mieux comprendre cette relation à un lexer et à un analyseur, nous commencerons par l’analyseur et nous reviendrons à l’entrée.

Pour faciliter la conception d'un analyseur syntaxique, un analyseur syntaxique ne fonctionne pas directement avec l'entrée mais consulte une liste de jetons générés par un lexer. En regardant la colonne de jetons de la figure 3.2, nous voyons des jetons tels que if, else, comparison, id, number et literal; ce sont des noms de jetons. Généralement, avec un lexer/analyseur, un jeton est une structure qui contient non seulement le nom du jeton, mais également les caractères/symboles qui constituent le jeton et les positions de début et de fin de la chaîne de caractères qui le compose, avec position de début et de fin utilisée pour signaler les erreurs, surligner, etc. 

Le lexer prend maintenant la saisie de caractères/symboles et en utilisant les règles du lexer convertit les caractères/symboles saisis en jetons. Maintenant, les personnes qui travaillent avec lexer/parser ont leurs propres mots pour des choses qu’elles utilisent souvent. Ce que vous appelez une séquence de caractères/symboles formant un jeton est ce que les utilisateurs de lexer/parsers appellent lexeme. Ainsi, lorsque vous voyez le lexème, imaginez une séquence de caractères/symboles représentant un jeton. Dans l'exemple de comparaison, la séquence de caractères/symboles peut être différente, telle que < ou > ou else ou 3.14, etc.

Une autre façon de penser à la relation entre les deux est qu'un jeton est une structure de programmation utilisée par l'analyseur dont la propriété, appelée lexème, contient le caractère/les symboles de l'entrée. À présent, si vous examinez la plupart des définitions de jeton dans le code, il est possible que le lexème ne soit pas considéré comme l'une des propriétés du jeton. En effet, un jeton conservera plus probablement les positions de début et de fin des caractères/symboles qui représentent le jeton et le lexème. Une séquence de caractères/symboles peut être dérivée de la position de début et de fin si nécessaire, car l'entrée est statique.

97
Guy Coder

Lorsqu'un programme source est introduit dans l'analyseur lexical, il commence par diviser les caractères en séquences de lexèmes. Les lexèmes sont ensuite utilisés dans la construction de jetons, dans lesquels les lexèmes sont mappés en jetons. Une variable appelée maVar serait mappé dans un jeton indiquant <identifiant, "num">, "num" désignant l'emplacement de la variable dans la table des symboles .

En bref:

  • Les lexèmes sont les mots dérivés du flux de saisie de caractères.
  • Les jetons sont des lexèmes mappés dans un nom de jeton et une valeur d'attribut.


Un exemple comprend:
x = a + b * 2
Ce qui donne les lexèmes: {x, =, a, +, b, *, 2}
Avec les jetons correspondants: {<identifiant, 0>, <=>, <identifiant, 1>, <+>, <identifiant, 2>, <*>, <identifiant, 3>}

29
William

a) Les jetons sont des noms symboliques pour les entités qui composent le texte du programme; ex. if pour le mot clé if, et id pour tout identifiant. Celles-ci constituent la sortie de L’analyseur lexical . 5

(b) Un modèle est une règle qui spécifie quand une séquence de caractères de l'entrée constitue un jeton; Par exemple, la séquence i, f pour le jeton if et toute séquence de alphanumériques commençant par une lettre pour l'identifiant de jeton.

(c) Un lexème est une séquence de caractères de l'entrée qui correspond à un modèle (et donc constitue une instance d'un jeton); Par exemple, si correspond au modèle pour si, et foo123bar correspond au modèle pour id.

6
shasmoe

LEXEME- Séquence de caractères appariés par PATTERN formant le JETON

PATTERN- Ensemble de règles définissant un JETON

TOKEN- L'ensemble significatif de caractères sur le jeu de caractères du langage de programmation, par exemple: ID, constante, mots-clés, opérateurs, ponctuation, chaîne littérale 

5
sravan kumar

Jeton: le type (mots-clés, identifiant, caractère de ponctuation, opérateurs multi-caractères) est simplement un jeton.

Motif: Une règle pour la formation de jeton à partir de caractères saisis.

Lexeme: C'est une séquence de caractères dans SOURCE PROGRAM assortie d'un motif pour un jeton . Fondamentalement, c'est un élément de jeton. 

4
mud1t

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}{;} 

pas la sortie réelle cependant.

_ {LE SCANNER RECHERCHE SIMPLEMENT POUR UN LEXEME DANS UN TEXTE DE PROGRAMME SOURCE JUSQU'A L'ENTREE IS EXHAUSTED 

Lexeme est une sous-chaîne d'entrées qui forme une chaîne de terminaux valide présente dans la grammaire. Chaque lexème suit un motif qui est expliqué à la fin (la partie que le lecteur peut enfin ignorer)

(La règle importante est de rechercher le préfixe le plus long possible pour former une chaîne de terminaux valide jusqu'au prochain espace blanc ... expliqué ci-dessous)

(LEXEMES:

  1. cout
  2. << 

(bien que "<" soit également une chaîne de terminal valide, mais la règle susmentionnée doit sélectionner le modèle pour le lexeme "<<" afin de générer un jeton renvoyé par le scanner)

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

TOKENS: Les jetons sont renvoyés un par un (par Scanner à la demande de l'analyseur) à chaque fois que Scanner trouve un lexème (valide). Le scanner crée, s'il n'est pas déjà présent, une entrée dans la table des symboles (ayant des attributs: principalement une catégorie de jetons et quelques autres)}, lorsqu'il trouve un lexème afin de générer son jeton.

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

Les jetons suivants sont renvoyés par l'analyseur à l'analyseur 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. <Ponctuateur, # 6>

Comme vous pouvez le constater, un jeton est une paire différente du lexème, qui est une sous-chaîne d’entrée. 

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

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

  • MOTS CLÉS
  • IDENTIFIANTS
  • LITERAUX
  • PUNCTUATEURS
  • LES OPÉRATEURS
  • Et encore une chose, 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 à cette fin. Les onglets, les nouvelles lignes, les espaces et les caractères échappés sont tous appelés séparateurs de blancs. Peu d'autres délimiteurs sont ';' ',' ':' etc, qui sont largement reconnus comme des lexèmes formant un jeton.

    Le nombre total de jetons retournés est de 8 ici. Toutefois, seules 6 entrées dans la table des symboles sont effectuées pour les lexèmes. Les lexèmes sont également au total 8 (voir la définition de lexème)

    --- Vous pouvez ignorer 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 isfollowing the rule specified by any of the listed patterns , it isvalidated as a lexeme and selected pattern will identify the categoryof lexeme, else a lexical error is reported due to either (i) notfollowing any of the rules or (ii) input consists of a badterminal-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.`
    
    3
    Mayank narula

    Lexeme - Un lexème est une séquence de caractères du programme source correspondant au modèle d'un jeton et identifiée par l'analyseur lexical en tant qu'instance de ce jeton.

    Jeton - Le jeton est une paire composée d'un nom de jeton et d'une valeur de jeton facultative. Le nom de jeton est une catégorie d’une unité lexicale. Les noms de jeton communs sont

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

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

    somme = 3 + 2;

    Tokenized 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
    
    3
    Rajat Bhatt

    Token: Token est une séquence de caractères pouvant être traitée comme une seule entité logique. Les jetons typiques sont,
    1) Identifiants
    2) mots-clés
    3) opérateurs
    4) symboles spéciaux
    5) constantes 

    Pattern: Un ensemble de chaînes de l'entrée pour lesquelles le même jeton est produit en sortie. Cet ensemble de chaînes est décrit par une règle appelée motif associé au jeton.
    Lexeme: Un lexeme est une séquence de caractères du programme source correspondant au modèle d'un jeton.

    3
    pradip

    Lexeme - Un lexème est une chaîne de caractères qui constitue l'unité syntaxique de niveau le plus bas dans le langage de programmation.

    Jeton - Le jeton est une catégorie syntaxique qui forme une classe de lexèmes, ce qui signifie à quelle classe le lexème appartient-il est-il un mot-clé ou un identifiant ou autre L’une des tâches principales de l’analyseur lexical est de créer une paire de lexèmes et de jetons, c’est-à-dire de collecter tous les caractères.

    Prenons un exemple:-

    if (y <= t) 

    y = y-3;

    Lexeme Token

    si MOT-CLÉ

    ( PARENTHÈSE GAUCHE

    y IDENTIFIANT

    <= COMPARAISON

    t IDENTIFIANT

    ) PARENTHÈSE DROITE

    y IDENTIFIANT

    = ASSGNMENT 

    y IDENTIFIANT 

    _ ARITHMATIQUE 

    3 ENTIER

    ; SEMICOLON

    Relation entre Lexeme et Token

     Relation between lexeme and token

    2
    coding_ninza

    Lexeme Les Lexèmes sont dits être une séquence de caractères (alphanumériques) dans un jeton.

    Jeton Un jeton est une séquence de caractères pouvant être identifiés comme une seule entité logique. Les jetons sont généralement des mots-clés, identifiants, constantes, chaînes de caractères, symboles de ponctuation, opérateurs. Nombres.

    Pattern Un ensemble de chaînes décrit par une règle appelée pattern. Un modèle explique ce que peut être un jeton et ces modèles sont définis à l'aide d'expressions régulières associées au jeton.

    0
    user10715886