[JAVA] 5 Correspond aux parenthèses prioritaires

introduction

Dans un article précédent, j'ai ajouté println à l'interpréteur (http://qiita.com/quwahara/items/82067b00cbe1cb974e4a). Dans le processus, nous avons ajouté la fonction pour analyser ( et ) à Lexer. De plus, prenons également en charge la hiérarchisation des opérations par parenthèses.

Ce que vous voulez faire avec les parenthèses prioritaires

Je ne pense pas qu'il soit nécessaire d'expliquer, mais si vous avez un programme comme celui ci-dessous, nous visons à ce que la valeur du résultat du calcul «a» soit «35».

a = (3 + 4) * 5

Comment mettre en œuvre

L'implémentation est faite à l'analyseur. Pour réfléchir à l'endroit où mettre en œuvre l'analyse syntaxique, observez la méthode actuelle d'analyse syntaxique.

Prenez la formule sans parenthèses ci-dessous comme cible d'observation. Lors de l'analyse d'une expression sans parenthèses, faites attention à l'ordre des jetons «1» et à la méthode qui les gère.

a = 1 + 2

Le jeton «1» est le troisième de la liste des jetons et est traité par la méthode «lead ()» de Parser.

Ensuite, comparez la formule ci-dessous avec les parenthèses que vous souhaitez faire correspondre à la formule sans parenthèses. Le troisième jeton dans l'expression entre parenthèses est (.

a = (3 + 4)

D'après l'observation précédente, le jeton ( est dans la même position que le jeton 1, donc Vous pouvez vous attendre à ce que le jeton ( apparaisse dans la méthode lead (). Et puisque ( 3 + 4après letoken est une expression normale, Il peut être analysé avec la méthode ʻexpression () . Et si vous confirmez qu'il y a une parenthèse fermante )` à la fin, il semble que vous puissiez analyser la syntaxe.

Essayez de mettre en œuvre en Java

Passez à la mise en œuvre.

Parser.java

Une implémentation de Parser.java. Ajout du traitement pour hiérarchiser les parenthèses dans la partie de <-Add. Tout d'abord, vérifiez que le jeton ( apparaît dans la méthode lead (). Mettez le résultat de l'analyse de l'expression entre parenthèses avec Token expr = expression (0). Puis utilisez consume (") ") pour vous assurer qu'il y a des crochets fermants. La valeur de retour est le résultat d'analyse conservé. C'est tout pour la correspondance.

Parser.java


    private Token lead(Token token) throws Exception {
        if (factorKinds.contains(token.kind)) {
            return token;
        } else if(token.kind.equals("paren") && token.value.equals("(")) {  // <-- Add
            Token expr = expression(0);
            consume(")");
            return expr;
        } else {
            throw new Exception("The token cannot place there.");
        }
    }

Interpreter.java

Une implémentation d'Interpreter.java. Reflète-t-il la correspondance des parenthèses prioritaires? Changement de String text =" a = (3 + 4) * 5 "; en une expression entre parenthèses. Vous devriez voir 35 dans la sortie standard.

Interpreter.java


    public static void main(String[] args) throws Exception {
        String text = "a = (3 + 4) * 5";    // <-- Update
        text += "println(a)";
        List<Token> tokens = new Lexer().init(text).tokenize();
        List<Token> blk = new Parser().init(tokens).block();
        new Interpreter().init(blk).run();
        // --> 35
    }

C'est tout pour la mise en œuvre. Je vous remercie.

en conclusion

La source complète est disponible ici.

Calc https://github.com/quwahara/Calc/tree/article-5-parenthesis/Calc/src/main/java

Il y a un article de suite.

** Prend en charge les opérations à un seul terme ** http://qiita.com/quwahara/items/4069d47b511e4d11f44b

Recommended Posts

5 Correspond aux parenthèses prioritaires
17 Correspond à un tableau
Correspond à la portée
Correspond à 15 chaînes
8 Correspond à plusieurs arguments
10 Correspond à l'instruction if
14 Correspond à une expression de fonction
19 Correspond à la création d'objet
16 Correspond à l'invocation de méthode
9 Correspond à la valeur de retour
18 Correspond à la définition d'objet de type JSON
20 Correspond aux appels de méthode statiques
11 Correspond aux opérateurs de comparaison et logiques
à_ ○