Puis-je trouver un exemple de code ANTLR de base ?
ANTLR peut être un outil complexe à comprendre, en particulier pour les débutants. Pour une approche plus simplifiée, voici un exemple qui illustre le processus de création d'une calculatrice à quatre opérations à l'aide d'ANTLR. Cet exemple couvre l'ensemble du processus depuis la définition de la grammaire jusqu'à la génération du code Java.
Définition de la grammaire
Le fichier de grammaire, Exp.g, définit la grammaire de la calculatrice.
grammar Exp; // Entry point of the parser eval returns [double value] : additionExp ; // Addition and subtraction have lower precedence additionExp returns [double value] : multiplyExp ( '+' multiplyExp | '-' multiplyExp )* ; // Multiplication and division have higher precedence multiplyExp returns [double value] : atomExp {$value = $a1.value;} ( '*' atomExp {$value *= $a2.value;} | '/' atomExp {$value /= $a2.value;} )* ; // Expression atom: a number or parenthesis-enclosed expression atomExp returns [double value] : Number {$value = Double.parseDouble($n.text);} | '(' exp=additionExp ')' {$value = $exp.value;} ; // Number: an integer or decimal value Number : ('0'..'9')+ ('.' ('0'..'9')+)? ; // Ignore white space WS : (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;} ;
Intégration du code Java
Pour ajouter Java codez la grammaire, utilisez le bloc { } avec du Java simple à l'intérieur. Cependant, les valeurs de double retour nécessitent un signe dollar ($) devant elles.
// Entry point of the parser eval returns [double value] : exp=additionExp {$value = $exp.value;} ;
Génération de code ANTLR
Utilisez le pot ANTLR pour générer l'analyseur et l'analyseur à partir de la grammaire.
java -cp antlr-3.2.jar org.antlr.Tool Exp.g
Test Classe
Créez une classe de test pour exécuter la calculatrice.
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().value); // Print the result } }
Exécuter l'exemple
Compilez les classes et exécutez le test classe. Le résultat de l'expression 12*(5-6) sera imprimé.
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!