Notes sur le modèle de conception 21 - Mode interprète (interprète)

quatre problèmes d'arithmétique

Réaliser les quatre opérations arithmétiques via le mode interpréteur, telles que le calcul de la valeur de a + bc, les exigences spécifiques

1) Entrez d'abord la forme de l'expression, telle que a+b+c-d+e, et les lettres de l'expression ne doivent pas être répétées

2) Entrez les valeurs de a, b, c, d, e respectivement

3) Trouvez enfin le résultat :

 

 

Analyse de solutions traditionnelles pour résoudre quatre problèmes arithmétiques

1) Écrivez une méthode pour recevoir la forme de l'expression, puis analysez-la en fonction de la valeur saisie par l'utilisateur pour obtenir le résultat

2) Analyse du problème : si de nouveaux opérateurs sont ajoutés, tels que * / (, etc., cela n'est pas propice à l'expansion, et une autre méthode d'analyse entraînera une confusion dans la structure du programme et n'est pas assez claire.

3) Solution : Vous pouvez envisager d'utiliser le mode interpréteur, à savoir : expression -> interpréteur (peut en avoir plusieurs) -> résultat

 

Introduction de base au mode interprète

1) Dans le principe de compilation, une expression arithmétique forme une unité lexicale à travers un analyseur lexical, puis ces unités lexicales sont ensuite utilisées pour construire un arbre d'analyse grammaticale à travers un analyseur lexical, et enfin forment un arbre abstrait d'analyse lexicale. L'analyseur lexical et l'analyseur syntaxique peuvent ici être considérés comme des interprètes

2) Modèle d'interprète : étant donné une langue (expression), définissez une représentation de sa grammaire et définissez un interprète, utilisez l'interprète pour interpréter des phrases (expressions) dans la langue

3) Scénarios d'application

• L'application peut représenter une phrase dans une langue qui doit être interprétée comme un arbre syntaxique abstrait

• Certaines questions récurrentes peuvent être exprimées dans un langage simple

• Un scénario où une syntaxe simple nécessite une explication

4) Il existe également de tels exemples, tels que des compilateurs, le calcul d'expressions arithmétiques, des expressions régulières, des robots, etc.

 

 

Diagramme de classes de principe du mode interpréteur

Explication du diagramme de classe de principe - c'est-à-dire (le rôle et la responsabilité du mode interprète)

1) Contexte : est un rôle d'environnement, contenant des informations globales en dehors de l'interpréteur.

2) AbstractExpression : expression abstraite, déclare une opération d'interprétation abstraite, cette méthode est partagée par tous les nœuds de l'arbre de syntaxe abstraite

3) TerminalExpression : C'est une expression terminale, qui implémente l'opération d'interprétation liée au terminal dans la grammaire

4) NonTermialExpression : il s'agit d'une expression de symbole non terminal, et réalise l'opération d'interprétation pour les symboles non terminaux dans la grammaire.

5) Remarque : Entrez les informations Context et TerminalExpression via l'entrée Client

 

Le code principal, prenant 2+2 comme exemple, peut être analysé en une expression qui peut être calculée, et l'interpréteur peut être utilisé :

Pour une expression 2+2, utilisez Stack pour diviser l'expression en côtés gauche et droit :

    public Calculator(String expStr) { // expStr = a+b
        // Organiser la séquence d'opérations
        Stack<Expression> stack = new Stack<>();
        // L'expression est divisée en un tableau de caractères 
        char[] charArray = expStr.toCharArray (); // [a, +, b]

        Expression left = null;
        Expression right = null;
        // Traverser notre tableau de caractères, c'est-à-dire traverser [a, +, b]
        // Faire le traitement pour différentes situations
        pour (int i = 0; i < charArray.length; i++ ) {             switch (charArray[i]) {             case '+': //                 left = stack.pop();// sortir de la pile left => "a"                 right = new VarExpression(String.valueOf(charArray[++i ]));// Sortez l'expression droite "b"                 stack.push(new AddExpression(left, right));// Puis construisez AddExpresson et ajoutez la pile en fonction de la                 rupture gauche et droite obtenue;             cas '-': / /                  gauche = pile .pop();                 droite = new VarExpression(String.valueOf(charArray[++i]));









                stack.push(new SubExpression(left, right));
                break;
            default: 
                //S'il s'agit d'un Var, créez un objet VarExpression et poussez-le vers la pile stack.push
                (new VarExpression(String.valueOf(charArray[i] ) ));
                break;
            }
        }
        //Après avoir traversé tout le tableau charArray, la pile obtiendra la dernière expression this.expression
        = stack.pop();
    }

Après cela, l'expression d'addition est utilisée pour ajouter les côtés gauche et droit ensemble. Une méthode qui divise un à la fois et renvoie ensuite une phase+ ou une phase-. Les algorithmes pertinents font référence à l'utilisation de la pile pour les quatre opérations arithmétiques, et l'interpréteur encapsule tout à fait cette série d'algorithmes.
    public int interpreter(HashMap<String, Integer> var) {         return super.left.interpreter(var) + super.right.interpreter(var);     }

 

 

Notes et détails du mode interprète

1) Lorsqu'un langage doit être interprété et exécuté, les phrases du langage peuvent être représentées sous la forme d'un arbre de syntaxe abstraite, et le mode interpréteur peut être considéré pour donner au programme une bonne évolutivité

2) Scénarios d'application : compilateurs, calcul d'expressions arithmétiques, expressions régulières, robots, etc.

3) Problèmes pouvant être causés par l'utilisation d'un interpréteur : le mode interpréteur entraînera une expansion de classe et le mode interpréteur utilise des méthodes d'appel récursives, ce qui conduira à un débogage très compliqué et peut réduire l'efficacité.

 

 

 

 

 

 

 

 

Je suppose que tu aimes

Origine blog.csdn.net/qq_22059611/article/details/103305421
conseillé
Classement