Les secrets de Kotlin que vous ne connaissez pas (1)

Cet article parle principalement du premier secret de la branche Koltin: comment les mots-clés Koltin (final / if / for) et les opérateurs (+ / - /? :) sont-ils reconnus? Il y aura 3 à 4 articles pour présenter d'autres secrets l'un après l'autre. Le code et les autres informations mentionnés dans l'article ont été ouverts au système de connaissances Android et Android-Body

Les gens communiquent principalement par le langage. La communication entre les programmes est-elle possible? Quelle est la communication?

La réponse est oui, la communication entre les personnes dépend principalement de la langue, et la communication entre les programmes peut également dépendre de la langue. La langue est grossièrement divisée en chinois, anglais, japonais, etc. Le but est d'unifier différents styles de culture pour la communication. Les programmes incluent C, Python, JAVA, Kotlin, etc., dont le but est de communiquer avec des personnes dans différents styles de langages de programmation, mais à la fin, ils seront convertis en instructions informatiques pour la reconnaissance et l'exécution de la machine. Les langues humaines sont diverses et changeantes La raison principale de la diversité et du changement est que les gens sont différents les uns des autres et que chacun a sa propre façon de penser et ses caractéristiques. Comprendre une phrase peut avoir des significations différentes, mais le programme est fixe et rigoureux et ne peut tolérer aucune trace d'erreurs et de failles, c'est pourquoi le programme est sujet aux bogues. tel que:

Xiaomei: Prenons rendez-vous ce soir

  • People: Pourquoi me demandez-vous? Vais-je porter un costume? Faites une coiffure?

  • Procédure: Rouler

Le programme est si froid, car il est rigoureux. Il faut lui dire la date de la date, le lieu de la date, quoi faire à la date, combien de personnes à ce jour, quoi apporter, combien de temps à ce jour, avez-vous besoin d'apporter de l'argent et de l'utiliser ce soir à la maison? Nous savons que JAVA et Kotlin peuvent fonctionner sur jvm, et en même temps, ils convertiront le langage en bytecode pour la reconnaissance de la machine.Ils ont leur propre style et spécifique mais se conforment à peu près à la définition de la composition du langage: lexicale, grammaire, sémantique . Kotlin est maintenant promu par Google et de nombreuses bibliothèques officielles et bibliothèques Gradle ont également été transformées en Koltin, ce qui montre son importance. Aujourd'hui, nous analyserons comment les principaux avantages de kotlin sont transformés en code machine. Je crois que ce que tout le monde entend signifie souvent savoir ce que c'est et ne pas savoir ce que c'est . Tout cela que nous analysons sous Koltin.

Comment les mots-clés Koltin (final / if / for) et les opérateurs (+ / - /? :) sont-ils reconnus?

En fait, cette question peut être comprise comme comment chaque caractère d'entrée est reconnu comme un mot? Abréviation: analyse lexicale

Analyse lexicale: L'étape d'analyse lexicale est la première étape du processus de compilation et constitue la base de la compilation. La tâche à ce stade est de lire le programme source caractère par caractère de gauche à droite, c'est-à-dire de parcourir le flux de caractères qui constitue le programme source, puis de reconnaître les mots (également appelés symboles ou symboles de mots) selon les règles de formation des mots. Wikipédia

Vous pouvez voir qu'il existe nos mots-clés et opérateurs communs dans KtTokens, ainsi que des identifiants, des modificateurs de droits d'accès, etc. Le rôle principal joué ici est le flux de jetons. En fait, il s'agit d'énumérer toutes les unités lexicales de Kotlin une par une et de les regrouper, puis d'effectuer une analyse lexicale. On peut voir qu'il ne s'agit pas simplement de chaînes définies, mais créées via différents types de KtToken, mais elles sont toutes héritées de IElementType.

public class KtToken extends IElementType {
    public KtToken(@NotNull @NonNls String debugName) {
        super(debugName, KotlinLanguage.INSTANCE);
    }
}
复制代码

IElementType est un type de nœud d'arbre de syntaxe (AST). Qu'est-ce qu'un arbre de syntaxe? Je vous le présenterai plus tard. La chose la plus intéressante est que vous pouvez voir que super reçoit deux paramètres: le premier debugName est l'opérateur et l'identificateur de mot-clé que nous avons définis, et le deuxième paramètre est la classe KotlinLanguage transmise.

public class KotlinLanguage extends Language {
    @NotNull
    public static final KotlinLanguage INSTANCE = new KotlinLanguage();
    public static final String NAME = "Kotlin";

    private KotlinLanguage() {
        super("kotlin");
    }
}

public class KotlinFileType extends LanguageFileType {
    public static final String EXTENSION = "kt";
    public static final KotlinFileType INSTANCE = new KotlinFileType();

    private final NotNullLazyValue<Icon> myIcon = new NotNullLazyValue<Icon>() {
        @NotNull
        @Override
        protected Icon compute() {
            return KotlinIconProviderService.getInstance().getFileIcon();
        }
    };

    @Override
    @NotNull
    public String getName() {
        return KotlinLanguage.NAME;
    }

    @Override
    public Icon getIcon() {
        return myIcon.getValue();
    }
}
复制代码

KotlinLanguage étend le langage, comme son nom l'indique, déclare le langage Koltin. KotlinFileType définit les fichiers Koltin se terminant par .kt et l'icône de Koltin. Dans le répertoire psi.idea. Nous pouvons ouvrir un peu notre esprit. Pouvons-nous définir notre propre langage et le nommer d'après le fichier que nous voulons terminer, comme .wm , la réponse est oui. Ceux qui sont intéressés peuvent pratiquer.

Analyseur lexical

Nous voyons qu'il existe de nombreux mots-clés et opérateurs familiers dans KtTokens tels que: null, false, &&,?:. Ils sont tous couramment utilisés par nous. Une fois que nous les avons saisis, il est composé de plusieurs caractères. La combinaison de plusieurs caractères est-elle donc notre mot-clé ou un groupe de caractères dénués de sens? À ce stade, un analyseur lexical est utilisé .

Analyseur lexical: L'analyse lexicale est le processus de conversion d'une séquence de caractères en une séquence de mots (Token). Le programme ou la fonction qui effectue une analyse lexicale est appelé un lexer (Lexer en abrégé), également appelé scanner. - Encyclopédie

Vous pouvez voir l'analyseur lexical open source utilisé par Koltin: JFlex (https://github.com/jflex-de/jflex/) . Définissez d'abord un fichier qui peut ajouter des règles lexicales se terminant par ** ". Flex" .

1 signifie segment de code utilisateur: tout le contenu de ce segment sera copié avant la déclaration de classe de la classe lexicale générée. Dans ce paragraphe, les instructions package et import sont courantes. Comme le montre la figure, nous avons ajouté import java.util. * ;, import org.jetbrains.kotlin.lexer.KtTokens; etc.
2 signifie paramètres de configuration et section de déclaration: utilisé pour personnaliser l'analyseur lexical, y compris le nom de la classe, le parent classe, modificateur d'autorisation Attendez, commencez par% comme marque. Par exemple:% class _JetLexer
3 signifie des règles lexicales: un ensemble d'expressions régulières et d'actions, c'est-à-dire le code à exécuter lorsque l'expression régulière est mise en correspondance avec succès

Après la définition, JFlex lira le fichier de configuration et générera une classe _JetLexer d'analyseur lexical. S'il y a deux expressions régulières «non» et note », l'analyseur correspondra à« note »car c'est la plus longue. Si deux Si les expressions régulières sont exactement les mêmes et ont la même longueur, le scanner correspondra à l'expression listée en premier dans la description. S'il n'y a pas d'expression régulière correspondante, l'analyseur lexical terminera l'analyse du flux d'entrée et donnera un message d'erreur.

public class KotlinLexer extends FlexAdapter {
    public KotlinLexer() {
        super(new _JetLexer((Reader) null));
    }
}

public class FlexAdapter extends LexerBase {

    public void start(@NotNull CharSequence buffer, int startOffset, 
                        int endOffset, int initialState) {
        if (buffer == null) {
            $$$reportNull$$$0(1);
        }

        this.myText = buffer;
        this.myTokenStart = this.myTokenEnd = startOffset;
        this.myBufferEnd = endOffset;
        this.myFlex.reset(this.myText, startOffset, endOffset, initialState);
        this.myTokenType = null;
    }
复制代码

Le _JetLexer généré est finalement référencé par KotlinLexer. KotlinLexer hérite de LexerBase. Une méthode importante dans Lexer est start (buffer, startOffset, endOffset), qui représentent respectivement le caractère d'entrée, le décalage du début du caractère et le décalage de la fin du caractère. _JetLexer est l'endroit où traiter divers caractères. La principale méthode d'implémentation est advance () , qui correspondra à certains opérateurs de mots-clés définis par lui-même en fonction des caractères d'entrée, puis en sortie.

Pour résumer

Connaître la table doit aussi connaître l'intérieur.En combinant les connaissances ci-dessus, nous pouvons obtenir comment les mots clés Koltin (final / if / for) et les opérateurs (+ / - /? :) sont reconnus. Il est grossièrement divisé en 4 étapes: source d'entrée, balayage, analyse et sortie comme suit:

1. Nous entrons if, mots-clés finaux, etc. dans Studio (abréviation: source d'entrée)
2. La méthode de démarrage dans Lexer obtiendra la chaîne que nous avons entrée (abréviation: scan)
3. La méthode avancée de _JetLexer correspondra à la régularité en fonction de l'entrée (Abréviation: analyse)
4. Après avoir mis en correspondance la régularité correspondante, les mots-clés et opérateurs définis dans KtTokens seront affichés (abréviation: sortie)

Je suppose que tu aimes

Origine blog.csdn.net/weixin_55596273/article/details/115288238
conseillé
Classement