2013-08-07 12 views
9

Ich versuche meine Grammatik von v3 nach v4 zu konvertieren und habe Probleme, die richtigen Teile zu finden.Einen String mit ANTLR4 verarbeiten

In v3 einen String zu verarbeiten, habe ich:

public static DataExtractor create(String dataspec) { 
    CharStream stream = new ANTLRStringStream(dataspec); 
    DataSpecificationLexer lexer = new DataSpecificationLexer(stream); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    DataSpecificationParser parser = new DataSpecificationParser(tokens); 

    return parser.dataspec(); 
} 

Wie kann ich das in v4 arbeiten ändern?

Antwort

13

Die Änderungen, die vorgenommen wurden, sind:

  • ANTLRStringStream wurde in ANTLRInputStream mit einem Konstruktor ersetzt, die ein jetzt String
  • Parser nimmt Regeln ein Kontextobjekt zurückgeben, die ein öffentliches Feld der returns nach dem Namen hat Klausel Ihrer Regel. So

wenn die dataspec Regel sagt: "returns [DataExtractor extractor]", v4 das Verfahren wird:

public static DataExtractor create(String dataspec) { 
    CharStream stream = new ANTLRInputStream(dataspec); 
    DataSpecificationLexer lexer = new DataSpecificationLexer(stream); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    DataSpecificationParser parser = new DataSpecificationParser(tokens); 

    return parser.dataspec().extractor; 
} 
10

Für ANTLR 4.7 der API geändert wurde ein wenig (ANTLRInputStream ist veraltet):

InputStream stream = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8)); 
lexer.setInputStream(CharStreams.fromStream(stream, StandardCharsets.UTF_8)); 
parser.setInputStream(new CommonTokenStream(lexer)); 

Hinweis: Wenn Sie die Parser + Lexer-Instanzen erneut verwenden möchten, rufen Sie ihre 'reset()' Methoden auf, nachdem Sie ihre Eingabeströme gesetzt haben.