Heim >Java >javaLernprogramm >Wie kann ich mit ANTLR einen einfachen Parser für arithmetische Ausdrücke erstellen?

Wie kann ich mit ANTLR einen einfachen Parser für arithmetische Ausdrücke erstellen?

DDD
DDDOriginal
2024-12-06 13:51:16821Durchsuche

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

ANTLR: Ein einfaches Beispiel

ANTLR ist ein leistungsstarkes Tool zum Parsen von Textdaten, aber der Einstieg kann einschüchternd sein. Für diejenigen, die ein einfaches Beispiel suchen, um die Grundlagen von ANTLR zu verstehen, finden Sie hier eine umfassende Demonstration.

Erstellen der Grammatik

Zuerst definieren wir eine einfache Grammatik in einer Datei namens Exp.g:

grammar Exp;

eval
    :   additionExp EOF
    ;

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

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

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

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

Generieren des Parsers und Lexer

Sobald die Grammatik erstellt ist, laden Sie das ANTLR-JAR herunter und führen Sie den folgenden Befehl aus, um den Parser und Lexer zu generieren:

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

Dadurch wird ExpLexer.java, ExpParser, erstellt .java- und Exp.tokens-Dateien.

Erstellen des Tests Klasse

Lassen Sie uns eine Testklasse namens ANTLRDemo.java erstellen:

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());
    }
}

Grundlegendes zur Parser-Ausführung

Kompilieren Sie ANTLRDemo und führen Sie es aus. Java. Wenn der Ausdruck korrekt ausgewertet wird, wird keine Ausgabe gedruckt. Andernfalls wird eine Fehlermeldung angezeigt.

Hinzufügen von Java-Code zur Grammatik

Um den Parser funktionsfähiger zu machen, fügen Sie Java-Code zur Grammatik in {.. hinzu. .} Blöcke:

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

Dieses Beispiel gibt das Ergebnis des Ausdrucks aus.

Zurückgeben ein Double-Wert aus der Regel

Add gibt [double value] zu jeder Regel in der Grammatik zurück, um anzugeben, dass sie einen Double-Wert zurückgibt:

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

Ändern der ANTLRDemo Klasse

Aktualisieren Sie die Klasse ANTLRDemo.java, um die zurückgegebenen Daten abzurufen Wert:

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());
    }
}

Führen Sie ANTLRDemo.java erneut aus, um das auf der Konsole gedruckte Ergebnis zu sehen.

Das obige ist der detaillierte Inhalt vonWie kann ich mit ANTLR einen einfachen Parser für arithmetische Ausdrücke erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn