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