2013-08-07 15 views
9

Sto provando a convertire la grammatica da v3 a v4 e avendo qualche problema a trovare tutti i pezzi giusti.Elaborazione di una stringa con ANTLR4

In v3 per elaborare una stringa, ho usato:

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

Come posso cambiare questo per lavorare in v4?

risposta

13

Le modifiche apportate sono:

  • ANTLRStringStream è stato sostituito con un costruttore in ANTLRInputStream che prende un String
  • regole parser ora restituiscono un oggetto contesto che ha un campo pubblico chiamato a seconda del returns clausola della tua regola.

Quindi, se la regola dataspec dice "returns [DataExtractor extractor]", v4 il metodo diventa:

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

Per ANTLR 4.7 l'API è stato cambiato un po '(ANTLRInputStream è deprecata):

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

Suggerimento: se vuoi riutilizzare le istanze parser + lexer, chiama i loro metodi 'reset()' dopo aver impostato i loro flussi di input.