概述:ASTNode就是AST的描述节点,想很娴熟的生成出java文件,必须得此套节点有所了解
ASTNode:所有AST节点的父类
static Class nodeClassForType(int nodeType):静态方法,通过类型type获取到对应的class对象
checkNewChild(ASTNode node, ASTNode newChild,boolean cycleCheck, Class nodeType):检查传入的孩子。
boolean subtreeMatch(ASTMatcher matcher, Object other):比较两个节点的子是否向匹配,ASTMatcher 可以通过节点获取
ASTNode copySubtree(AST target, ASTNode node):拷贝节点
ASTNode 的子节点:
ASTNode 有几个抽象节点,它们不具体描述,但是却对节点的类型进行了很好的分组
抽象类:
Comment:所有跟注释相关的节点的父类,它里面有三个状态属性,isBlockComment,isLineComment和isDocComment来描述是什么类型的注释。这些跟它的子类也是一一对应的。
Comment:
LineComment
BlockComment
Javadoc
Comment的三个子类:都只是起到描述的作用,并不实质包含内容。LineComment就是表示单行注释"//",BlockComment表示的是一个注释区域"/* */",不过Javadoc是有内容的,TagElement就是具体的内容
Javadoc:
/** { TagElement } */
BodyDeclaration:在body里面定义了javadoc和IExtendedModifier两个子节点,所以它的所以子类都具备描述Modifier的特性。
BodyDeclaration:
ClassDeclaration
InterfaceDeclaration
EnumDeclaration
MethodDeclaration
ConstructorDeclaration
FieldDeclaration
Initializer
EnumConstantDeclaration
AnnotationTypeDeclaration
AnnotationTypeMemberDeclaration
[Javadoc] { ExtendedModifier } XXXX
Expression:所有具有表达式特性的节点的父类,
Expression:
Annotation,
ArrayAccess,
ArrayCreation,
ArrayInitializer,
Assignment,
BooleanLiteral,
CastExpression,
CharacterLiteral,
ClassInstanceCreation,
ConditionalExpression,
FieldAccess,
InfixExpression,
InstanceofExpression,
MethodInvocation,
Name,
NullLiteral,
NumberLiteral,
ParenthesizedExpression,
PostfixExpression,
PrefixExpression,
StringLiteral,
SuperFieldAccess,
SuperMethodInvocation,
ThisExpression,
TypeLiteral,
VariableDeclarationExpression
Statement:表示一个代码片段,此父类的大部分方法都过时了
Statement:
AssertStatement,
Block,
BreakStatement,
ConstructorInvocation,
ContinueStatement,
DoStatement,
EmptyStatement,
ExpressionStatement,
ForStatement,
IfStatement,
LabeledStatement,
ReturnStatement,
SuperConstructorInvocation,
SwitchCase,
SwitchStatement,
SynchronizedStatement,
ThrowStatement,
TryStatement,
TypeDeclarationStatement,
VariableDeclarationStatement,
WhileStatement
Type:所有描述类型的节点的父类,它里面就提供了一些判断节点类型的方法,isXXX()
Type:
PrimitiveType
ArrayType
SimpleType
QualifiedType
ParameterizedType
WildcardType
PrimitiveType:
byte
short
char
int
long
float
double
boolean
void
ArrayType:
Type [ ]
SimpleType:
TypeName
ParameterizedType:
Type < Type { , Type } >
QualifiedType:
Type . SimpleName
WildcardType:
? [ ( extends | super) Type ]
VariableDeclaration:它的两个子类SingleVariableDeclaration是定义一个变量,并且可以初始化。VariableDeclarationFragment是为已有的类型进行赋值。
VariableDeclaration:
SingleVariableDeclaration
VariableDeclarationFragment
实体类:这些实体类都是直接继承ASTNode的
CompilationUnit:一个编辑单元包含PackageDeclaration,ImportDeclaration和TypeDeclaration(包,引入和类体)
CompilationUnit:
[ PackageDeclaration ]
{ ImportDeclaration }
{ TypeDeclaration | EnumDeclaration | AnnotationTypeDeclaration | ; }
对于单数子节点用[]修饰,复数子节点用{}描述。单数子节点是用ChildPropertyDescriptor对象存储的,复数节点用ChildListPropertyDescriptor存储。
recordModifications():记录修改痕迹的一个方法,在你要对该编辑单元做任何更改之前,调用此方法开始进行记录。
TextEdit rewrite(IDocument document, Map options):用于把编辑单元的内容写入到文件中。
unit添加三中子元素的方式:
PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
unit.setPackage(packageDeclaration);
packageDeclaration.setName(ast.newSimpleName("astdemo"));
for (int i = 0; i < IMPORTS.length; ++i)
{
ImportDeclaration importDeclaration = ast.newImportDeclaration();
importDeclaration.setName(ast.newName(getSimpleNames(IMPORTS[i])));
if (IMPORTS[i].indexOf("*") > 0)
importDeclaration.setOnDemand(true);
else
importDeclaration.setOnDemand(false);
unit.imports().add(importDeclaration);
}
//类名
TypeDeclaration classType = ast.newTypeDeclaration();
classType.setInterface(false);
List classTypeModifier = classType.modifiers();
classTypeModifier.add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
classType.setName(ast.newSimpleName("MyFirstApp"));
classType.setSuperclassType(ast.newSimpleType(ast.newSimpleName("ApplicationWindow")));
unit.types().add(classType);
从上面代码可以看出,astnode节点在添加单数类型的子节点的时候,用的是set,在添加复数类型的子节点的时候,用的是list的add方法。
PackageDeclaration:包描述节点,如下所示Package有三个子节点:Javadoc,Annotation和Name
PackageDeclaration:
[ Javadoc ] { Annotation } package Name ;
PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
unit.setPackage(packageDeclaration);
packageDeclaration.setName(ast.newSimpleName("astdemo"));
packageDeclaration.setJavadoc(null);
packageDeclaration.annotations();
ImportDeclaration:import 有两种简单属性和一个子节点 static和. *状态,Name子节点。
注意在AST中是用SimplePropertyDescriptor存放简单属性的。
ImportDeclaration:
import [ static ] Name [ . * ] ;
for (int i = 0; i < IMPORTS.length; ++i)
{
ImportDeclaration importDeclaration = ast.newImportDeclaration();
importDeclaration.setName(ast.newName(getSimpleNames(IMPORTS[i])));
if (IMPORTS[i].indexOf("*") > 0)
importDeclaration.setOnDemand(true);
else
importDeclaration.setOnDemand(false);
importDeclaration.setStatic(true);
unit.imports().add(importDeclaration);
}
Modifier:描述关键字的,它里面有一个静态的内部类,用于描述这些关键字ModifierKeyword
Modifier:
public
protected
private
static
abstract
final
native
synchronized
transient
volatile
strictfp
TagElement:这个节点是配合Comment一起使用的,Comment描述的是那种类型的注释,而TagElement是注释的具体内容,一个TagElement是包含多种元素的“@Identifier ”就是我们在注释中看到的那个啥。在TagElement里面也定义了很多这种注解符号,可以直接使用。
TagElement:
[ @ Identifier ] { DocElement }
DocElement:
TextElement
Name
MethodRef
MemberRef
{ TagElement }
TextElement:跟TagElement用法类似只是存放的是纯文本内容。
分享到:
相关推荐
ASTNode* parseF() { int num = expect("num"); // 假设expect函数读取并验证输入是数字 return new NumNode(num); } // T 函数,解析乘法表达式 ASTNode* parseT() { ASTNode* left = parseF(); while (match...
hook(ast, NodeTypes.CALL_EXPRESSION, node => { if (node.arguments.some(arg => arg.value === targetParam)) { console.log('找到目标参数:', node); } }); ``` 上述代码中,我们创建了一个hook,当遇到`CALL...
ASTNode right = calculate(node.getRight()); switch (node.getOperator()) { case ADD: return left.getValue() + right.getValue(); case SUBTRACT: return left.getValue() - right.getValue(); // ... ...
ASTNode* exprNode = new ASTNode(operation, lastTerm, currentTerm); lastTerm = exprNode; } ``` 这里,`lookahead`表示当前的输入符号,`consume()`用于移动到下一个符号,`lastTerm`和`currentTerm`保存了...
4. **ASTNode类**:ognl表达式解析后的抽象基类,每个子类对应一种ognl表达式类型,如`ASTProperty`表示属性访问,`ASTMethod`表示方法调用。 5. **TypeConverter接口**:定义了将对象转换为其他类型的方法,ognl...
handwrite 手写一些常见实现的 demo angular-module angular1.x 模块依赖 angular-todolist angular1.x 所开发的单页面应用 ast node typescript cilpboard 粘贴板测试 generator corb 跨域读取阻止 vue-router vuex...
如果遇到“java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode”的错误,这意味着在使用Hibernate的HQL查询时,忘记为表名添加别名。正确的做法是在查询语句中明确...
下面我们将深入探讨如何使用`ast`模块以及`astmanipulation`项目中可能包含的一些常见操作。 1. **解析源代码为AST**:使用`ast.parse()`函数,可以将Python源代码字符串转换为AST对象。例如: ```python import ...
3. `ASTNode.java`:抽象语法树节点的基类。 4. `SemanticAnalyzer.java`:进行语义分析的类。 5. `CodeGenerator.java`:代码生成器的实现。 6. `SNLCompiler.java`:整合以上各部分的主类,用于驱动整个编译过程。...
3. **AST Node Classes**: 对于每个可能的表达式结构,如数字、加减乘除运算符、括号等,都有对应的节点类,例如`NumberNode`、`OperatorNode`、`ParenthesisNode`等。这些节点包含必要的属性(如数值、操作符类型)...
在实际项目中,为了提高代码的可读性和可维护性,我们可能会将这些功能封装到独立的类或结构体中,如Lexer(词法分析器)、Parser(解析器)、ASTNode(AST节点)和Evaluator(求值器)。此外,为了增加引擎的灵活性...
js-x射线 JavaScript AST分析。 创建此软件包的目的是导出 AST Analysis,以实现更好的代码演化并允许对开发人员和研究人员的更...检索Node.js所需的依赖项和文件。 检测不安全的RegEx。 当AST分析出现问题或无法遵
39 AST必知必会.mp4 40 futter实战.mp4 41 排序算法.mp4 42 复杂算法详解.mp4 43 树与图类算法.mp4 44 常见JS设计模式解析.mp4 45 设计模式实战.mp4 46 Js常见开发优化总结.mp4 47 大厂常见问题解决方案.mp4...
39 AST必知必会.mp4 40 futter实战.mp4 41 排序算法.mp4 42 复杂算法详解.mp4 43 树与图类算法.mp4 44 常见JS设计模式解析.mp4 45 设计模式实战.mp4 46 Js常见开发优化总结.mp4 47 大厂常见问题解决方案.mp4...
39 AST必知必会.mp4 40 futter实战.mp4 41 排序算法.mp4 42 复杂算法详解.mp4 43 树与图类算法.mp4 44 常见JS设计模式解析.mp4 45 设计模式实战.mp4 46 Js常见开发优化总结.mp4 47 大厂常见问题解决方案.mp4...
39 AST必知必会.mp4 40 futter实战.mp4 41 排序算法.mp4 42 复杂算法详解.mp4 43 树与图类算法.mp4 44 常见JS设计模式解析.mp4 45 设计模式实战.mp4 46 Js常见开发优化总结.mp4 47 大厂常见问题解决方案.mp4...
在处理Markdown时,你可能会遇到一些常见的问题,如代码块的高亮、表格的处理、自定义HTML标签的安全性等。`node-markdown-parser` 结合 Remark 和 Rehype 生态,通常能提供良好的解决方案。例如,可以使用 `rehype-...
需要node基础,以及npm的使用 掌握es6语法 3.本课程最终掌握的webpack的内容 webpack常见配置 webpack高级配置 webpack优化策略 ast抽象语法树 webpack中的 掌握webpack流程,手写webpack 手写webpack中常见的装载机...
Acorn生成的AST允许开发者对代码进行遍历、修改和分析,这在编译器、转换器和静态分析工具中非常常见。通过遍历AST,我们可以实现诸如代码格式化、代码检查、转换成其他语言等功能。 三、Acorn的主要功能 1. **...
for node in ast.walk(tree): if isinstance(node, ast.Lambda): lambda_args = [arg.arg for arg in node.args.args] lambda_body = ast.literal_eval(str(node.body)) return lambda *args: eval(lambda_body...