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.
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
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 le
token 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.
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.
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