Соответствие <= BinaryOperator с использованием ASTvisitor Clang - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть следующее AST, и я хотел бы посетить <= с помощью посетителя BinaryOperator:

| |   `-ForStmt 0xfcb1fd8 <line:7:2, line:14:2>
| |     |-DeclStmt 0xfcb1680 <line:7:7, col:20>
| |     | `-VarDecl 0xfcb15e8 <col:7, col:19> col:17 used i 'uint16_t':'unsigned short' cinit
| |     |   `-ImplicitCastExpr 0xfcb1668 <col:19> 'uint16_t':'unsigned short' <IntegralCast>
| |     |     `-IntegerLiteral 0xfcb1648 <col:19> 'int' 0
| |     |-BinaryOperator 0xfcb1a28 <col:22, col:55> 'bool' '<='
| |     | |-ImplicitCastExpr 0xfcb19f8 <col:22> 'int' <IntegralCast>

BinaryOperator наследуется от Expr::BinaryOperator, я могу ' Я не могу понять, как пройти от Expr *E до BinaryOperator *BO:

static bool vectorLoopConditionVisitor(Sema &S, BinaryOperator *BO){

    if (!BO){
    // error
      }
   if (!BO->isAssignmentOp() && //need a condition to match with "<=" ){  
      // error
    }


  return false;
}

 static bool vectorLoopVisitor(Sema &S, Stmt *St, uint32_t Depth) {
    ForStmt *Fst = dyn_cast<ForStmt>(St);

    // ...
    vectorLoopConditionVisitor(S, dyn_cast<BinaryOperator>(Fst->getCond())); 
    // this is most certainly wrong as it returns a null pointer and segfault
    //...
    vectorLoopBodyVisitor(S, Fst->getBody(), Depth);

    return false;
  }

1 Ответ

1 голос
/ 23 апреля 2020

Не могли бы вы расширить код немного больше? Как вы строите посетителя и как вы проходите по коду?

Следующий посетитель должен выполнить работу за вас:

class BinaryVisitor : public clang::RecursiveASTVisitor<BinaryVisitor> {
public:
  bool VisitBinaryOperator(clang::BinaryOperator *binaryOperator) {
    if (binaryOperator->getOpcode() != clang::BinaryOperator::Opcode::BO_LE) {
      return true;
    }

    // Handle the '<=' matching here

    return true;
  }
};

/// ...
BinaryVisitor visitor;
visitor.TraverseDecl(someDecl);

Этот посетитель будет проверять каждый BinaryOperaror и будет пропускать все, что не «меньше чем» (clang::BinaryOperator::Opcode::BO_LE).

...