CN110826032A - 一种基于AST的Javascript混淆方法 - Google Patents

一种基于AST的Javascript混淆方法 Download PDF

Info

Publication number
CN110826032A
CN110826032A CN201911069021.8A CN201911069021A CN110826032A CN 110826032 A CN110826032 A CN 110826032A CN 201911069021 A CN201911069021 A CN 201911069021A CN 110826032 A CN110826032 A CN 110826032A
Authority
CN
China
Prior art keywords
node
code
javascript file
javascript
file
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
CN201911069021.8A
Other languages
English (en)
Inventor
周誉淼
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Chaozhou Zhuoshu Big Data Industry Development Co Ltd
Original Assignee
Chaozhou Zhuoshu Big Data Industry Development Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Chaozhou Zhuoshu Big Data Industry Development Co Ltd filed Critical Chaozhou Zhuoshu Big Data Industry Development Co Ltd
Priority to CN201911069021.8A priority Critical patent/CN110826032A/zh
Publication of CN110826032A publication Critical patent/CN110826032A/zh
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开一种基于AST的Javascript混淆方法,涉及数据保护技术领域;根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句分为不同的节点类型,将Javascript文件的代码进行压缩,并根据不同的节点类型将Javascript文件的代码重新组合,其中利用插入无用代码的方式随机生成一段代码插入到Javascript文件的原代码的任意位置中,进行代码重新组合;和/或利用.操作符替换的方式将Javascript文件的代码重新组合,和/或利用函数参数去除的方式将Javascript文件的代码重新组合,实现Javascript混淆。

Description

一种基于AST的Javascript混淆方法
技术领域
本发明公开一种基于AST的Javascript混淆方法,涉及数据保护技术领域。
背景技术
当前互联网技术发展迅速,PC端、移动端互联网应用技术呈指数增长,与此同时带来了关键技术代码泄漏问题。对于大多数WEB项目,可分为独立的前端、后端两部分,后端代码通常由编译器编译为字节码文件后运行,如Java的.class文件,使用者无法直接看到源代码实现,从而保护了代码的安全。然而对于前端代码,Javascript是由浏览器直接解释执行,可以轻易的通过F12或Ctrl+U查看源代码,即使是移动端应用,也可以通过解压apk安装包的方式获取源代码,因此,Javascript代码非常容易泄露,已被窃取和篡改。
抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
本发明提供一种基于AST的Javascript混淆方法,利用AST抽象语法树原理,对Javascript代码进行分析、拆解,将代码按照既定方式重新组合,以此实现代码压缩和代码转义功能,降低其可读性,保护互联网应用前端页面不被窃取、篡改。
发明内容
本发明针对现有技术的问题,提供一种基于AST的Javascript混淆方法,实现了Javascript代码混淆功能,通过对代码的压缩和转义,生成难以被人阅读的同时,从而达到保护代码的目的。
本发明提出的具体方案是:
一种基于AST的Javascript混淆方法,根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句分为不同的节点类型,将Javascript文件的代码进行压缩,并根据不同的节点类型将Javascript文件的代码重新组合,
其中利用插入无用代码的方式随机生成一段代码插入到Javascript文件的原代码的任意位置中,进行代码重新组合;
和/或利用.操作符替换的方式将Javascript文件的代码重新组合,
和/或利用函数参数去除的方式将Javascript文件的代码重新组合,
实现Javascript混淆。
所述的方法中Javascript文件的语句包括以下形式:EmptyStatement、ExpressionStatement、VariableDeclaration、FunctionDeclaration、WhileStatement、DoWhileStatement、IfStatement、SwitchStatement、BlockStatement、ReturnStatement、BreakStatement、ContinueStatement、ForStatement、ForInStatement及ForOfStatement。
所述的方法中函数参数去除的方式是:将函数声明中需要传参的函数的参数删除,而在函数体中声明同名变量,并初始化为传参实际值。
所述的方法中通过去除不必要的空格和换行回车,将Javascript文件的代码进行压缩。
所述的方法中Javascript文件分解成若干节点,判断当前节点是否为已知节点,若不是已知节点,则按照Javascript文件的源文件的内容输出;若是已知节点,则判断所述的已知节点是子节点还是父节点,根据已知节点的类型进行代码重新组合的处理。
一种基于AST的Javascript混淆工具,包括分解模块、压缩模块及处理模块,
分解模块根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句分为不同的节点类型,压缩模块将Javascript文件的代码进行压缩,处理模块根据不同的节点类型将Javascript文件的代码重新组合,
其中利用插入无用代码的方式随机生成一段代码插入到Javascript文件的原代码的任意位置中,进行代码重新组合;
和/或利用.操作符替换的方式将Javascript文件的代码重新组合,
和/或利用函数参数去除的方式将Javascript文件的代码重新组合,
实现Javascript混淆。
所述的工具中处理模块中函数参数去除的方式是:将函数声明中需要传参的函数的参数删除,而在函数体中声明同名变量,并初始化为传参实际值。
所述的工具中压缩模块通过去除不必要的空格和换行回车,将Javascript文件的代码进行压缩。
所述的工具中分解模块将Javascript文件分解成若干节点,判断当前节点是否为已知节点,若不是已知节点,则按照Javascript文件的源文件的内容输出;若是已知节点,则判断所述的已知节点是子节点还是父节点,根据已知节点的类型进行代码重新组合的处理。
本发明的有益之处是:
本发明提供一种基于AST的Javascript混淆方法,根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句有不同的节点类型,根据节点类型的不同分别进行压缩、简化、转义等操作,产生对应的输出文件,在大幅度降低源文件代码的可读性的同时,保证代码运行效率和运行正确性,从而实现Javascript混淆,可以保证关键代码不被窃取、篡改,具有很高的应用价值。
附图说明
图1是本发明方法流程示意图;
图2是本发明操作流程示意图。
具体实施方式
本发明提供一种基于AST的Javascript混淆方法,根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句分为不同的节点类型,将Javascript文件的代码进行压缩,并根据不同的节点类型将Javascript文件的代码重新组合,
其中利用插入无用代码的方式随机生成一段代码插入到Javascript文件的原代码的任意位置中,进行代码重新组合;
和/或利用.操作符替换的方式将Javascript文件的代码重新组合,
和/或利用函数参数去除的方式将Javascript文件的代码重新组合,
实现Javascript混淆。
同时提供与上述方法相应的一种基于AST的Javascript混淆工具,包括分解模块、压缩模块及处理模块,
分解模块根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句分为不同的节点类型,压缩模块将Javascript文件的代码进行压缩,处理模块根据不同的节点类型将Javascript文件的代码重新组合,
其中利用插入无用代码的方式随机生成一段代码插入到Javascript文件的原代码的任意位置中,进行代码重新组合;
和/或利用.操作符替换的方式将Javascript文件的代码重新组合,和/或利用函数参数去除的方式将Javascript文件的代码重新组合,实现Javascript混淆。
下面结合附图和具体实施例对本发明作进一步说明,以使本领域的技术人员可以更好地理解本发明并能予以实施,但所举实施例不作为对本发明的限定。
利用本发明方法进行基于AST的Javascript混淆时,具体过程为:
利用Esprima获取Javascript文件的抽象语法树,根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句包括以下形式:EmptyStatement、ExpressionStatement、VariableDeclaration、FunctionDeclaration、WhileStatement、DoWhileStatement、IfStatement、SwitchStatement、BlockStatement、ReturnStatement、BreakStatement、ContinueStatement、ForStatement、ForInStatement及ForOfStatement,
不同形式的语句分为不同的节点类型,通过去除不必要的空格和换行回车,将Javascript文件的代码进行压缩,同时对于忘记以分号结尾的语句,可以在这个过程添加,代码压缩实际上还包括了简单的排错功能,相比原本换行和缩进的排版方式,压缩后的代码在视觉上降低了代码的可读性,
根据不同的节点类型将Javascript文件的代码重新组合,
其中利用插入无用代码的方式随机生成一段代码插入到Javascript文件的原代码的任意位置中,进行代码重新组合,造成阅读障碍,比如可以生成一段if条件语句,条件语句的判定条件为随机生成的十六进制整数、一元操作符与“!”相结合的语句,条件语句代码块部分为随机生成的变量声明,这些变量的作用域只在该条件语句内,不会对外部代码造成影响,同时条件语句不会占用过多内存资源,不影响原代码运行效率,
和/或利用“.”操作符替换的方式将Javascript文件的代码重新组合,调用对象属性或方法的方式有两种,a.b[0]和a[‘b’][0],相比较下,后者更不利于阅读,在抽象语法树中识别MemberExpression类型的节点,判断其computed属性是否为false,以此找到a.b[0]表达式,再根据其节点信息转变为a[‘b’][0]形式;
和/或利用函数参数去除的方式将Javascript文件的代码重新组合,将函数声明中需要传参的函数的参数删除,转为在函数体中声明同名变量,并初始化为传参实际值,可以依赖Javascript函数arguments属性,通过下角标从arguments中依次获取函数调用时传入的参数,函数声明时的参数列表通过节点的params属性获取,将其拷贝至临时变量中,在后续构建函数体时作为变量名声明,这种方式未改变函数语义,而是使其复杂化,不利于阅读,也无法通过代码重排简化,具有一定的欺骗性,
实现Javascript混淆。
在实际操作中,首先将待处理文件作为输入,Esprima会将输入文件的每个语句解析成各类AST节点,
接下来判断当前节点是否是系统中已知节点,节点是否已知可以通过上述混淆过程确定,若不是已知节点,则按照源文件的内容输出;若是已知节点,再次判断其是否为子节点,例如:if(a>0){b=1;},if条件语句是父节点,判定条件a>0和大括号中的语句b=1是子节点,区分父子节点的意义是,输出目标文件时所有节点都会被处理,子结点的内容会被重复输出在文件起始部分,导致输出文件与源文件出现非常大的差异,也可能导致文件出错,因此子节点等待系统接下来的递归处理,非子节点被添加进节点序列等待进一步处理,根据判断节点序列中的节点是否被处理过,循环处理节点序列中的节点,每个节点都经过节点分析用来判断节点类型、选定处理方案,经过节点处理用来进行js混淆操作,当节点序列中的所有节点都被处理后,将输出内容打印到文件中,最后输出目标文件。
混淆效果样例如下:
Figure BDA0002260350790000071
输出代码:
if(0x33<<0x28+0x58*0x111){var ZaleCTQUUQ=0x145*0x107-0x199%0x282;var gj=0x173%0x253|0x286*0x293;var ONOsy=0x66*0x298-0x154+0x69;}var func=function(){let a=arguments[0];let b=arguments[1];(console)['log'](a);(console)['log'](b);};if(0x55*0x183|0x190&0x159){var SohXmxtVVS=0x174-0x260<<0x163+0x298>>0x35;var issi=0x22*0x267|0x39>>0x117&0x227;var eoZzzBQZNX=0x158|0x230*0x219|0x99<<0x280;var fBlFfXciAS=0x270>>0x233*0x238+0x300>>0x250;}
如上述代码所示,输出代码在输入代码前后添加了两条无效的、不会占用过多内存空间的if条件语句,并且删除了函数的参数,转为在函数体中用let a=arguments[0];let b=arguments[1]的同名变量定义。原本console.log()函数调用,被转义为console[‘log’]()。处理后的文件在很大程度上降低了可读性,并保持了源文件的语义不改变。
利用本发明工具进行进行基于AST的Javascript混淆时,具体过程为:
分解模块利用Esprima获取Javascript文件的抽象语法树,根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句包括以下形式:EmptyStatement、ExpressionStatement、VariableDeclaration、FunctionDeclaration、WhileStatement、DoWhileStatement、IfStatement、SwitchStatement、BlockStatement、ReturnStatement、BreakStatement、ContinueStatement、ForStatement、ForInStatement及ForOfStatement,
不同形式的语句分为不同的节点类型,压缩模块通过去除不必要的空格和换行回车,将Javascript文件的代码进行压缩,同时对于忘记以分号结尾的语句,可以在这个过程添加,代码压缩实际上还包括了简单的排错功能,相比原本换行和缩进的排版方式,压缩后的代码在视觉上降低了代码的可读性,
处理模块根据不同的节点类型将Javascript文件的代码重新组合,
其中利用插入无用代码的方式随机生成一段代码插入到Javascript文件的原代码的任意位置中,进行代码重新组合,造成阅读障碍,比如可以生成一段if条件语句,条件语句的判定条件为随机生成的十六进制整数、一元操作符与“!”相结合的语句,条件语句代码块部分为随机生成的变量声明,这些变量的作用域只在该条件语句内,不会对外部代码造成影响,同时条件语句不会占用过多内存资源,不影响原代码运行效率,
和/或利用“.”操作符替换的方式将Javascript文件的代码重新组合,调用对象属性或方法的方式有两种,a.b[0]和a[‘b’][0],相比较下,后者更不利于阅读,在抽象语法树中识别MemberExpression类型的节点,判断其computed属性是否为false,以此找到a.b[0]表达式,再根据其节点信息转变为a[‘b’][0]形式;
和/或利用函数参数去除的方式将Javascript文件的代码重新组合,将函数声明中需要传参的函数的参数删除,转为在函数体中声明同名变量,并初始化为传参实际值,可以依赖Javascript函数arguments属性,通过下角标从arguments中依次获取函数调用时传入的参数,函数声明时的参数列表通过节点的params属性获取,将其拷贝至临时变量中,在后续构建函数体时作为变量名声明,这种方式未改变函数语义,而是使其复杂化,不利于阅读,也无法通过代码重排简化,具有一定的欺骗性,
实现Javascript混淆。
在实际操作中,首先分解模块将待处理文件作为输入,Esprima会将输入文件的每个语句解析成各类AST节点,
接下来判断当前节点是否是系统中已知节点,节点是否已知可以通过上述混淆过程确定,若不是已知节点,则按照源文件的内容输出;若是已知节点,再次判断其是否为子节点,例如:if(a>0){b=1;},if条件语句是父节点,判定条件a>0和大括号中的语句b=1是子节点,区分父子节点的意义是,输出目标文件时所有节点都会被处理,子结点的内容会被重复输出在文件起始部分,导致输出文件与源文件出现非常大的差异,也可能导致文件出错,因此子节点等待系统接下来的递归处理,非子节点被添加进节点序列等待进一步处理,根据判断节点序列中的节点是否被处理过,循环处理节点序列中的节点,每个节点都经过节点分析用来判断节点类型、选定处理方案,经过节点处理用来进行js混淆操作,当节点序列中的所有节点都被处理后,将输出内容打印到文件中,最后输出目标文件。
混淆效果样例如下:
输出代码:
if(0x33<<0x28+0x58*0x111){var ZaleCTQUUQ=0x145*0x107-0x199%0x282;var gj=0x173%0x253|0x286*0x293;var ONOsy=0x66*0x298-0x154+0x69;}var func=function(){let a=arguments[0];let b=arguments[1];(console)['log'](a);(console)['log'](b);};if(0x55*0x183|0x190&0x159){var SohXmxtVVS=0x174-0x260<<0x163+0x298>>0x35;var issi=0x22*0x267|0x39>>0x117&0x227;var eoZzzBQZNX=0x158|0x230*0x219|0x99<<0x280;var fBlFfXciAS=0x270>>0x233*0x238+0x300>>0x250;}
输出代码在输入代码前后处理模块添加了两条无效的、不会占用过多内存空间的if条件语句,并且删除了函数的参数,转为在函数体中用let a=arguments[0];let b=arguments[1]的同名变量定义。原本console.log()函数调用,被转义为console[‘log’]()。处理后的文件在很大程度上降低了可读性,并保持了源文件的语义不改变。
以上所述实施例仅是为充分说明本发明而所举的较佳的实施例,本发明的保护范围不限于此。本技术领域的技术人员在本发明基础上所作的等同替代或变换,均在本发明的保护范围之内。本发明的保护范围以权利要求书为准。

Claims (9)

1.一种基于AST的Javascript混淆方法,其特征是根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句分为不同的节点类型,将Javascript文件的代码进行压缩,并根据不同的节点类型将Javascript文件的代码重新组合,
其中利用插入无用代码的方式随机生成一段代码插入到Javascript文件的原代码的任意位置中,进行代码重新组合;
和/或利用.操作符替换的方式将Javascript文件的代码重新组合,
和/或利用函数参数去除的方式将Javascript文件的代码重新组合,
实现Javascript混淆。
2.根据权利要求1所述的方法,其特征是Javascript文件的语句包括以下形式:EmptyStatement、ExpressionStatement、VariableDeclaration、FunctionDeclaration、WhileStatement、DoWhileStatement、IfStatement、SwitchStatement、BlockStatement、ReturnStatement、BreakStatement、ContinueStatement、ForStatement、ForInStatement及ForOfStatement。
3.根据权利要求1或2所述的方法,其特征是函数参数去除的方式是:将函数声明中需要传参的函数的参数删除,而在函数体中声明同名变量,并初始化为传参实际值。
4.根据权利要求3所述的方法,其特征是通过去除不必要的空格和换行回车,将Javascript文件的代码进行压缩。
5.根据权利要求1或4所述的方法,其特征是Javascript文件分解成若干节点,判断当前节点是否为已知节点,若不是已知节点,则按照Javascript文件的源文件的内容输出;若是已知节点,则判断所述的已知节点是子节点还是父节点,根据已知节点的类型进行代码重新组合的处理。
6.一种基于AST的Javascript混淆工具,其特征是包括分解模块、压缩模块及处理模块,
分解模块根据抽象语法树将Javascript文件分解成若干节点,不同形式的语句分为不同的节点类型,压缩模块将Javascript文件的代码进行压缩,处理模块根据不同的节点类型将Javascript文件的代码重新组合,
其中利用插入无用代码的方式随机生成一段代码插入到Javascript文件的原代码的任意位置中,进行代码重新组合;
和/或利用.操作符替换的方式将Javascript文件的代码重新组合,
和/或利用函数参数去除的方式将Javascript文件的代码重新组合,
实现Javascript混淆。
7.根据权利要求6所述的工具,其特征是处理模块中函数参数去除的方式是:将函数声明中需要传参的函数的参数删除,而在函数体中声明同名变量,并初始化为传参实际值。
8.根据权利要求6或7所述的工具,其特征是压缩模块通过去除不必要的空格和换行回车,将Javascript文件的代码进行压缩。
9.根据权利要求8所述的工具,其特征是分解模块将Javascript文件分解成若干节点,判断当前节点是否为已知节点,若不是已知节点,则按照Javascript文件的源文件的内容输出;若是已知节点,则判断所述的已知节点是子节点还是父节点,根据已知节点的类型进行代码重新组合的处理。
CN201911069021.8A 2019-11-05 2019-11-05 一种基于AST的Javascript混淆方法 Withdrawn CN110826032A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911069021.8A CN110826032A (zh) 2019-11-05 2019-11-05 一种基于AST的Javascript混淆方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911069021.8A CN110826032A (zh) 2019-11-05 2019-11-05 一种基于AST的Javascript混淆方法

Publications (1)

Publication Number Publication Date
CN110826032A true CN110826032A (zh) 2020-02-21

Family

ID=69552466

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911069021.8A Withdrawn CN110826032A (zh) 2019-11-05 2019-11-05 一种基于AST的Javascript混淆方法

Country Status (1)

Country Link
CN (1) CN110826032A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113158147A (zh) * 2021-03-24 2021-07-23 中国人民解放军战略支援部队信息工程大学 一种基于母体融合的代码混淆方法
CN113590624A (zh) * 2021-07-29 2021-11-02 北京天融信网络安全技术有限公司 一种数据处理方法及电子装置
CN113946804A (zh) * 2021-12-21 2022-01-18 深圳市活力天汇科技股份有限公司 一种源代码的混淆方法和装置

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113158147A (zh) * 2021-03-24 2021-07-23 中国人民解放军战略支援部队信息工程大学 一种基于母体融合的代码混淆方法
CN113158147B (zh) * 2021-03-24 2022-12-09 中国人民解放军战略支援部队信息工程大学 一种基于母体融合的代码混淆方法
CN113590624A (zh) * 2021-07-29 2021-11-02 北京天融信网络安全技术有限公司 一种数据处理方法及电子装置
CN113946804A (zh) * 2021-12-21 2022-01-18 深圳市活力天汇科技股份有限公司 一种源代码的混淆方法和装置
CN113946804B (zh) * 2021-12-21 2022-05-20 深圳市活力天汇科技股份有限公司 一种源代码的混淆方法和装置

Similar Documents

Publication Publication Date Title
Jansson et al. PolyP—a polytypic programming language extension
US6516461B1 (en) Source code translating method, recording medium containing source code translator program, and source code translator device
Ford Parsing expression grammars: a recognition-based syntactic foundation
CN110826032A (zh) 一种基于AST的Javascript混淆方法
KR100614677B1 (ko) 구조화된 문서를 압축/복원하기 위한 방법
US20170124166A1 (en) Dynamic Field Data Translation to Support High Performance Stream Data Processing
US8156471B2 (en) Multi-language execution method
US20040172234A1 (en) Hardware accelerator personality compiler
Fedorchenko et al. Equivalent transformations and regularization in context-free grammars
Reis et al. An on-the-fly grammar modification mechanism for composing and defining extensible languages
CN113703779A (zh) 一种跨平台的多语言编译方法和超轻量物联网虚拟机
US20100023924A1 (en) Non-constant data encoding for table-driven systems
JP2879099B1 (ja) 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置
Kameyama et al. Typed dynamic control operators for delimited continuations
Cordy et al. The TXL programming language syntax and informal semantics version 7
Xi Applied type system: An approach to practical programming with theorem-proving
Antoy et al. Specification-based code generation
Ramsey Unparsing expressions with prefix and postfix operators
Nightingale Savile Row Manual
Kurš et al. Efficient parsing with parser combinators
Kramer et al. Reflection in attribute grammars
Slesarenko et al. First-class isomorphic specialization by staged evaluation
CN112270176A (zh) 深度学习框架中模式转换的方法、装置和计算机存储介质
Milton et al. LL (k) parsing for attributed grammars
Bangare et al. Code parser for object Oriented software Modularization

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
WW01 Invention patent application withdrawn after publication

Application publication date: 20200221

WW01 Invention patent application withdrawn after publication