Получить тип оператора для CXCursor_BinaryOperator

Я пытаюсь найти задание в исходном файле С++:

x = 10;

Я использую libclang для анализа и прохождения AST. Существует CXCursor_BinaryOperator, который представляет бинарные операторы. Есть ли способ определить, является ли это присваиванием или любым другим бинарным оператором (например, + или <= или !=)? Если нет, то как я могу определить, является ли выражение присваиванием или нет?

Спасибо заранее.


person maverik    schedule 22.04.2014    source источник


Ответы (1)


Вам может подойти следующий код:

  CXToken *tokens;
  unsigned numTokens;
  CXSourceRange range = clang_getCursorExtent(cursor);
  clang_tokenize(tu, range, &tokens, &numTokens);
  for(unsigned i=0; i<numTokens; i++) {
    CXString s = clang_getTokenSpelling(tu, tokens[i]);
    const char* str = clang_getCString(s);
    if( strcmp(str, "=") == 0 ) {
      /* found */
    }
    clang_disposeString(s);
  }
  clang_disposeTokens(tu, tokens, numTokens);
person notetau    schedule 02.05.2014
comment
К сожалению, это работает только для тривиальных выражений. Для 2 + 2 * 2 это запутает *, так как сначала будет найдено +, поскольку экстент охватывает все выражение, включая подвыражения, а не только оператор. - person Kornel; 28.03.2017
comment
@Kornel, еще более хакерский, но для обработки сложных выражений, таких как 2 + 2 * 2, убедитесь, что местоположение токена соответствует местоположению оператора. - person YvesgereY; 23.07.2017
comment
@YvesgereY как? - person taranom; 04.01.2021
comment
@taranom Ахах, извините, я не помню, что я имел в виду :) Корнел: Что мешает вам пройтись по дереву, пока не найдете разыскиваемого оператора? - person YvesgereY; 12.01.2021