ANTLR4: Wie man Token injiziert

Ich versuche, einen Präprozessor für eine DSL zu implementieren, der dem CPP-Beispiel in Code / Extras nachempfunden ist. Ich verwende jedoch keine Token Factory. Wird einer benötigt? Durch Aufrufen von emit (Token) werden die Token nicht wie erwartet in den Token-Stream eingefügt.

Hier ist der Lexer:

// string-delimited path  
SPATH     :  '"' (~[\n\r])*? '"'
                {
                 emit();  // inject the current token
                 // launch another lexer on the include file, get tokens,
                 // emit them all at once here
                 List<CommonToken> tokens = Preprocessor.include(getText());
                 if (null != tokens) {
                   for (CommonToken tok : tokens) {
                     emit(tok);
                   }
                 }
               }
      ;

Hier ist die Include-Methode:

@SuppressWarnings("unchecked")
public static List<CommonToken> include(String filename) {
    List<CommonToken> tokens = null;
    try (FileReader fr = openFile(filename.substring(1, filename.length() - 1));
            BufferedReader br = new BufferedReader(fr)) {
        ANTLRInputStream input = new ANTLRInputStream(br);
        PreprocessorLexer lexer = new PreprocessorLexer(input);

        tokens = (List<CommonToken>) lexer.getAllTokens();

    } catch (IOException ioe) {
        log.error("Can't load ~{}~", ioe.getLocalizedMessage());
    }
    return tokens;
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage