首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Groovy】编译时元编程 ( 利用注解进行 AST 语法转换 | 定义注解使用 GroovyASTTransformationClass 注明 AST 转换接口 | AST 转换接口实现 )

文章目录 一、利用注解进行 AST 语法转换 1、定义注解使用 GroovyASTTransformationClass 注明 AST 转换接口 2、AST 转换接口实现 3、定义 Groovy...类使用 @Compile 注解修饰需要拦截方法 4、执行结果 一、利用注解进行 AST 语法转换 ---- 1、定义注解使用 GroovyASTTransformationClass 注明 AST...并进行遍历 // ModuleNode 类节点封装在了如下成员 // List classes = new LinkedList<ClassNode...with { // 找到了 Student 下 hello 方法 // MethodNode 节点下调用 // it 就是...@Compile 注解修饰需要拦截方法 最后 , 实现 Groovy 类 , 该类方法上使用 @Compile 注解 ; class Student{ def name @Compile

37220

【Groovy】编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理类 | 分析 Groovy 类 AST 语法 )

文章目录 一、编译时元编程引入 二、声明需要编译时处理类 三、分析 Groovy 类 AST 语法 一、编译时元编程引入 ---- 之前 " 【Groovy】MOP 元对象协议与元编程 " 系列博客..., 都是围绕 MetaClass " 运行时元编程 " , 其在运行时才进行相关元编程操作 , 如方法注入 , 方法委托等 ; 在编译时也可以进行元编程操作 ; Java 和 Android... , 可以使用 注解处理器 AbstractProcessor 实现 APT 编译时技术 , 参考 【Android APT】 专栏 ; Groovy 实现编译时技术 , 类似于 Java...编译时技术 ; 二、声明需要编译时处理类 ---- 声明一个 Student 类 , 在其中定义成员变量和成员方法 ; 之后需要在编译时处理该类 ; class Student{ def...Inspect AST 选项 , 分析上述 Student 类 AST 语法 ; 分析结果在 Groovy AST Browser 对话框显示 ;

45340
您找到你想要的搜索结果了吗?
是的
没有找到

逆向进阶,利用 AST 技术还原 JavaScript 混淆代码

语法没有单一格式,选择不同语言、不同编译器,得到结果也是不一样 JavaScript 编译器有 Acorn、Espree、Esprima、Recast、Uglify-JS 等,使用最多是...[01] AST编译位置 在编译原理编译器转换代码通常要经过三个步骤:词法分析(Lexical Analysis)、语法分析(Syntax Analysis)、代码生成(Code Generation...:将 JavaScript 代码解析成 AST 语法; @babel/traverse:遍历、修改 AST 语法各个节点; @babel/generator:将 AST 还原成 JavaScript...接着前面的例子,原代码是 const a = 1;,现在我们把 a 变量修改为 b,值 1 修改为 2,然后将 AST 还原生成 JS 代码: const parser = require("@...是 1 AST 位置,如下图所示: [08] @babel/traverse 当代码多了,我们不可能像前面那样挨个定位修改,对于相同类型节点,我们可以直接遍历所有节点来进行修改,这里就用到了

4.6K54

python ast模块

首先第一个问题是, 这个ast模块有什么用呢? ast提供了访问和修改上述抽象语法功能.可以做一些比如测试,代码生成,静态分析等等....class ast.NodeVisitor 和 class ast.NodeTransformer 这两个区别就是visit是修改原来node,transformer可以替换一个node....好,现在我们做这样一个事情.对于某个class, 发生函数调用时候,打出一条log,这种情况调试时候是很常见吧.那么这个可以用getattr来做,就是getattr时候判断是不是一个函数,如果是函数就打出...parse方法得到ast tree根节点root_node, 我看可以通过根节点来遍历语法,从而对python代码进行分析和修改。...ast.parse(可以直接查看ast模块源代码)方法实际上是调用内置函数compile进行编译,如下所示: def parse(source, filename='', mode=

1.9K20

the-super-tiny-compiler源码解析

一.目标 通过实现编译器来支持简单表达式转换,把Lisp风格函数调用转换成C风格,例如: LISP-style C-style 2 + 2...AST根节点 let newAst = { type: 'Program', body: [], }; // 偷懒以简单粗暴方式维持新旧AST联系,方便在遍历过程操作AST...visitor与transformer实现上是独立两层,所以需要手动记录新旧两棵联系,比如上面转换部分源码: // 偷懒以简单粗暴方式维持新旧AST联系,方便在遍历过程操作AST ast..._context = expression.arguments; 这样就知道当前正在访问旧节点对应节点应该挂到哪个位置了,例如: // 旧父节点身上挂着对应树节点孩子数组,把节点填进去...更合理做法是以非侵入方式记录当前活跃节点容器,由于函数调用允许嵌套,需要用栈结构来记录: // 用额外数据结构维持新旧AST联系 let stack = [newAst.body]; function

1.1K40

前端JavaScript代码混淆加密原理简单示例及介绍

简单来说,就是通过修改代码控制流语句(如 if、while 等)顺序、嵌套、去除等方式来增加代码复杂性,从而使得代码难以被反编译、破解或者逆向工程攻击。...它能够表示出代码结构和语义,可以被用于代码分析、优化和转换。AST语法通常由编译器或解释器生成,用于代码执行之前对其进行处理。...JavaScriptAST语法可以使用工具库如Esprima或Babel来生成。这些库将JavaScript代码解析为AST语法,并提供了简单易用API来让开发者进行代码分析和操作。...通过对AST语法进行操作,我们可以改变代码结构和语义,使其变得更加难以理解和修改。...//babel实现将代码所有值为false节点替换为!

3.8K60

平庸前端码农之蜕变 — AST

有很多js模块我们不会在生产环境用到,但是它们我们开发过程充当着重要角色。所有的上述工具,不管怎样,都建立AST这个巨人肩膀上。 ?...每个条目和节点一一对应。 那怎么从纯文本得到AST呢?哇哦,我们知道当下编译器都做了这件事情。那我们就看看一般编译器怎么做就可以了。 ?...所以,这项目上一个相比更加深入,与the-super-tiny-compiler项目将Lisp转为C语言不同,这个项目你可以写一个你自己语言,并且将它编译C语言或者机器语言,最后运行它。...我们可以给babel 一些javascript代码,它修改代码然后生成代码返回。那它是怎样修改代码呢?没错!它创建了AST,遍历修改tokens,最后从AST中生成代码。...每个形状节点包含可视化类型、位置、连接等信息。最后一步,我们遍历所有的形状,生成对应SVG,合并所有的SVG到一个文件。 ?

72840

平庸前端码农之蜕变 — AST

有很多js模块我们不会在生产环境用到,但是它们我们开发过程充当着重要角色。所有的上述工具,不管怎样,都建立AST这个巨人肩膀上。...每个条目和节点一一对应。 那怎么从纯文本得到AST呢?哇哦,我们知道当下编译器都做了这件事前。那我们就看看一般编译器怎么做就可以了。...所以,这项目更加深入,与the-super-tiny-compiler项目将Lisp转为C语言不同,这个项目你可以写一个你自己语言,并且将它编译C语言或者机器语言,最后运行它。...我们可以给babel 一些javascript代码,它修改代码然后生成代码返回。那它是怎样修改代码呢?没错!它创建了AST,遍历修改tokens,最后从AST中生成代码。...每个形状节点包含可视化类型、位置、连接等信息。最后一步,我们遍历所有的形状,生成对应SVG,合并所有的SVG到一个文件。 结尾 寻找和筛选资料着实辛苦,希望同学们可以多多支持!

45120

Python Ast介绍及应用

此外,我们不仅可以修改和执行语法,还可以将Source生成语法unparse成python源码。因此ast给python源码检查、语法分析、修改代码以及代码调试等留下了足够发挥空间。 1....--> 语法 --> 抽象语法(AST) --> 控制流程图 --> 字节码 上述过程python2.5之后被应用。...python源码首先被解析成语法,随后又转换成抽象语法抽象语法我们可以看到源码文件python语法结构。...大部分时间编程可能都不需要用到抽象语法,但是特定条件和需求情况下,AST又有其特殊方便性。 下面是一个抽象语法简单实例。...下面我们利用ast来遍历源文件抽象语法检测其中字符串是否包含中文字符。

2.2K11

golang源码分析(18)添加一个新语句到Golang编译器内部

然而,Go这种情况将来可能会改变。Golang编译器最初是用C语言编写,后来自动翻译成Golang,所以编译部分代码是C时代遗留下来,另外一部分则是较。...未来可能会重构只留下一种语法,但是现在(Go 1.12),这是我们必须遵循过程。 AST代码存在于gc包,节点类型gc/syntax.go定义(不要与定义CST语法包混淆!)...现在是时候为我们节点类型编写实际CST->AST转换代码了。 转换gc/noder.go完成。...分析和重写抽象语法 类型检查之后,编译器会经历AST分析和重写几个阶段。确切顺序gc/ main.gogc.Main函数列出。在编译器命名法,这些阶段通常称为passes。...代码生成器首先应用一系列AST转换,将AST降低为更容易编译形式。这是compile函数完成,它从调用order开始。

29630

一文看懂如何将VUE组件转换为微信小程序组件

和抽象语法相对是具体语法(concrete syntaxtree),通常称作分析(parse tree)。一般源代码翻译和编译过程,语法分析器创建出分析。...回到正题 介绍一下,AST 抽象语法核心部分: 三、 抽象语法三大法宝 Babel 是 JavaScript 编译器,更确切地说是源码到源码编译器,通常也叫做“ 转换编译器(transpiler...然后创建得到小程序组件JS部分 AST 即可 traverse(ast, { enter(path) {}, ObjectProperty(path) {},...); } })复制代码 我们转换部分都尽量一个 Traverse 处理,减少 AST 遍历性能消耗 //Data 函数表达式 转换为 Object ObjectMethod(path)...总体思路是:我们用Babel解析器 把 JavaScript 源码转化为抽象语法, 再通过 Babel 遍历器遍历 AST (抽象语法),替换、移除和添加节点,得到一个 AST

3.8K10

JavaScript代码是如何被执行

根据语言执行流程,可以把语言分成编译型语言和解释型语言。 编译型语言:程序执行之前需要一个专门编译过程,把程序编译成 为机器语言文件,运行时不需要重新翻译,直接使用编译结果就行了。...程序执行效率高,依赖编译器,跨平台性差些。如CC++、go等. 解释型语言: 程序不需要编译,程序在运行时才翻译成机器语言(所以执行前需要环境安装了解释器),每执行一次都要翻译一次。...比如,嵌套括号被隐含在结构,并没有以节点形式呈现;而类似于 if-condition-then 这样条件跳转语句,可以使用带有两个分支节点来表示。...AST 高级语言是开发者可以理解语言,编译器和解释器理解不了。所以无论你使用是解释型语言还是编译型语言,在编译过程,它们都会生成一个 AST。...一旦执行过程,对象结构被动态修改了,那么优化后代码会变成无效代码,这时候优化编辑器就需要执行反优化操作,经过反优化代码下次执行时就会回退到解释器解释执行。

1.1K40

iOS编译简析

前言 一般编译器都是由三部分构成.从源码到机器码基本上都要经过这三部分. 编译器前端(FrontEnd): 词法分析,语法分析,语义分析,将源代码抽象为语法 AST,继而生成中间代码 IR。...,那么只需要实现一个后端,优化阶段是一个通用阶段,它针对是统一 LLVM IR,不论是支持编程语言,还是支持硬件设备,都不需要对优化阶段做修改。...AST 所占用内存是 GCC 五分之一左右 模块化设计:Clang 采用基于库模块化设计,易于 IDE 集成及其他用途重用 诊断信息可读性强:在编译过程,Clang 创建保留了大量详细元数据...负责导入 Clang 模块,并将导出 C 或 Objective-C API 映射到相应 Swift API 。...相关命令 clang // 假设原始文件为LLVMOC.m // 预编译命令 clang -E LLVMOC.m -o LLVMOC.mi // 生成AST语法 clang -Xclang -ast-dump

1.3K20

掌握 AST,轻松落地关键业务「技术创作101训练营」

AST 是什么 抽象语法(Abstract Syntax Tree,AST)是源代码语法结构一种抽象表示。它以树状形式表现编程语言语法结构,树上每个节点都表示源代码一种结构。...通过利用 AST 技术,不仅仅是上述功能,现在开发模式,也诞生了各种各样工具和框架和插件,很多底层多少都能看到 AST 影子,比方说之前比较流行 vue 转小程序,就是通过将 vue 语法...,解析成小程序语法,然后小程序上运行。...ast.png Babel 是一个编译器,大多数编译工作过程可以分为三部分: 「Parse(解析)」:将源代码转换成更加抽象表示方法(如抽象语法) 「Transform(转换)」:对(抽象语法...)做一些特殊处理,让它符合编译期望 「Generate(代码生成)」:将第二步经过转换过(抽象语法)生成代码 结合上述编译过程,找到对应 Babel 插件: @babel/core:用来解析

992169159

前端工程师编译原理指南-「编译器工作流程」

之后会进入转化阶段,所谓转化阶段本质上就是对于抽象语法一个深度遍历过程。 转化阶段,我们会遍历这颗抽象语法从而对于匹配节点进行增删改查从而修改树形结构。...比如我想为 p 节点上添加一个 id 为 text 属性,那么此时遍历 AST 过程遍历到对应节点时修改对应节点属性即可,当然你也可以直接粗暴替换整个节点。...‘ 此时编译器拥有了经过处理后抽象语法,此时需要做的当然是将所谓树形结构抽象语法转化成为代码。...在生成阶段本质上就是遍历抽象语法,根据抽象语法树上每个节点类型和属性递归调用从而生成对应字符串代码。 代码生成阶段,我们可以借助 EscodeGen 将 AST 转化成为字符串代码。...比如上方我们将代码修改抽象语法会生成代码: helloJue Jin 编译器最后一步生成阶段,将最新抽象语法转化为对应代码结构

44720

听GPT 讲Rust源代码--compiler(30)

这些临时变量可能包含无法在编译时确定值或对不可修改状态进行修改操作。 Promoter结构体是一个提升器,负责转换过程中将临时变量提升为常量。...该函数,通过调用map_mod_id来处理每个模块,并将扩展后结果存储一个结构体。这个函数作用是将扩展后代码应用到整个项目中,完成语法扩展过程。...它定义了用于将源代码解析为抽象语法函数和结构体。 该文件主要作用是分析源代码,生成对应抽象语法,以便后续编译器阶段可以对其进行进一步分析和处理。...into_inner:获取P返回。 map:对Option进行操作,如果Option是Some,则应用函数F返回其返回值作为Option。...Rust编译,源代码首先被解析成抽象语法,然后进行类型检查、代码优化和生成目标代码等阶段处理。

5610

70.精读《手写 SQL 编译器 - 语法

基于 《回溯》 一文介绍思路,我们利用 JS 实现一个微型 SQL 解析器,介绍如何生成语法,如何在 JS SQL 引擎实现语法生成功能!...2 精读 通过上面的分析,我们需要对 chain 函数提供修改局部 AST 结构能力: const selectStatement = () => chain("select", selectList...对于修改局部 AST 结构函数,需等待整个 ChainNode 执行完毕才调用,并将返回 AST 信息存储下来,作为这个节点最终 AST 信息传递给父级(或者没有父级,这就是根结点 AST 结果...所以通过完整重写语法解析器内核,解析同时,生成语法同时,也给出光标位置下一个可能输入提示,通用错误场景自动从错误恢复。...4 更多讨论 讨论地址是:精读《手写 SQL 编译器 - 语法》 · Issue #99 · dt-fe/weekly

90210

SparkSql优化器-Catalyst

Catalyst将测试给定规则适用哪些部分,自动跳过不匹配子树。这种能力意味着规则只需要对给定优化适用进行推理,而不是那些不匹配。结果就是,操作类型加入到系统时规则无需修改。...这使得Catalyst比优化器域特定语言更强大,同时保持简洁简单规则。 经验,对不变功能转换使得整个优化器非常容易推理和调试。它们还可以优化器实现并行化,尽管目前还没有开发它。...我们使用Catalyst将表示SQL表达式转换为Scala代码AST,以评估该表达式,然后编译运行生成代码。...quasiquote,这意味着尽管它们看起来像字符串,但它们在编译时由Scala编译器解析,代表了代码AST。...Quasiquotes也适用于我们原生Java对象上运行目标:当访问这些对象字段时,我们可以对所需字段进行代码生成直接访问,而不必将对象复制到Spark SQL Row使用Row 存取方法。

2.6K90

玩转Babel

语法分析就是token列表基础上赋予实际语法含义,最终得到一颗语法AST)。...无论代码如何变化,一颗AST可以完美的描述我们代码。遍历修改ASTAST 实际上是一个非常复杂对象。...Babel 遍历 AST 每一个节点过程还会根据需要执行对应转换器,例如:@babel/plugin-transform-runtime、@babel/plugin-transform-typescript...而转换器则会去对 AST 进行增删改等操作。生成最终产物上一步我们根据需要将 AST 进行了修改,最终我们还是需要 Javascript 代码,所以最后还需要把 AST 转换成最终代码。... Typescript 是可以使用装饰器写法,但是 Javascript 目前这一语法还处于提案阶段(tc39/proposal-decorators@d6c056fa06)。

68141
领券