2015-05-14 7 views
7

Ich habe Probleme mit einem Python-Ziel in ANTLR4. Es scheint nur sehr wenige Beispiele zu geben, und der entsprechende Java-Code scheint nicht relevant zu sein.ANTLR4 und das Python-Ziel

Ich bin mit dem Standard Hello.g4 Grammatik:

// Define a grammar called Hello 
grammar Hello; 
r : 'hello' ID ;   // match keyword hello followed by an identifier 
ID : [a-z]+ ;    // match lower-case identifiers 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines 

Das Beispiel (aus dem Standard-Hello.g4 Beispiel gebaut):

input_ = antlr4.FileStream(_FILENAME) 
lexer = HelloLexer.HelloLexer(input_) 
stream = antlr4.CommonTokenStream(lexer) 
parser = HelloParser.HelloParser(stream) 

rule_name = 'r' 
tree = getattr(parser, rule_name)() 

Ich schrieb auch einen Zuhörer. Zu behaupten/überprüfen, ob dies richtig ist, ich wiederhole es hier:

class HelloListener(antlr4.ParseTreeListener): 
    def enterR(self, ctx): 
     print("enterR") 

    def exitR(self, ctx): 
     print("exitR") 

    def enterId(self, ctx): 
     print("enterId") 

    def exitId(self, ctx): 
     print("exitId") 

Also, zuerst, ich kann nicht garantieren, dass die Zeichenfolge ich geben werde es gültig ist, weil ich keinen Bildschirm bekommen Ausgabe. Wie kann ich von dem Baum Objekt erzählen, wenn etwas zusammenpasst? Wie extrahiere ich die passenden Regeln/Token?

Ein Python-Beispiel wäre, wenn möglich, großartig.

Antwort

3

Ich höre dich, die gleichen Probleme im Moment. Die Python-Dokumentation für v4 ist nutzlos und v3 unterscheidet sich sehr, um verwendbar zu sein. Ich denke darüber nach, zurück zu Java zu wechseln, um meine Sachen zu implementieren.

In Bezug auf Ihren Code: Ich denke, dass Ihr eigener benutzerdefinierter Listener von dem generierten HelloListener erben muss. Sie können dort drucken.

Versuchen Sie auch, ungültige Eingabe zu analysieren, um zu sehen, ob der Parser überhaupt startet. Ich bin mir aber nicht sicher über die Zeile mit getattr (parser, rule_name)(). Ich folgte den Schritten in der (leider sehr kurzen) Dokumentation für das Antlr4 Python-Ziel: https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Python+Target

Dort finden Sie auch einige Dokumentation über den Hörer Sachen. Ich hoffe es hilft.

0

Ich habe an example for Python 2 mit der Hallo-Grammatik erstellt.

Hier ist der entsprechende Code:

from antlr4 import * 
from HelloLexer import HelloLexer 
from HelloListener import HelloListener 
from HelloParser import HelloParser 
import sys 

class HelloPrintListener(HelloListener): 
    def enterHi(self, ctx): 
     print("Hello: %s" % ctx.ID()) 

def main(): 
    lexer = HelloLexer(StdinStream()) 
    stream = CommonTokenStream(lexer) 
    parser = HelloParser(stream) 
    tree = parser.hi() 
    printer = HelloPrintListener() 
    walker = ParseTreeWalker() 
    walker.walk(printer, tree) 

if __name__ == '__main__': 
    main() 

Wie fabs sagte, ist der Schlüssel aus dem erzeugten HelloListener erben. Es scheint eine gewisse Gewandtheit in diesem Problem zu geben, wie Sie sehen können, wenn Sie meine HelloPrintListener ändern, um direkt von ANTLR ParseTreeListener zu erben. Ich stellte mir vor, dass das funktioniert, da das generierte HelloListener nur leere Methoden hat, aber ich sah das gleiche Verhalten, das Sie gesehen haben (Listener-Methoden werden nie aufgerufen).

Obwohl die Dokumentation für Python-Listener fehlt, ähneln die verfügbaren Methoden Java.

0

Die Dokumentation zu antlr wurde aktualisiert, um die Unterstützung für Python 3 und Python 4 Ziele zu dokumentieren. Die Beispiele aus dem zu python3 konvertierten Antlr-Buch sind here, sie reichen aus, um jeden zu starten.