Как сопоставить переменную токену в javacc? - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь сопоставить переменную (строку) с одним из моих определенных токенов в JAVACC. Псевдокод того, что я пытаюсь сделать, это ...

String x;
if (x matches <FUNCTIONNAME>) {...}

Как мне добиться этого?

Спасибо

1 Ответ

0 голосов
/ 03 мая 2018

Вот один из способов сделать это. Используйте опцию 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 ; 
...