Je lis un livre (Programming Principles and Practice by Bjarne Stroustrup).

Dans lequel il présente les jetons:

"Un jeton est une séquence de caractères qui représente quelque chose que nous considérons comme une unité, comme un nombre ou un opérateur. C'est la façon dont un compilateur C ++ traite sa source. En fait," tokeniser "sous une forme ou une autre est la manière la plus d'analyse du texte commence. "

class Token {
public:
    char kind;
    double value;
};

Je comprends ce qu'ils sont, mais il ne l'explique jamais en détail et c'est assez déroutant pour moi.

6
elizabeth 15 nov. 2017 à 16:03

4 réponses

Meilleure réponse

Comme mentionné par d'autres, Bjrane fait référence à l'analyse lexicale.

En termes généraux, tokenisation || créer des jetons, est un processus de traitement des flux d'entrée et de les diviser en blocs, sans se soucier des espaces, etc. mieux décrit précédemment par @StoryTeller. "ou comme le disait bjrane: est une séquence de caractères qui représentent quelque chose que nous considérons comme une unité".

Le jeton lui-même est un exemple de type'UDT 'défini par l'utilisateur C ++ comme int ou char, donc le jeton peut être utilisé pour définir des variables et contenir des valeurs.

UDT peut avoir des fonctions membres ainsi que des membres de données. Dans votre code, vous définissez deux fonctions membres, ce qui est très basique.

1) Genre, 2) Valeur

class Token {
public:
   char kind;
   double value;
};

Sur cette base, nous pouvons initialiser ou construire ses objets.

Token token_kind_one{'+'};

Initialisation de token_kind_one avec son genre (opérateur) '+'.

Token token_kind_two{'8',3.14};

Et token_kind_two avec son genre (entier / nombre) '8' et avec une valeur de 3,14.

Supposons que nous ayons une expression de dix caractères 1 + 2 * 3 (5/4), qui se traduit par dix jetons.

Jetons:

        |----------------------|---------------------|
Kind    |'8' |'+' |'8' |'*'|'8'|'('|'8' |'/'|'8' |')'|
        |----------------------|---------------------|
Value   | 1  |    | 2  |   | 3 |   | 5  |   | 4  |   |
        |----------------------|---------------------|

Le compilateur C ++ transfère les données du fichier vers une séquence de jetons en ignorant tous les espaces. Pour le rendre compréhensible par lui-même.

3
farhan 15 nov. 2017 à 16:16

La création de jetons est importante pour déterminer ce que fait un programme. Ce à quoi Bjarne fait référence en relation avec la source C ++ traite de la façon dont la signification d'un programme est affectée par les règles de tokenisation. En particulier, nous devons savoir ce que sont les jetons et comment ils sont déterminés. Plus précisément, comment pouvons-nous identifier un seul jeton lorsqu'il apparaît à côté d'autres caractères, et comment devrions-nous délimiter les jetons en cas d'ambiguïté.

Par exemple, considérez les opérateurs de préfixe ++ et +. Supposons que nous n'avions qu'un seul jeton + avec lequel travailler. Quelle est la signification de l'extrait suivant?

int i = 1;
++i;

Avec + uniquement, ce qui précède va-t-il simplement appliquer deux fois + unaire sur i? Ou va-t-il l'incrémenter une fois? C'est ambigu, naturellement. Nous avons besoin d'un jeton supplémentaire et introduisons donc ++ comme son propre "mot" dans la langue.

Mais maintenant, il y a un autre problème (quoique plus petit). Que se passe-t-il si le programmeur veut appliquer simplement deux fois + unaire, et non incrémenter? Des règles de traitement des jetons sont nécessaires. Donc, si nous déterminons qu'un espace blanc est toujours un séparateur pour les jetons, notre programmeur peut écrire:

int i = 1;
+ +i;

En gros, une implémentation C ++ commence par un fichier plein de caractères, les transforme initialement en une séquence de jetons («mots» avec un sens en langage C ++), puis vérifie si les jetons apparaissent dans une «phrase» qui en a des valides sens.

7
StoryTeller - Unslander Monica 15 nov. 2017 à 16:15

De manière générale, un compilateur exécutera plusieurs opérations sur un code source donné, avant de le convertir en un format binaire. L'une des premières étapes consiste à exécuter un tokenizer, où le contenu d'un fichier source est converti en jetons, qui sont des unités comprises par le compilateur. Par exemple, si vous écrivez une instruction int a, le tokenizer peut créer une structure pour stocker ces informations.

Type: integer
Identifier: A
Reserved Word: No
Line number: 10

Cela serait alors appelé un jeton et la plupart du code d'un fichier source sera décomposé en structures similaires.

-1
SCCC 15 nov. 2017 à 13:19

Il se réfère à l'analyse lexicale - l'élément nécessaire de chaque compilateur. C'est un outil permettant au compilateur de traiter un texte (comme dans: une séquence d'octets) de manière significative. Par exemple, considérez la ligne suivante en C ++

double x  = (15*3.0);  // my variable

Lorsque le compilateur regarde le texte, il divise d'abord la ligne en une séquence de jetons qui peut ressembler à ceci:

Token {"identifier", "double"}
Token {"space", " "}
Token {"identifier", "x"}
Token {"space", "  "}
Token {"operator", "="}
Token {"space", " "}
Token {"separator", "("}
Token {"literal_integer", "15"}
Token {"operator", "*"}
Token {"literal_float", "3.0"}
Token {"separator", ")"}
Token {"separator", ";"}
Token {"space", "  "}
Token {"comment", "// my variable"}
Token {"end_of_line"}

Cela n'a pas à être interprété comme ci-dessus (notez que dans mon cas, kind et value sont des chaînes), c'est juste un exemple de la façon dont cela peut être fait. Vous faites généralement cela via des expressions régulières.

Quoi qu'il en soit, les jetons sont plus faciles à comprendre pour la machine qu'un texte brut. La prochaine étape pour le compilateur est de créer ce qu'on appelle arbre de syntaxe abstraite basé sur la tokenisation et enfin d'ajouter sens à tout.

Notez également qu'à moins que vous n'écriviez un analyseur, il est peu probable que vous utilisiez ce concept.

5
freakish 15 nov. 2017 à 13:22
47308141