Suche…


Sprachunterstützung

ANTLR kann Parser für eine Reihe von Programmiersprachen generieren:

  1. C # -Ziel
  2. Python-Ziel
  3. JavaScript-Ziel
  4. Java-Ziel

Standardmäßig generiert ANTLR einen Parser aus der Befehlszeile in der Java-Programmiersprache:

Java -jar antlr-4.5.3-complete.jar yourGrammar.g4 //Will output a
    java parser

Um die Zielsprache zu ändern, können Sie den folgenden Befehl über das OS-Terminal / die Befehlszeile ausführen:

    antlr4 -Dlanguage=Python3 yourGrammar.g4 
//with alias
    java -jar antlr-4.5.3-complete.jar -Dlanguage=Python3 yourGrammar.g4 
//without alias

Anstatt den Parameter '-Dlanguage' jedes Mal in der Befehlszeile / im Terminal zu verwenden, um den gewünschten Parser für eine bestimmte Sprache zu erstellen, können Sie das Ziel aus Ihrer .g4-Grammatikdatei auswählen, indem Sie das Ziel in den globalen Abschnitt einschließen:

options {
    language  = "CSharp";
}
//or
options {
    language="Python";
}

Um die generierte Parserausgabe zu verwenden, stellen Sie sicher, dass Sie über die ANTLR-Laufzeit für die angegebene Sprache verfügen:

  1. CSharp-Laufzeit
  2. Python 2-Laufzeit
  3. Python 3 Laufzeit

Vollständige Anweisungen und Informationen zu ANTLR-Laufzeitbibliotheken

Python-Parser-Setup

Nachdem Sie Ihre .g4-Grammatikdatei mit ANTLR.jar ausgeführt haben, sollten Sie eine Reihe von Dateien generieren lassen, z.

1.yourGrammarNameListener.py
2.yourGrammarNameParser.py
3.yourGrammarName.tokens
...

Um diese in einem Python-Projekt zu verwenden, schließen Sie die Python-Laufzeitumgebung in Ihrem Arbeitsbereich ein, sodass jede Anwendung, die Sie entwickeln, auf die ANTLR-Bibliothek zugreifen kann. Dazu können Sie die Laufzeit in Ihren aktuellen Projektordner extrahieren oder innerhalb Ihrer IDE in Ihre Projektabhängigkeiten importieren.

#main.py
import yourGrammarNameParser
import sys

#main method and entry point of application

def main(argv):
    """Main method calling a single debugger for an input script"""
    parser = yourGrammarNameParser
    parser.parse(argv)

if __name__ == '__main__':
    main(sys.argv) 

Dieses Setup enthält Ihren Parser und akzeptiert Eingaben von der Befehlszeile, um die Verarbeitung einer als Parameter übergebenen Datei zu ermöglichen.

#yourGrammarNameParser.py
from yourGrammarNameLexer import yourGrammarNameLexer
from yourGrammarNameListener import yourGrammarNameListener
from yourGrammarNameParser import yourGrammarNameParser
from antlr4 import *
import sys

class yourGrammarNameParser(object):
    """
    Debugger class - accepts a single input script and processes
    all subsequent requirements
    """
def __init__(self): # this method creates the class object.
    pass
        
        
#function used to parse an input file
def parse(argv):
    if len(sys.argv) > 1:
        input = FileStream(argv[1]) #read the first argument as a filestream
        lexer = yourGrammarNameLexer(input) #call your lexer
        stream = CommonTokenStream(lexer)
        parser = yourGrammarNameParser(stream)
        tree = parser.program() #start from the parser rule, however should be changed to your entry rule for your specific grammar.
        printer = yourGrammarNameListener(tree,input)
        walker = ParseTreeWalker()
        walker.walk(printer, tree)
    else:
        print('Error : Expected a valid file')

Diese Dateien, die mit der ANTLR-Laufzeitumgebung und Ihren aus Ihrer Grammatikdatei generierten Dateien kombiniert werden, akzeptieren einen einzelnen Dateinamen als Argument und lesen und parsen Ihre Grammatikregeln.

Um die Basisfunktionalität zu erweitern, sollten Sie auch den Standardlistener erweitern, um relevante Ereignisse für Token zu behandeln, die während der Laufzeit auftreten.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow