【发布时间】:2020-08-06 06:15:44
【问题描述】:
我有以下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;
}
【问题讨论】:
标签: compiler-construction clang abstract-syntax-tree semantics visitor-pattern