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
Libérer: 2024-11-28 22:41:13
original
592 Les gens l'ont consulté

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')+)?
    ;
Copier après la connexion

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
Copier après la connexion

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); 
    }
}
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal