用于Java程序的抽象语法树类
内容提要
CodeQL提供丰富的Java抽象语法树(AST)类,用于表示程序结构。文章列出语句类(如IfStmt、WhileStmt、TryStmt等)和表达式类(包括字面量、一元、二元、赋值、访问及杂项表达式),并说明各类的语法示例、CodeQL类名及继承关系,帮助开发者分析Java代码。
延伸解读
AST类层次结构
CodeQL的Java AST类遵循清晰的继承体系:所有语句类继承自Stmt,所有表达式类继承自Expr。语句类进一步细分为条件、循环、跳转等子类,表达式类则按字面量、一元、二元、赋值、访问等分类。这种层次结构便于在查询中利用多态性,例如使用Stmt或Expr作为参数类型来匹配所有语句或表达式。
语句类的特殊约束
部分语句类有使用限制:CatchClause只能作为TryStmt的子节点,ConstCase和DefaultCase只能出现在SwitchStmt中。这些约束反映了Java语法规则,在编写查询时需注意,避免在错误上下文中匹配这些节点。
表达式类的细分
表达式类不仅按语法形式分类,还按语义细分。例如,位运算表达式(BitwiseExpr)包含按位与、或、异或等,逻辑表达式(LogicExpr)包含逻辑与、或、非。赋值表达式分为简单赋值(AssignExpr)和复合赋值(AssignOp子类)。访问表达式区分变量访问(VarAccess)和字段访问(FieldAccess),后者是前者的子类。
Q&A
CodeQL中用于表示Java程序抽象语法树的类有哪些?
CodeQL提供了大量的类来表示Java程序的抽象语法树(AST),包括语句类(如IfStmt、WhileStmt、TryStmt等)和表达式类(如字面量、一元、二元、赋值、访问及杂项表达式)。
CodeQL中IfStmt类对应哪种Java语法?
IfStmt类对应Java中的if语句,语法为:if ( Expr ) Stmt else Stmt。
CodeQL中如何表示Java的for循环?
CodeQL中ForStmt类表示传统的for循环(for ( Expr ; Expr ; Expr ) Stmt),EnhancedForStmt类表示增强for循环(for ( VarAccess : Expr ) Stmt)。
CodeQL中哪些类表示Java的字面量?
CodeQL中表示字面量的类包括BooleanLiteral、IntegerLiteral、LongLiteral、FloatingPointLiteral、DoubleLiteral、CharacterLiteral、StringLiteral和NullLiteral。
CodeQL中如何表示Java的赋值表达式?
CodeQL中Assignment类是所有赋值表达式的父类,具体包括AssignExpr(=)、AssignAddExpr(+=)、AssignSubExpr(-=)、AssignMulExpr(*=)、AssignDivExpr(/=)、AssignRemExpr(%=)、AssignAndExpr(&=)、AssignOrExpr(|=)、AssignXorExpr(^=)、AssignLShiftExpr(<<=)、AssignRShiftExpr(>>=)和AssignURShiftExpr(>>>=)。
CodeQL中如何表示Java的数组访问?
CodeQL中ArrayAccess类表示数组访问,语法示例为a[i]。
CodeQL中如何表示Java的强制类型转换?
CodeQL中CastExpr类表示强制类型转换,语法示例为(int) f。
CodeQL中如何表示Java的try-catch语句?
CodeQL中TryStmt类表示try语句,CatchClause类表示catch子句,且CatchClause只能作为TryStmt的子节点出现。