2
코드/엑스트라의 CPP 예제를 모델로하여 DSL 용 전처리기를 구현하려고합니다. 그러나 토큰 팩토리를 사용하고 있지 않습니다. 하나가 필요합니까? emit (토큰)을 호출해도 예상대로 토큰이 토큰 스트림에 삽입되지 않습니다.ANTLR4 : 토큰 삽입 방법
// 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);
}
}
}
;
이 여기에 포함 방법이다 :
@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;
}
대체하지 않고 어떻게 현재 토큰을 방출합니까? emit()은 toString()이 [@ 56,110 : 123 = ' "strategy.ccl"', <0>, 7 : 15]을 반환하는 토큰을 제공합니다. <0>은 존재하지 않는 토큰을 나타내는 토큰 번호가 아닙니까? – user2643128
lexer 규칙에서 emit()을 제거하면 현재 토큰을 적절히 방출 할 수있었습니다. – user2643128
토큰에서 nextToken()을 짧게하여 다음으로 돌아갑니다. super.nextToken()을 반환합니다. 또한 도움이되었습니다. – user2643128