CN114115900B - 一种脚本编译方法、装置及电子设备 - Google Patents
一种脚本编译方法、装置及电子设备 Download PDFInfo
- Publication number
- CN114115900B CN114115900B CN202111412731.3A CN202111412731A CN114115900B CN 114115900 B CN114115900 B CN 114115900B CN 202111412731 A CN202111412731 A CN 202111412731A CN 114115900 B CN114115900 B CN 114115900B
- Authority
- CN
- China
- Prior art keywords
- structural
- data stack
- structural bodies
- storing
- code
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种脚本编译方法,该方法包括:通过获取待编译脚本的代码;将代码按照预设的结构单位进行划分得到多个结构体;对多个结构体进行解析并存入数据栈;通过所述数据栈中的结构体生成中间码,同时将结构体保存至链表并为链表中的结构体建立索引。本发明通过按序读取代码编译成中间码后执行,相比于源码解释执行具有更高的效率,同时简单便捷的编译逻辑,可轻松实现跨平台操作。
Description
技术领域
本发明涉及计算机技术领域,具体涉及一种脚本编译方法、装置及电子设备。
背景技术
随着社会的进步,信息化程度不断提高,计算机软件广泛应用于生活工作各方面。随着软件的普及,对不同类型软件的需求量逐年上升,软件的开发过程也在不停地更新发展;在现有技术中,脚本的编译过程存在编译复杂、数据体量大且无法移植和跨平台的问题。
发明内容
有鉴于此,本发明实施例提供了一种脚本编译方法,以解决编译复杂且无法跨平台的问题。
为达到上述目的,本发明提供如下技术方案:
本发明实施例提供了一种脚本编译方法,包括:
获取待编译脚本的代码;
将所述代码按照预设的结构单位进行划分得到多个结构体;
对所述多个结构体进行解析并存入数据栈;
通过所述数据栈中的结构体生成中间码,同时将所述结构体保存至链表并为所述链表中的结构体建立索引。
可选的,所述对所述多个结构体进行解析并存入数据栈,包括:
确定初始结构体,并将所述初始结构体置于数据栈底部;
从剩余待编译代码中提取新的结构体,并对当前结构体进行解析;
根据解析结果调整当前结构体在数据栈中的位置,并返回所述从剩余待编译代码中提取新的结构体进行解析的步骤。
可选的,所述对当前结构体进行解析,包括:
对当前结构体中的待编译代码进行逐字节的解析,得到基础关键字;
将所述基础关键字写入结构体并存入数据栈。
可选的,所述根据解析结果调整当前结构体在数据栈中的位置,包括:
将当前结构体存入所述数据栈顶部;
获取所述数据栈中与当前结构体下邻的第一结构体和当前结构体的解析信息;
将所述当前结构体与所述第一结构体解析信息的优先级进行对比;
若当前结构体的优先级比第一结构体低,则将所述当前结构体存入所述第一结构体下方,并返回获取所述数据栈中与当前结构体下邻的第一结构体和当前结构体的解析信息的步骤,直至当前结构体到达所述数据栈的栈底。
可选的,所述将所述代码按照预设的结构单位进行划分得到多个结构体,包括:
将所述代码进行基础代码、基础函数和基础语句进行划分,得到多个数据块;
将所述数据块以初始符号结构体为单位,划分为多个结构体。
可选的,所述通过所述数据栈中的结构体生成中间码,同时将所述结构体保存至链表并为所述链表中的结构体建立索引,包括:
对数据栈中的结构体进行语法合规化检查;
将语法合规的结构体按优先级的顺序保存至链表;
从所述链表中提取当前结构体的属性指数,并根据所述属性指数建立所述当前结构体在数据栈中左右键值的索引生成中间码。
可选的,在所述将所述代码按照预设的结构单位进行划分得到多个结构体之前,还包括:
依次提取所述待编译脚本的代码中的关键字;
对所述关键字进行合规检查。
本发明实施例还提供了一种脚本编译装置,包括:
获取模块:用于获取待编译脚本的代码;
划分模块:用于将所述代码按照预设的结构单位进行划分得到多个结构体;
解析模块:用于对所述多个结构体进行解析并存入数据栈;
生成模块:用于通过所述数据栈中的结构体生成中间码,同时将所述结构体保存至链表并为所述链表中的结构体建立索引。
本发明实施例还提供了一种电子设备,包括:
存储器和处理器,所述存储器和所述处理器之间互相通信连接,所述存储器中存储有计算机指令,所述处理器通过执行所述计算机指令,从而执行本发明实施例提供的脚本编译方法。
本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行本发明实施例提供的脚本编译方法。
本发明技术方案,具有如下优点:
本发明一种脚本编译方法,通过获取待编译脚本的代码;将代码按照预设的结构单位进行划分得到多个结构体;对多个结构体进行解析并存入数据栈;将数据栈中的结构体按顺序保存至链表,并为链表中的结构体建立索引生成中间码。本发明通过按序读取代码编译成中间码后执行,相比于源码解释执行具有更高的效率,同时简单便捷的编译逻辑,可轻松实现跨平台操作。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例中的脚本编译方法的流程图;
图2为根据本发明实施例中对字符进行合规检查的流程图;
图3为根据本发明实施例中将代码按照预设的结构单位进行划分得到多个结构体的流程图;
图4为根据本发明实施例中对多个结构体进行解析并存入数据栈的流程图;
图5为根据本发明实施例中对结构体进行解析的流程图;
图6为根据本发明实施例中调整结构体在数据栈中位置的流程图;
图7为根据本发明实施例中生成中间码的流程图;
图8为本发明实施例中的脚本编译装置的结构示意图;
图9为本发明实施例中的电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
根据本发明实施例,提供了一种脚本编译方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机***中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
在本实施例中提供了一种脚本编译方法,可用于上述的终端设备,如电脑等,如图1所示,该脚本编译方法包括如下步骤:
步骤S1:获取待编译脚本的代码。
步骤S2:将代码按照预设的结构单位进行划分得到多个结构体。
步骤S3:对多个结构体进行解析并存入数据栈。
步骤S4:通过数据栈中的结构体生成中间码,同时将结构体保存至链表并为链表中的结构体建立索引。
通过上述步骤S1至步骤S4,本发明实施例提供的脚本编译方法,可以将指定语法下的代码编译成中间码数据,并且提供了快速解析和使用中间码的方式,相比于源码解释执行具有更高的效率,同时简单便捷的编译逻辑,可轻松实现跨平台操作
具体地,在一实施例中,在进行上述的步骤S2之前,如图2所示,还包括如下步骤:
步骤S021:依次提取待编译脚本的代码中的关键字。
步骤S022:对关键字进行合规检查。
具体的,上述步骤S021至步骤S022是对代码的预处理过程,通过依次检查每一个关键字,确保代码符合编码规则,比如不能出现中文字符和不合规的字符,字符串除外,此过程是为了保障编译过程的顺利进行,提高编译效率。
具体地,在一实施例中,上述的步骤S2,如图3所示,具体包括如下步骤:
步骤S21:将代码进行基础代码、基础函数和基础语句进行划分,得到多个数据块。具体的,通过将代码进行基础划分,可有有效保障数据的完整性,避免产生遗漏;同时通过划分基础的数据块进行编译,缩小了数据处理的体量,提高编译的速度。
步骤S22:将数据块以初始符号结构体为单位,划分为多个结构体。
具体的,以初始符号结构体SYMBOLDEF为单位,对代码进行解析。
SYMBOLDEF的成员布局为:
具体地,在一实施例中,上述的步骤S3,如图4所示,具体包括如下步骤:
步骤S31:确定初始结构体,并将初始结构体置于数据栈底部。具体的,先定义一个初始结构体,将其中WordKind属性置为SYM_TRIP。将此初始结构体存入数据栈至底部,用于标志编译的开始与结束。
步骤S32:从剩余待编译代码中提取新的结构体,并对当前待编译代码进行解析。
步骤S33:根据解析结果调整当前结构体在数据栈中的位置,并返回步骤S31。
具体地,在一实施例中,上述的步骤S32中对当前结构体进行解析,如图5所示,具体包括如下步骤:
步骤S321:对当前结构体中的待编译代码进行逐字节的解析,得到基础关键字。
步骤S322:将基础关键字写入结构体并存入数据栈。
具体的,首先要做的是解析基础关键字包括:数据类型,变量名,函数名,函数形参,特定变量名等;逐字节进行解析,遇到特定的符号则停止;如果遇到双引号则需要标记为常量字符串,通过这种方式,就可以较为简单的解析出基础关键字。
解析出基础关键字后,会存入数据栈,之后继续解析,所有的基础关键字都会存入数据栈;如果遇到括号则需要标记为函数;函数与操作符都会存入数据栈。存入数据栈的结构体,每一个都代表一个操作如:运算,赋值,函数,位操作,与或非等,因此他们都存在左值与右值,而相应的左值与右值会均存入数据栈中。
具体地,在一实施例中,上述的步骤S33,如图6所示,具体包括如下步骤:
步骤S331:将当前结构体存入数据栈顶部。
步骤S332:获取数据栈中与当前结构体下邻的第一结构体和当前结构体的解析信息。
步骤S333:将当前结构体与第一结构体解析信息的优先级进行对比。
步骤S334:若当前结构体的优先级比第一结构体低,则将当前结构体存入第一结构体下方,并返回步骤S332,直至当前结构体到达数据栈的栈底。具体的,通过将当前结构体与数据栈内其他结构体的优先级进行层级对比,从而确定当前结构体在数据栈内的位置,定位准确,提高了编译的准确度。
具体的,如果当前结构体的优先级高于第一结构体:如SYM_PLUS(加法)高于SYM_ASSIGN(赋值),则继续向下解析,等待下一个结构体存入数据栈;如果当前结构体比第一结构体低或者到达了数据块的结尾,就会继续与数据栈中更下层的结构体进行优先级的比对,结构体以此方式在数据栈中按照优先级排列。
具体地,在一实施例中,上述的步骤S4,如图7所示,具体包括如下步骤:
步骤S41:对数据栈中的结构体进行语法合规化检查。具体的,对结构体进行语法检查,比如,如果是赋值或者比较操作,就会从数据栈中取出左右值,检查左右值的数据类型是否一致;如果是函数就会从数据栈中取出实参,检查形参与实参是否合规;如果是基础语句,就会检查栈之前的结构体是否合规。通过对语法进行检查,可以有效的排除错误部分的结构体,提高脚本编译的效率。
步骤S42:将语法合规的结构体按优先级的顺序保存至链表。
步骤S43:从链表中提取当前结构体的属性指数,并根据属性指数建立当前结构体在数据栈中左右键值的索引生成中间码。具体的,在此过程中,既保证了结构体的顺序,有保证了中间码的准确度;整个编译过程简单,数据体量小,从而可以轻松的进行移植及跨平台操作,为后续代码的运行带来便利。
具体的,如果合规,就会把合规的结构体保存到指定链表中,并且将结构体的属性index设置为数据栈中左右键值的索引,以此生成中间码;而链表中的中间码的顺序,也就是整个代码所有操作的执行顺序。在运行中,只需要按照链表中按顺序取出中间码,再依据中间码中的索引取出相应数据进行操作,依次执行每一个中间码,就是整个代码的运行流程。
下面结合具体实例进行说明:
此处列举了一种脚本***,其中应用到上述实施例中描述的脚本编译方法:
1、脚本***是一套功能完善的集成开发***,功能模块具体如下:
a.语言***-脚本***所支持的语言的语法(注释、变量、函数、事件、运算符、条件、循环等),本***可采用类basic的脚本语法,此脚本相对主流语言语法简单,易于快速学习和掌握;
b.事件***-脚本调度执行事件驱动引擎(鼠标动作事件、周期动作事件、条件触发动作事件等),驱动和触发脚本执行;
c.编辑模块-用于脚本编写的工具;
d.编译模块-将脚本工具编写的文本型脚本编译成程序支持的二进制中间码;
e.运行模块-加载中间码,通过不同的事件触发去解释执行相应的脚本(事件函数);
f.调试模块-监视中间码执行流程,可通过断点中断去监视脚本执行的过程和过程变量数值;
g.***函数集-集成了脚本***默认提供的函数集(数学算法函数、字符串函数等);
h.变量模块-管理脚本运行中所使用的所有变量;
i.扩展组件管理模块-负责组件模块的安装卸载,负责对组件模块进行加载并能够注册、访问扩展组件中的属性、方法;
j.事件回调-扩展模块回调脚本***功能;
2、扩展HMI,本脚本引擎提供HMI接口供三方使用。
a.安装接口-脚本***可以调用该接口对模块进行导入安装;
b.卸载接口-脚本***可以调用该接口删除模块;
c.注册接口-脚本***可以调用该接口注册模块所扩展的属性、函数、事件;
d.执行接口-脚本***可以通过该接口访问模块注册的属性、函数;
3、扩展AnyCal,是对HMI部分注册功能的封装。三方可以不必使用HMI接口,就可以直接使用QT/C++动态库;
4、中间码,脚本最终编译成中间码,脚本的存储、加载、执行都是以中间码的方式,此处的编译方法采用的是上述实施例中描述的方法。
具体实现过程如下:
1)脚本流程:
a.编辑-事件动作对应的可执行功能脚本,使用***默认提供或者组件提供的的变量、函数等;
b.编译-将脚本编译成中间码,此过程通过上述的脚本编译方法完成;
c.保存-中间码归档保存到磁盘;
d.运行/调试-加载中间码,事件触发(鼠标按下、数据改变、周期动作)解释执行中间码,实现脚本执行。
2)HMI扩展:
本功能极大提高了脚本引擎的扩展性。只要使用脚本引擎提供的HMI接口,就可以任意扩展脚本引擎的“函数库”与“函数描述”。
脚本引擎本身具有强大的功能:实时数据库通讯,脚本编译,直接修改实时数据库数据,脚本引擎自带与扩展的所有功能模块;而HMI则是脚本引擎抽象出的类接口。第三方可以直接调用,从而使用脚本引擎所有的功能。
而其中的RegFunMethod,RegFunMethodParam更是为脚本功能模块的无限扩展提供了可能。
以一个功能模块的的实现为例。如果想扩展脚本引擎的一个功能:读写IO设备。则首先需要使用RegFunMethod注册函数名、函数描述、与函数ID。通过RegFunMethodParam注册函数所需要传入的多个参数。而HMI也支持所有的基础数据类型。用RegFunMethodRet注册需要返回值。这样扩展功能就并入脚本引擎中,写脚本时可以直接使用。
对功能模块的实现:第三方可以用任何方式实现该功能,无论是自己从底层实现还是调用其他第三方SDK。
而所有注册的功能函数,脚本引擎都会统一管理。对于每一个注册的函数功能模块,会用CCustomMethod统一管理保存,其中包含功能模块ID,名称,描述,和参数链表。参数链表中保存参数名称,参数描述与参数基础类型与参数扩展类型。脚本引擎提可以对全局变量经行操作。而参数的扩展类型就记录了该参数是否为全局变量。
以上注册内容,HMI会保存配置文件,方便之后的使用。通过这种方式,脚本引擎可以无限的扩展功能;而正是HMI的存在,才让这样的想法成为可能。
HMI的关键成员布局为:
3)AnyCal功能模块,是在HMI的基础上,对AnyCal的注册功能进行抽象封装,大大简化三方扩展功能的步骤。
调用函数原理:
将函数参数一个个压入堆栈(Win32 API是用堆栈来传递参数的)然后调用函数,函数会从堆栈中取参数(对于汇编语言来说,Win32环境中的参数实际上只有一种类型,那就是一个32位的整数,就是dword类型)进行处理。
有的函数有返回值,(返回值的类型对汇编程序来说也只有dword一种类型,它永远放在eax中,如果要返回的内容不是一个eax所能容纳的,Win32API采用的方法一般是eax中返回一个指向返回数据的指针,或者在调用参数中提供一个缓冲区地址,干脆把数据直接返回到缓冲区中去)返回值会放在eax、edx中,完成了函数的调用过程后,堆栈中的参数不再有用,调用者或是函数本身必须有一方把堆栈指针修正到调用前的状态。(这就叫堆栈的平衡)
而调用约定就是约定了参数压入堆栈的顺序和决定由谁(调用者或是被调用者)来平衡堆栈。
目前AnyCall只支持_stdcall和_cdecl这两种调用约定,
_stdcall与_cdecl的相同之处在于参数的压栈的顺序都是从右向左。不同之处在于调用使用_stdcall的函数时,调用者不需要考虑堆栈平衡,函数本身会平衡堆栈。
而调用使用_cdecl的函数时,调用者必须要平衡堆栈。否则可能引起崩溃现象。
AnyCall实现调用任意的API的原理就是采用调用API的汇编原理。
函数的参数个数目前最大支持255个,所以在调用库函数时按照基本数据类型中的占最大字节数的Double类型计算,会预留2048个字节的栈空间以存放参数数据。
程序中使用的寄存器esp、ebp、eax、edx的作用如下:
esp:栈顶指针(指向当前栈帧的顶部(低地址))
ebp:指向当前的栈帧的底部(高地址)
(注意:ebp指向当前位于***栈最上面的一个栈帧的底部,而不是***栈的底部。严格来说,“栈帧底部”和“栈底”是不同的概念,esp所指的栈帧顶部和***栈的顶部是同一个位置)
eax:Win32 API默认的返回值存放处
edx:函数的返回值的高32位
函数的返回值存放在寄存器eax和edx中,eax存放低32位,edx存放高32位,如何返回值不足32位,则只用到eax)
4)编译:
此处的编译过程通过上述实施例中描述的脚本编译方法进行编译,在此不再进行赘述。
在运行中,只需要按照编译生成的中间码中的索引取出相应数据进行操作,依次执行每一个中间码,就是整个代码的运行流程。
在本实施例中还提供了一种脚本编译装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
本实施例提供一种脚本编译装置,如图8所示,包括:
获取模块101,用于获取待编译脚本的代码,详细内容参见上述方法实施例中步骤S1的相关描述,在此不再进行赘述。
划分模块102,用于将代码按照预设的结构单位进行划分得到多个结构体,详细内容参见上述方法实施例中步骤S2的相关描述,在此不再进行赘述。
解析模块103,用于对多个结构体进行解析并存入数据栈,详细内容参见上述方法实施例中步骤S3的相关描述,在此不再进行赘述。
生成模块104,用于通过数据栈中的结构体生成中间码,同时将结构体保存至链表并为链表中的结构体建立索引,详细内容参见上述方法实施例中步骤S4的相关描述,在此不再进行赘述。
本实施例中的脚本编译装置是以功能单元的形式来呈现,这里的单元是指ASIC电路,执行一个或多个软件或固定程序的处理器和存储器,和/或其他可以提供上述功能的器件。
上述各个模块的更进一步的功能描述与上述对应实施例相同,在此不再赘述。
根据本发明实施例还提供了一种电子设备,如图9所示,该电子设备可以包括处理器901和存储器902,其中处理器901和存储器902可以通过总线或者其他方式连接,图9中以通过总线连接为例。
处理器901可以为中央处理器(Central Processing Unit,CPU)。处理器901还可以为其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等芯片,或者上述各类芯片的组合。
存储器902作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序、非暂态计算机可执行程序以及模块,如本发明方法实施例中的方法所对应的程序指令/模块。处理器901通过运行存储在存储器902中的非暂态软件程序、指令以及模块,从而执行处理器的各种功能应用以及数据处理,即实现上述方法实施例中的方法。
存储器902可以包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需要的应用程序;存储数据区可存储处理器901所创建的数据等。此外,存储器902可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施例中,存储器902可选包括相对于处理器901远程设置的存储器,这些远程存储器可以通过网络连接至处理器901。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
一个或者多个模块存储在存储器902中,当被处理器901执行时,执行上述方法实施例中的方法。
上述电子设备具体细节可以对应参阅上述方法实施例中对应的相关描述和效果进行理解,此处不再赘述。
本领域技术人员可以理解,实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)、随机存储记忆体(Random Access Memory,RAM)、快闪存储器(Flash Memory)、硬盘(Hard Disk Drive,缩写:HDD)或固态硬盘(Solid-StateDrive,SSD)等;存储介质还可以包括上述种类的存储器的组合。
虽然结合附图描述了本发明的实施例,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下做出各种修改和变型,这样的修改和变型均落入由所附权利要求所限定的范围之内。
Claims (7)
1.一种脚本编译方法,其特征在于,包括:
获取待编译脚本的代码;
将所述代码按照预设的结构单位进行划分得到多个结构体;
对所述多个结构体进行解析并存入数据栈;
通过所述数据栈中的结构体生成中间码,同时将所述结构体保存至链表并为所述链表中的结构体建立索引;
所述通过所述数据栈中的结构体生成中间码,同时将所述结构体保存至链表并为所述链表中的结构体建立索引,包括:
对数据栈中的结构体进行语法合规化检查;
将语法合规的结构体按优先级的顺序保存至链表;
从所述链表中提取当前结构体的属性指数,并根据所述属性指数建立所述当前结构体在数据栈中左右键值的索引生成中间码;
所述对所述多个结构体进行解析并存入数据栈,包括:
确定初始结构体,并将所述初始结构体置于数据栈底部;
从剩余待编译代码中提取新的结构体,并对当前结构体进行解析;
根据解析结果调整当前结构体在数据栈中的位置,并返回所述从剩余待编译代码中提取新的结构体进行解析的步骤;
所述对当前结构体进行解析,包括:
对当前结构体中的待编译代码进行逐字节的解析,得到基础关键字;
将所述基础关键字写入结构体并存入数据栈。
2.根据权利要求1所述的脚本编译方法,其特征在于,所述根据解析结果调整当前结构体在数据栈中的位置,包括:
将当前结构体存入所述数据栈顶部;
获取所述数据栈中与当前结构体下邻的第一结构体和当前结构体的解析信息;
将所述当前结构体与所述第一结构体解析信息的优先级进行对比;
若当前结构体的优先级比第一结构体低,则将所述当前结构体存入所述第一结构体下方,并返回获取所述数据栈中与当前结构体下邻的第一结构体和当前结构体的解析信息的步骤,直至当前结构体到达所述数据栈的栈底。
3.根据权利要求1所述的脚本编译方法,其特征在于,所述将所述代码按照预设的结构单位进行划分得到多个结构体,包括:
将所述代码进行基础代码、基础函数和基础语句进行划分,得到多个数据块;
将所述数据块以初始符号结构体为单位,划分为多个结构体。
4.根据权利要求1所述的脚本编译方法,其特征在于,在所述将所述代码按照预设的结构单位进行划分得到多个结构体之前,还包括:
依次提取所述待编译脚本的代码中的关键字;
对所述关键字进行合规检查。
5.一种脚本编译装置,其特征在于,包括:
获取模块:用于获取待编译脚本的代码;
划分模块:用于将所述代码按照预设的结构单位进行划分得到多个结构体;
解析模块:用于对所述多个结构体进行解析并存入数据栈;所述对所述多个结构体进行解析并存入数据栈,包括:确定初始结构体,并将所述初始结构体置于数据栈底部;从剩余待编译代码中提取新的结构体,并对当前结构体进行解析;根据解析结果调整当前结构体在数据栈中的位置,并返回所述从剩余待编译代码中提取新的结构体进行解析的步骤;所述对当前结构体进行解析,包括:对当前结构体中的待编译代码进行逐字节的解析,得到基础关键字;将所述基础关键字写入结构体并存入数据栈;
生成模块:用于通过所述数据栈中的结构体生成中间码,同时将所述结构体保存至链表并为所述链表中的结构体建立索引;所述通过所述数据栈中的结构体生成中间码,同时将所述结构体保存至链表并为所述链表中的结构体建立索引,包括:对数据栈中的结构体进行语法合规化检查;将语法合规的结构体按优先级的顺序保存至链表;从所述链表中提取当前结构体的属性指数,并根据所述属性指数建立所述当前结构体在数据栈中左右键值的索引生成中间码。
6.一种电子设备,其特征在于,包括:
存储器和处理器,所述存储器和所述处理器之间互相通信连接,所述存储器中存储有计算机指令,所述处理器通过执行所述计算机指令,从而执行权利要求1-4中任一项所述的脚本编译方法。
7.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使所述计算机执行权利要求1-4中任一项所述的脚本编译方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111412731.3A CN114115900B (zh) | 2021-11-25 | 2021-11-25 | 一种脚本编译方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111412731.3A CN114115900B (zh) | 2021-11-25 | 2021-11-25 | 一种脚本编译方法、装置及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114115900A CN114115900A (zh) | 2022-03-01 |
CN114115900B true CN114115900B (zh) | 2023-03-24 |
Family
ID=80373117
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111412731.3A Active CN114115900B (zh) | 2021-11-25 | 2021-11-25 | 一种脚本编译方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114115900B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115857910B (zh) * | 2023-03-01 | 2023-06-06 | 杭州义益钛迪信息技术有限公司 | 一种边缘计算采集器的编程方法、装置、服务器及介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113312054A (zh) * | 2021-05-27 | 2021-08-27 | 长沙海格北斗信息技术有限公司 | 针对嵌入式软件架构的软件栈消耗分析方法及分析装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4667290A (en) * | 1984-09-10 | 1987-05-19 | 501 Philon, Inc. | Compilers using a universal intermediate language |
US10579498B2 (en) * | 2016-07-31 | 2020-03-03 | Microsoft Technology Licensing, Llc. | Debugging tool for a JIT compiler |
US10922060B1 (en) * | 2019-09-26 | 2021-02-16 | Fmr Llc | Application source code reuse apparatuses, methods and systems |
CN111694738B (zh) * | 2020-06-04 | 2023-07-18 | 贵州易鲸捷信息技术有限公司 | 一种sql测试脚本的生成方法 |
CN112558984A (zh) * | 2020-12-29 | 2021-03-26 | Oppo广东移动通信有限公司 | 代码编译的方法、装置、电子设备以及服务器 |
-
2021
- 2021-11-25 CN CN202111412731.3A patent/CN114115900B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113312054A (zh) * | 2021-05-27 | 2021-08-27 | 长沙海格北斗信息技术有限公司 | 针对嵌入式软件架构的软件栈消耗分析方法及分析装置 |
Also Published As
Publication number | Publication date |
---|---|
CN114115900A (zh) | 2022-03-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8028276B1 (en) | Method and system for generating a test file | |
CN110442330B (zh) | 列表组件转换方法、装置、电子设备及存储介质 | |
US9182953B2 (en) | Hybrid dynamic code compiling device, method, and service system thereof | |
CN109597618B (zh) | 程序开发方法、装置、计算机设备及存储介质 | |
CN110688544A (zh) | 一种查询数据库的方法、设备及存储介质 | |
CN113901083B (zh) | 基于多解析器的异构数据源操作资源解析定位方法和设备 | |
CN112187713B (zh) | 报文转换的方法、装置、计算机设备和存储介质 | |
CN115509514B (zh) | 一种前端数据模拟方法、装置、设备及介质 | |
CN114115900B (zh) | 一种脚本编译方法、装置及电子设备 | |
CN116028028A (zh) | 请求函数生成方法、装置、设备及存储介质 | |
CN115599359A (zh) | 一种代码生成方法、装置、设备及介质 | |
CN109828759B (zh) | 代码编译方法、装置、计算机装置及存储介质 | |
CN112988163B (zh) | 编程语言智能适配方法、装置、电子设备和介质 | |
CN110941655B (zh) | 一种数据格式转换方法及装置 | |
CN117008920A (zh) | 引擎***、请求处理方法、装置、计算机设备及存储介质 | |
CN114385173A (zh) | 编译方法、装置、设备及存储介质 | |
CN114064601A (zh) | 存储过程转换方法、装置、设备和存储介质 | |
CN116775599A (zh) | 数据迁移方法、装置、电子设备、存储介质 | |
CN113608748B (zh) | C语言转换Java语言的数据处理方法、装置及设备 | |
CN115407997A (zh) | 基于低代码的敏捷开发应用方法及*** | |
CN107506299B (zh) | 一种代码分析方法及终端设备 | |
CN115563183B (zh) | 查询方法、装置及程序产品 | |
WO2024148612A1 (zh) | 一种翻译器生成方法、装置、设备及存储介质 | |
CN111626585B (zh) | 脚本数据提取方法、装置、计算机设备和存储介质 | |
CN117348880A (zh) | 小程序的压缩处理方法、装置、电子设备及存储介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |