Maison >Java >javaDidacticiel >Comment puis-je créer un analyseur d'expression arithmétique simple à l'aide d'ANTLR ?

Comment puis-je créer un analyseur d'expression arithmétique simple à l'aide d'ANTLR ?

DDD
DDDoriginal
2024-12-06 13:51:16821parcourir

How Can I Create a Simple Arithmetic Expression Parser Using ANTLR?

ANTLR : un exemple simple

ANTLR est un outil puissant pour analyser des données textuelles, mais démarrer peut être intimidant. Pour ceux qui recherchent un exemple simple pour comprendre les principes fondamentaux d'ANTLR, voici une démonstration complète.

Création de la grammaire

Tout d'abord, définissons une grammaire simple dans un fichier appelé Exp.g :

grammar Exp;

eval
    :   additionExp EOF
    ;

additionExp
    :   multiplyExp
        ( '+' multiplyExp
        | '-' multiplyExp
        )*
    ;

multiplyExp
    :   atomExp
        ( '*' atomExp
        | '/' atomExp
        )*
    ;

atomExp
    :   Number
    |   '(' additionExp ')'
    ;

Number
    :   ('0'..'9')+ ('.' ('0'..'9')+)?
    ;

Génération de l'analyseur et Lexer

Une fois la grammaire créée, téléchargez le jar ANTLR et exécutez la commande suivante pour générer l'analyseur et le lexer :

java -cp antlr-3.2.jar org.antlr.Tool Exp.g

Cela créera le ExpLexer.java, ExpParser Fichiers .java et Exp.tokens.

Création du test Classe

Créons une classe de test appelée ANTLRDemo.java :

import org.antlr.runtime.*;

public class ANTLRDemo {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("12*(5-6)");
        ExpLexer lexer = new ExpLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        ExpParser parser = new ExpParser(tokens);
        System.out.println(parser.eval());
    }
}

Comprendre l'exécution de l'analyseur

Compilez et exécutez ANTLRDemo. Java. Si l’expression est évaluée correctement, aucune sortie ne sera imprimée. Sinon, un message d'erreur s'affichera.

Ajout de code Java à la grammaire

Pour rendre l'analyseur plus fonctionnel, ajoutez du code Java à la grammaire à l'intérieur de {.. .} blocs :

eval
    :   additionExp {
            /* plain code block! */
            System.out.println("value equals: " + $value);
        }
    ;

Cet exemple imprime le résultat de l'expression.

Retour une valeur double de la règle

Ajouter des retours [valeur double] à chaque règle de la grammaire pour indiquer qu'elles renvoient un double :

eval returns [double value]
    :   additionExp {
            /* plain code block! */
            System.out.println("value equals: " + $value);
        }
    ;

Modifier la démo ANTLRDemo class

Mettez à jour la classe ANTLRDemo.java pour récupérer le retour value :

import org.antlr.runtime.*;

public class ANTLRDemo {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("12*(5-6)");
        ExpLexer lexer = new ExpLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        ExpParser parser = new ExpParser(tokens);
        System.out.println(parser.eval());
    }
}

Exécutez à nouveau ANTLRDemo.java pour voir le résultat imprimé sur la console.

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