Maison >Java >javaDidacticiel >Comment analyser des expressions arithmétiques avec ANTLR : un guide étape par étape ?
ANTLR : un exemple pas à pas
Bien que le site Web ANTLR fournisse des exemples de grammaires, comprendre le processus de conversion de la grammaire en code Java peut être insaisissable. Pour une compréhension plus claire, examinons un exemple simple.
Définir la grammaire
Nous allons créer une grammaire qui évalue les expressions impliquant les quatre opérateurs arithmétiques de base ( , -, *, /) et parenthèses. Nous définissons la grammaire dans un fichier nommé Exp.g.
Exp.g
grammar Exp; eval returns [double value] : exp=additionExp {$value = $exp.value;} ; additionExp returns [double value] : m1=multiplyExp {$value = $m1.value;} ( '+' m2=multiplyExp {$value += $m2.value;} | '-' m2=multiplyExp {$value -= $m2.value;} )* ; multiplyExp returns [double value] : a1=atomExp {$value = $a1.value;} ( '*' a2=atomExp {$value *= $a2.value;} | '/' a2=atomExp {$value /= $a2.value;} )* ; atomExp returns [double value] : n=Number {$value = Double.parseDouble($n.text);} | '(' exp=additionExp ')' {$value = $exp.value;} ; Number : ('0'..'9')+ ('.' ('0'..'9')+)? ;
Génération de l'analyseur et du Lexer
À l'aide du fichier jar ANTLR, exécutez la commande suivante dans le répertoire contenant Exp.g :
java -cp antlr-3.2.jar org.antlr.Tool Exp.g
Cela créera ExpLexer.java, ExpParser.java et Exp.tokens.
Écrire le test Classe
Créez ANTLRDemo.java pour tester la grammaire :
ANTLRDemo.java
import org.antlr.runtime.*; public class ANTLRDemo { public static void main(String[] args) throws Exception { ANTLRInputStream in = new ANTLRInputStream("12*(5-6)"); ExpLexer lexer = new ExpLexer(in); CommonTokenStream tokens = new CommonTokenStream(lexer); ExpParser parser = new ExpParser(tokens); System.out.println(parser.eval().value); } }
Exécuter l'exemple
Tout d'abord, recompilez les classes parser et lexer, puis exécutez ANTLRDemo:
// Recompile javac -cp .:antlr-3.2.jar ANTLRDemo.java // Run java -cp .:antlr-3.2.jar ANTLRDemo
La console devrait maintenant afficher le résultat de l'expression, qui est -12.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!