Maison >Java >javaDidacticiel >Comment analyser des expressions arithmétiques avec ANTLR : un guide étape par étape ?

Comment analyser des expressions arithmétiques avec ANTLR : un guide étape par étape ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-28 22:41:13623parcourir

How to Parse Arithmetic Expressions with ANTLR: A Step-by-Step Guide?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn