Вот один из способов сделать это. Используйте опцию STATIC==false
. Следующий код должен делать то, что вам нужно
public boolean matches( String str, int k ) {
// Precondition: k should be one of the integers
// given a name in XXXConstants
// Postcondition: result is true if and only if str would be lexed by
// the lexer as a single token of kind k possibly
// preceeded and followed by any number of skipped and special tokens.
StringReader sr = new StringReader( str ) ;
SimpleCharStream scs = new SimpleCharStream( sr ) ;
XXXTokenManager lexer = new XXXTokenManager( scs );
boolean matches = false ;
try {
Token a = lexer.getNextToken() ;
Token b = lexer.getNextToken() ;
matches = a.kind == k && b.kind == 0 ; }
catch( Throwable t ) {}
return matches ;
}
Одна из проблем заключается в том, что он пропускает токены, объявленные как SKIP
или SPECIAL_TOKEN
. Например. если я использую лексер Java, то "/*hello*/\tworld // \n"
все равно будет соответствовать JavaParserConstants.ID
. Если вы не хотите этого, вам нужно сделать две вещи. Сначала зайдите в файл .jj и конвертируйте все токены SKIP
в SPECIAL_TOKENS
. Второе добавление проверяет, что специальных токенов не найдено
matches = a.kind == k && b.kind == 0 && a.specialToken == null && b.specialToken == null ;