解释型语言的解析方法及其装置和计算机系统与流程

文档序号:12463502阅读:261来源:国知局
解释型语言的解析方法及其装置和计算机系统与流程

本发明涉及一种语言解析方法及其装置,尤其是一种解释型语言的解析方法及其装置和计算机系统。



背景技术:

相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。比如Python/JavaScript/Perl/Shell等都是计算机程序语言中的解释型语言。

现有的解释型语言的解析过程中,往往借助其他语言工具来解析、翻译、执行,然后再把结果返还,这就造成了解释效率的降低,并且非常依赖语言工具对语言的解析,导致解释型语言的解析不具有通用性。

此外现有的解释型语言的解析仅仅只能针对整个代码块起作用,对代码的解释和执行无法满足即时性的要求。



技术实现要素:

本发明要解决的技术问题是为了克服现有技术的解析方法需要借助其他语言来解析、翻译、执行,然后再把结果返还,而且只能对整个代码块进行解析的缺陷,提供了一种解释型语言的解析方法及其装置和计算机系统,不依赖其他语言和工具,并且能偶即时、增量地解释和执行用户输入的代码。

本发明是通过下述技术方案来解决上述技术问题的:

本发明提供了一种解释型语言的解析方法,其特点是,所述解释型语言的解析方法包括以下步骤:

对获取的代码的每个最小词法单元增加标签;

检测到触发通知时,基于代码中标签将代码转化为多叉树;

逆序递归遍历所述多叉树。

本发明通过对最小语法单元增加标签对代码的语法进行增强,进而能够将代码转换为多叉树的形式,并且还利用触发通知来标识可以解析和执行代码,从而实现对解释型语言的通用、自解析和增量的解释和执行。

较佳地,基于代码中标签将代码转化为多叉树后,计算多叉树的散列结果;

当所述散列结果与存储的上次解析散列结果不相同时,逆序递归遍历所述多叉树,并存储所述散列结果作为上次解析散列结果。

本发明还利用代码散列结果来判断代码是否曾经执行过,从而节省语言解析的资源,并且结合触发通知,实现代码连续属于与连续解析的结合,从而达到即时地代码解析的效果。

优选地,所述散列结果通过MD5或SHA散列算法计算得到。

较佳地,建立两个进程执行所述解释型语言的解析方法,所述两个进程相互锁定,并且一个进程处于工作状态,另一个进程处于休眠状态。

优选地,当处于工作状态的进程崩溃时,处于休眠状态的进程苏醒并替换崩溃的进程执行所述解释型语言的解析方法。

优选地,当处于工作状态的进程崩溃时,清理崩溃的所述进程的资源。

优选地,当处于工作状态的进程崩溃时,建立新的处于休眠状态的进程,并与苏醒的进程相互锁定。

本发明方案通过两个相互锁定的进程,来实现解析方法不会崩溃的效果。

本发明还提供一种解释型语言的解析装置,其特点是,所述解释型语言的解析装置包括:

编辑器接口、语法增强单元、代码转换单元以及解析器;

其中所述语法增强单元将编辑器接口获取代码的每个最小词法单元增加标签;

所述编辑器接口获取到触发通知时,所述代码转换单元基于代码中标签将代码转化为多叉树;

所述解析器逆序递归遍历所述多叉树。

较佳地,所述解释型语言的解析装置还包括散列计算单元,所述散列计算单元计算所述代码转换单元转化得到的多叉树的散列结果;

所述解析器在所述散列结果与存储的上次解析散列结果不相同时,逆序递归遍历所述多叉树;

更新所述散列结果作为上次解析散列结果。

优选地,所述散列计算单元通过MD5或SHA散列算法计算散列结果。

本发明还提供一种计算机系统,所述计算机系统包括两个进程,所述两个进程均调用如上所述的解释型语言的解析装置或解释型语言的解析方法;

其中两个进程相互锁定,并且一个进程处于工作状态,另一个进程处于休眠状态。

较佳地,当处于工作状态的进程崩溃时,处于休眠状态的进程苏醒并替换崩溃的进程执行所述解释型语言的解析方法。

优选地,当处于工作状态的进程崩溃时,清理崩溃的所述进程的资源。

优选地,当处于工作状态的进程崩溃时,建立新的处于休眠状态的进程,并与苏醒的进程相互锁定。

在符合本领域常识的基础上,上述各优选条件,可任意组合,即得本发明各较佳实例。

本发明的积极进步效果在于:

本发明通过对最小语法单元增加标签对代码的语法进行增强,进而能够将代码转换为多叉树的形式,因而不依赖其他语言和工具,并实现对解释型语言的通用、自解析和增量的解释和执行。本发明还通过两个进程之间的相互锁定,实现了解析方法不会崩溃的效果。

附图说明

图1为本发明的实施例1的解释型语言的解析装置的结构示意图。

图2为本发明的实施例1的解析后的词法树示意图。

图3为本发明的实施例1的递归过程示意图。

具体实施方式

下面通过实施例的方式进一步说明本发明,但并不因此将本发明限制在所述的实施例范围之中。

本发明为了实现在语言解析过程中,不依赖其他语言和工具,就能够通用、自解析和增量的解释和执行解释型语言。对输入代码的最小语法单元增加标签对代码的语法进行增强,进而能够将代码转换为多叉树的形式,并结合触发通知和多叉树的散列结果计算实现了代码的即时、增量地解释和执行的同时,还减少了重复代码的重复解析,节省了资源。

并且本发明利用两个进程执行语言解析,避免了单个进程崩溃导致的解析中止,实现了不崩溃的语言解析的效果。

下面通过下述实施例来对本发明进行进一步地详细地说明。

实施例1

如图1所示,本实施例的解释型语言的解析装置包括编辑器接口1、语法增强单元11、代码转换单元2、散列计算单元21以及解析器3,其中语法增强单元集成于编辑器接口1中,所述散列计算单元21集成于代码转换单元2中。

本实施例中编辑器接口1用于获取代码P,语法增强单元11用于将代码P中每个最小词法单元增加标签符号“()”,其中标签可以采用任意的符号,只要能够标识最小语法单元即可,并不限制于本实施例所选取的符号。

编辑器接口1获取到触发通知时,代码转换单元2按照标签符号“()”将代码P转化为多叉树A。其中本实施例的触发通知是回车或者换行,此外可以根据代码的特点采用任意的符号来标识,代码数据完毕可以进行后续解释和执行,并不仅限于本实施例中使用的特定符号。

解析器3用于逆序递归遍历所述多叉树A。此外散列计算单元21通过MD5算法计算多叉树A的散列结果H,所述解析器3在散列结果H与存储的上一次解析代码过程中获得的散列结果H’不同时,逆序递归遍历所述多叉树A,并同步更新散列结果H’。

否则,多叉树A所对应的代码P已经解析执行过,因此只需要反馈上一次解析执行的结果,不需要再次解析执行代码P。

其中本实施例的散列计算单元21可以采用SHA算法等通用散列算法计算散列结果,并不仅局限于MD5算法。

举例来说,本实施例的解释型语言的解析流程如下:

步骤S1、编辑器接口1获取的代码P。

步骤S2、语法增强单元11进行代码P的语法增强,增加标签由“()”组成,标签自身不参与代码P的语法部分,对输入的代码P所使用的解释型语言的最小词法单元,在开始和结束的地方加上标签“()”。

步骤S3、编辑器接口1检测到触发通知(回车和换行)时,代码转换单元2将代码P到数据结构的转换,由被解析的语言提供语法解析,对代码P分解出语法树,然后再转化为通用的多叉树A,

也就是说,在用户输入代码时,对于函数或者数据结构的开始和结束分别插入标签“()”,输入一定量的代码后,遇到回车和换行,代码的文本内容就交由代码转换单元2处理。

代码转换单元2的转化过程是将由标签“()”组成的代码P,分解为不含标签“()”的多叉树A,多叉树A的每个节点,其顶部(root)代表执行的指令,其叶子节点代表指令的参数。由于标签“()”所标记的内容包含数据和函数两种情况,所以转换后的多叉树A也包含两种节点,但是其性质是一致的。例如,对于数据的情况,其结果表示为列表类型的数据;对于函数的情况,其结果是函数执行的返回值,其结果要么为空列表,要么为包含结果为列表类型的数据。所以代码P的数据结构转换最终总是会得到列表类型的数据。

步骤S4、散列计算单元21计算多叉树A的散列结果H,当所述散列结果H与存储的上次解析散列结果H’不相同时,解析器3逆序递归遍历所述多叉树A,并存储所述散列结果H作为上次解析散列结果H’。

具体地说,对于代码转换单元2的转换结果,其表示为多叉树A,本实施例中可以对其二进制表示进行散列计算,从而判断是否需要解析执行。如果散列结果H与上次解析散列结果H’一致,代表用户输入的代码P与上次输入的代码的解析结果一致,则不需要解析执行,否则就需要解析器3进行解析执行。

其中解析器3逆序递归遍历所述多叉树A的具体过程如下:

从多叉树A的叶子节点开始逆序遍历,其中多叉树A的每个节点要么本来就是是列表形式的数据,要么是执行结果为列表形式的数据。所以每个节点的数据都是列表形式的,例如表现为“(开始,)结束”,“(”之后的第一个字符可以是操作符,其他位置只能是数据或列表。在将整棵多叉树A按上述方式逆序递归其每个节点,得到的顶端(root)节点的值就是代表整个多叉树A的列表类型的数据。由于解析器3的解析过程是共同、通用的,所以可适用于所有的解释型语言,列表类数据结构的最简单的数据结构是list,并且list数据结构本身也是通用的。以Javascript(一种编程语言)为例,其列表形式为[1 2 3],实现方式是数组。

例如,对于Javascript代码:

的数据结构转化和解析过程如下:

通过js语法解析,只保留body部分,去掉VariableDeclarator,并且对于body中的节点1,其中引用的m,用节点0的VariableDeclarator对应的m来替代,得到:

然后,对于第一层构造,得知其是使用方法concat调用,前两个参数是1,2,第三参数是表达式。对于concat方法,解释为列表中的同级元素,在同一层即可,对于第三参数,表达式的语法为+操作的参数有三个,分别为3、“-”操作符作用于5,6的结果、“*”操作符作用于3,2的结果。

所以,解析器的结果如下(concat为列表合并,在解析器中,就表现为列表的两个部分):

其解析后的词法树如图2所示,由(1 2(+3(-5 6)(*3 2)))转为2831203220282B203320282D3520362920282A20332032292929,这个二进制的存储形式,经过MD5散列后的base64编码为ImzEvNIoL3cX4lph+CDhWA==。

递归的过程图3所示,结果等于(1 2(3+(-1)+6),即列表型的结果即为(1 2 8),也就是包含3个元素的列表。

步骤S5、编辑器接口1输出解析执行的结果。

此后当下一次用户输入的回车换行时,重复上述步骤,再次得出多叉树的散列结果,并与上一次的散列结果做对比,如果一致则放弃解析执行,直接输出上一次的解析执行结果,如果不一致则保存新的散列结果值,并解析执行后返回给编辑器接口1。

实施例2

本实施例的计算机系统包括两个进程A、B,所述两个进程A、B均调用实施例1中所述的解释型语言的解析流程。

本实施例中两个进程A、B相互锁定,并且进程A处于工作状态,进程B处于休眠状态。如果进程A崩溃,进程B就会苏醒并替换崩溃的进程A执行所述解释型语言的解析流程。

与此同时,系统会自动清理崩溃的进程A的资源,并建立新的处于休眠状态的进程C,并与进程B相互锁定。

也就是说,这一对互相锁定的进程。一个负责执行,一个负责监控(睡眠时被唤醒),当工作的进程崩溃的时候,睡眠的进程马上替换它,并清理不必要的资源,同时开启一个新的进程,使其处于睡眠状态以替换奔溃的进程。以此来达到不会崩溃的效果。

例如进程1进行常规工作,进程2监视进程1,当进程1崩溃,进程2回收其相关的资源,然后结束进程1,进程2开启一个新的监视进程3监控自己,然后开始进行进程1的常规工作。

通过以上的解释型语言的解析方法以其装置的具体实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请的解释型语言的解析流程可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,所述计算机软件产品可以存储在存储介质中,如ROM/RAM(只读存储器/随机存取存储器)、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请实施例或者实施例的某些部分所述的方法。

本申请可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC(个人电脑)、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。

本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。

虽然以上描述了本发明的具体实施方式,但是本领域的技术人员应当理解,这些仅是举例说明,本发明的保护范围是由所附权利要求书限定的。本领域的技术人员在不背离本发明的原理和实质的前提下,可以对这些实施方式做出多种变更或修改,但这些变更和修改均落入本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1