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
Libérer: 2024-12-06 13:51:16
original
815 Les gens l'ont consulté

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

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

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

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

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

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal