编程语言的解析方法及装置、非易失性存储介质转让专利

申请号 : CN202210063667.0

文献号 : CN114090017B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李若卢朓

申请人 : 北京大学北京大学重庆大数据研究院

摘要 :

本申请公开了一种编程语言的解析方法及装置、非易失性存储介质。其中,该方法包括:将源代码识别为字符流,并将字符流解析为词法单元列表,其中,词法单元列表中包括多个词法单元;将多个词法单元分为第一类词法单元和第二类词法单元,其中,第一类词法单元为包括歧义符号的词法单元,第二类词法单元为不包括歧义符号的词法单元;将第一类词法单元转换为第二类词法单元;对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析。本申请解决了数值计算编程语言引入的数学符号具有多义导致解释器处理数值计算编程语言时容易出错的技术问题。

权利要求 :

1.一种编程语言的解析方法,其特征在于,包括:

将源代码识别为字符流,并将所述字符流解析为词法单元列表,其中,所述词法单元列表中包括多个词法单元;

将所述多个词法单元分为第一类词法单元和第二类词法单元,其中,所述第一类词法单元为包括歧义符号的词法单元,所述第二类词法单元为不包括歧义符号的词法单元;

将所述第一类词法单元转换为所述第二类词法单元;

对由所述第一类词法单元转换得到的所述第二类词法单元和将所述多个词法单元进行分类得到的所述第二类词法单元进行解析;

将所述多个词法单元分为第一类词法单元和第二类词法单元,包括:获取所述多个词法单元的符号名;从所述符号名中确定出具有歧义的目标符号名;将所述目标符号名所属的词法单元确定为所述第一类词法单元,将所述符号名中除所述目标符号名以外的符号名所属的词法单元确定为所述第二类词法单元;

将所述第一类词法单元转换为所述第二类词法单元,包括:将所述第一类词法单元输入至语义分析器进行解析,得到所述第二类词法单元;

将所述第一类词法单元输入至语义分析器进行解析,得到所述第二类词法单元,包括:依据所述第一类词法单元的上下文信息,确定所述第一类词法单元的符号名的类型;依据所述第一类词法单元的符号名的类型,修改所述第一类词法单元的属性值,得到所述第二类词法单元。

2.根据权利要求1所述的方法,其特征在于,

对由所述第一类词法单元转换得到的所述第二类词法单元和将所述多个词法单元进行分类得到的所述第二类词法单元进行解析,包括:将由所述第一类词法单元转换得到的所述第二类词法单元和将所述多个词法单元进行分类得到的所述第二类词法单元输入至语法分析器进行解析;将所述语法分析器对所述第二类词法单元的解析结果输入至所述语义分析器进行解析。

3.根据权利要求2所述的方法,其特征在于,将由所述第一类词法单元转换得到的所述第二类词法单元和将所述多个词法单元进行分类得到的所述第二类词法单元输入至语法分析器进行解析,包括:将由所述第一类词法单元转换得到的所述第二类词法单元和将所述多个词法单元进行分类得到的所述第二类词法单元组装成语法分析树。

4.根据权利要求3所述的方法,其特征在于,将所述语法分析器对所述第二类词法单元的解析结果输入至所述语义分析器进行解析,包括:对所述语法分析树进行精简处理,构建抽象语法树。

5.根据权利要求1所述的方法,其特征在于,将所述字符流解析为词法单元列表,包括:按照预设构词规则将所述字符流解析为所述词法单元列表,其中,所述词法单元列表中的每个词法单元包括:符号名和属性值,其中,所述符号名为所述词法单元本身,所述属性值为所述词法单元的类型。

6.一种编程语言的解析装置,其特征在于,包括:

第一解析模块,用于将源代码识别为字符流,并将所述字符流解析为词法单元列表,其中,所述词法单元列表中包括多个词法单元;

分类模块,用于将所述多个词法单元分为第一类词法单元和第二类词法单元,其中,所述第一类词法单元为包括歧义符号的词法单元,所述第二类词法单元为不包括歧义符号的词法单元;

转换模块,用于将所述第一类词法单元转换为所述第二类词法单元;

第二解析模块,用于对由所述第一类词法单元转换得到的所述第二类词法单元和将所述多个词法单元进行分类得到的所述第二类词法单元进行解析;

所述分类模块,还用于获取所述多个词法单元的符号名;从所述符号名中确定出具有歧义的目标符号名;将所述目标符号名所属的词法单元确定为所述第一类词法单元,将所述符号名中除所述目标符号名以外的符号名所属的词法单元确定为所述第二类词法单元;

所述转换模块,还用于依据所述第一类词法单元的上下文信息,确定所述第一类词法单元的符号名的类型;依据所述第一类词法单元的符号名的类型,修改所述第一类词法单元的属性值,得到所述第二类词法单元。

7.一种非易失性存储介质,其特征在于,所述非易失性存储介质包括存储的程序,其中,在所述程序运行时控制所述非易失性存储介质所在设备执行权利要求1至5中任意一项所述的编程语言的解析方法。

8.一种处理器,其特征在于,所述处理器用于运行存储在存储器中的程序,其中,所述程序运行时执行权利要求1至5中任意一项所述的编程语言的解析方法。

说明书 :

编程语言的解析方法及装置、非易失性存储介质

技术领域

[0001] 本申请涉及软件领域,具体而言,涉及一种编程语言的解析方法及装置、非易失性存储介质。

背景技术

[0002] 图1是目前高级编程语言的编译运行过程的示意图,如图1所示,高级语言的编译运行过程,涉及到图1所示的三种形式:a)编译型语言(如C语言),源代码通过编译器生成二进制可执行程序,由机器直接执行;b)第一种解释型语言(如Java语言),源代码通过解释器转化为中间代码(如字节码),在虚拟机中解释执行;c)第二种解释型语言(如Lisp语言),源代码通过解释器直接解释执行。
[0003] 编译器是一种将源语言程序(通常为高级语言)翻译为目标语言(通常指二进制数表示的机器语言)写成的程序。图2是编译器的运行过程流程图,如图2所示,整个编译过程如图2所示,大致可分为6个阶段:语法分析、语义分析、中间代码产生、代码优化及目标代码生产。
[0004] 图3是解释器的运行过程流程图,如图3所示,解释器是一种将源代码解释执行的程序。整个解释过程大致可分为4个阶段,包括:词法分析、语法分析、语义分析、中间代码生成或直接解释执行。
[0005] 1)词法分析器,对构成源程序的字符流进行扫描,即从左到右一个字符一个字符地读入源程序,然后根据构词规则识别单词(也称单词符号或符号),重新组织为词法单元列表。
[0006] 2)语法分析器,使用由词法分析得到的各个词法单元的第一个分量来创建语法树,其中树中的每个内部结点表示一个运算,而该结点的子结点表示该运算的分量。语法分析是一个逻辑阶段,判断源程序在结构上是否正确。
[0007] 3)语义分析器,使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致。同时收集类型信息,并生成抽象语法树。语义分析是一个逻辑阶段,对结构上正确的源程序进行上下文有关性质的审查,主要是类型检查。
[0008] 现有解释器在处理一般编程语言,如Lisp语言,是足够的,但处理数值计算编程语言时则有所不足。数值计算语言会引入更多的数学符号,从而导致一些符号具有多义,即源代码中具有歧义代码。比如,源代码中的单引号’既可以表示字符的开始或结束,又可以用来表示矩阵的转置。当单引号表示字符的开始或结束时,其类型为界限符;当单引号表示矩阵的转置时,其类型为运算符。单引号作为不同类型时,生产的语法树和抽象语法树具有本质区别。在现有解释器的架构基础上,解释器只会把单引号当做固定的一种类型处理,从而导致错误结果。
[0009] 针对数值计算编程语言引入的数学符号具有多义导致解释器处理数值计算编程语言时容易出错的问题,目前尚未提出有效的解决方案。

发明内容

[0010] 本申请实施例提供了一种编程语言的解析方法及装置、非易失性存储介质,以至少解决数值计算编程语言引入的数学符号具有多义导致解释器处理数值计算编程语言时容易出错的技术问题。
[0011] 根据本申请实施例的一个方面,提供了一种编程语言的解析方法,包括:将源代码识别为字符流,并将字符流解析为词法单元列表,其中,词法单元列表中包括多个词法单元;将多个词法单元分为第一类词法单元和第二类词法单元,其中,第一类词法单元为包括歧义符号的词法单元,第二类词法单元为不包括歧义符号的词法单元;将第一类词法单元转换为第二类词法单元;对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析。
[0012] 可选地,将多个词法单元分为第一类词法单元和第二类词法单元,包括:获取多个词法单元的符号名;从符号名中确定出具有歧义的目标符号名;将目标符号名所属的词法单元确定为第一类词法单元,将符号名中除目标符号名以外的符号名所属的词法单元确定为第二类词法单元。
[0013] 可选地,将第一类词法单元转换为第二类词法单元,包括:将第一类词法单元输入至语义分析器进行解析,得到第二类词法单元;对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析,包括:将由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元输入至语法分析器进行解析;将语法分析器对第二类词法单元的解析结果输入至语义分析器进行解析。
[0014] 可选地,将第一类词法单元输入至语义分析器进行解析,得到第二类词法单元,包括:依据第一类词法单元的上下文信息,确定第一类词法单元的符号名的类型;依据第一类词法单元的符号名的类型,修改第一类词法单元的属性值,得到第二类词法单元。
[0015] 可选地,将由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元输入至语法分析器进行解析,包括:将由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元组装成语法分析树。
[0016] 可选地,将语法分析器对第二类词法单元的解析结果输入至语义分析器进行解析,包括:对语法分析树进行精简处理,构建抽象语法树。
[0017] 可选地,将字符流解析为词法单元列表,包括:按照预设构词规则将字符流解析为词法单元列表,其中,词法单元列表中的每个词法单元包括:符号名和属性值,其中,符号名为词法单元本身,属性值为词法单元的类型。
[0018] 根据本申请实施例的另一方面,还提供了一种编程语言的解析装置,包括:第一解析模块,用于将源代码识别为字符流,并将字符流解析为词法单元列表,其中,词法单元列表中包括多个词法单元;分类模块,用于将多个词法单元分为第一类词法单元和第二类词法单元,其中,第一类词法单元为包括歧义符号的词法单元,第二类词法单元为不包括歧义符号的词法单元;转换模块,用于将第一类词法单元转换为第二类词法单元;第二解析模块,用于对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析。
[0019] 根据本申请实施例的再一方面,还提供了一种非易失性存储介质,非易失性存储介质包括存储的程序,其中,在程序运行时控制非易失性存储介质所在设备执行以上的编程语言的解析方法。
[0020] 根据本申请实施例的再一方面,还提供了一种处理器,处理器用于运行存储在存储器中的程序,其中,程序运行时执行以上的编程语言的解析方法。
[0021] 在本申请实施例中,采用将源代码识别为字符流,并将字符流解析为词法单元列表,其中,词法单元列表中包括多个词法单元;将多个词法单元分为第一类词法单元和第二类词法单元,其中,第一类词法单元为包括歧义符号的词法单元,第二类词法单元为不包括歧义符号的词法单元;将第一类词法单元转换为第二类词法单元;对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析的方式,通过对词法分析的结果—词法单元列表进行分类处理,将具有歧义的词法单元转换为没有歧义的词法单元,达到了改进解释器处理歧义代码能力的目的,从而实现了提高解释器处理数值计算编程语言的准确度的技术效果,进而解决了数值计算编程语言引入的数学符号具有多义导致解释器处理数值计算编程语言时容易出错技术问题。

附图说明

[0022] 此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
[0023] 图1是目前高级编程语言的编译运行过程的示意图;
[0024] 图2是编译器的运行过程流程图;
[0025] 图3是解释器的运行过程流程图;
[0026] 图4是根据本申请实施例的一种编程语言的解析方法的流程图;
[0027] 图5a是根据本申请实施例的一种抽象语法树的示意图;
[0028] 图5b是根据本申请实施例的另一种抽象语法树的示意图;
[0029] 图6是根据本申请实施例的一种编程语言的解析装置的结构框图。

具体实施方式

[0030] 为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
[0031] 需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
[0032] 根据本申请实施例,提供了一种编程语言的解析方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0033] 图4是根据本申请实施例的一种编程语言的解析方法的流程图,如图4所示,该方法包括如下步骤:
[0034] 步骤S402,将源代码识别为字符流,并将字符流解析为词法单元列表,其中,词法单元列表中包括多个词法单元;
[0035] 在本步骤中,识别源代码,把源代码识别为字符流。词法分析器接收字符流,根据设定的构词规则,把源程序解析为词法单元列表,词法单元列表中包括多个词法单元。
[0036] 步骤S404,将多个词法单元分为第一类词法单元和第二类词法单元,其中,第一类词法单元为包括歧义符号的词法单元,第二类词法单元为不包括歧义符号的词法单元;
[0037] 在执行步骤S404时,对词法单元列表进行分类处理,分为包括歧义符号的词法单元以及不包括歧义符号的词法单元。
[0038] 步骤S406,将第一类词法单元转换为第二类词法单元;
[0039] 步骤S408,对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析。
[0040] 通过上述步骤,通过对词法分析的结果—词法单元列表进行分类处理,将具有歧义的词法单元转换为没有歧义的词法单元,达到了改进解释器处理歧义代码能力的目的,从而实现了提高解释器处理数值计算编程语言的准确度的技术效果。
[0041] 根据本申请的一个可选的实施例,步骤S404将多个词法单元分为第一类词法单元和第二类词法单元,通过以下方法实现:获取多个词法单元的符号名;从符号名中确定出具有歧义的目标符号名;将目标符号名所属的词法单元确定为第一类词法单元,将符号名中除目标符号名以外的符号名所属的词法单元确定为第二类词法单元。
[0042] 在本步骤中,通过词法单元的符号名,找出具有歧义的符号,把此类词法单元标为第一类词法单元,其他词法单元,标为第二类词法单元。
[0043] 根据本申请的另一个可选的实施例,执行步骤S406将第一类词法单元转换为第二类词法单元,包括:将第一类词法单元输入至语义分析器进行解析,得到第二类词法单元。
[0044] 可选地,将第一类词法单元输入至语义分析器进行解析,得到第二类词法单元,包括:依据第一类词法单元的上下文信息,确定第一类词法单元的符号名的类型;依据第一类词法单元的符号名的类型,修改第一类词法单元的属性值,得到第二类词法单元。
[0045] 在本步骤中,语义解析器接收第一类词法单元,根据上下文判别第一类词法单元的单词符号的具体类型,根据判别结果修改第一类词法单元的属性值,把第一类词法单元的类型改为第二类词法单元。
[0046] 在本申请的一些可选的实施例中,执行步骤S408对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析,包括:将由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元输入至语法分析器进行解析;将语法分析器对第二类词法单元的解析结果输入至语义分析器进行解析。
[0047] 在本申请的一些可选的实施例中,将由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元输入至语法分析器进行解析,包括:将由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元组装成语法分析树。
[0048] 语法分析器接收第二类词法单元,按照设定的文法规则,将词法单元序列组装成语法分析树。采用自适应LL(k)算法,所述LL中的第一个L表示从左向右对词法单元序列进行分析,第二个L表示分析过程中将使用最左推导,k≥1,k表示在按照所述文法规则的匹配过程中向前匹配k个词法单元,所述自适应LL(k)算法能够在语法分析的过程中以动态的方式对语法执行分析,并且能够自动将文法中的左递归改写为等价的非左递归形式。
[0049] 根据本申请的一个可选的实施例,将语法分析器对第二类词法单元的解析结果输入至语义分析器进行解析,包括:对语法分析树进行精简处理,构建抽象语法树。
[0050] 语义分析器接收语法分析树和词法单元序列、符号表信息,精简语法树,构建抽象语法树。语法分析器将错误信息输出到错误处理模块,并根据语法分析结果更新符号表管理模块中的标识符。语义分析器将错误信息输出到错误处理模块,并根据语义分析结果更新符号表管理模块中的标识符。
[0051] 图5a是根据本申请实施例的一种抽象语法树的示意图,如图5a所示,给出了一个定义简单矩阵的源代码对应的语法树,其中L表示列表,R表示行,J表示矩阵,F表示内置函数,都放在自定义的符号表中。
[0052] 图5a所示的语法树对应的源代码为a = [1,2;2,exp(2)]。
[0053] 图5b是根据本申请实施例的另一种抽象语法树的示意图,如图5b所示,给出了一个自定义函数sum源代码对应的语法树,其中C表示自定义函数。
[0054] 图5b所示的语法树对应的源代码为sum(2,3)。
[0055] 根据本申请的另一个可选的实施例,执行步骤S402时,将字符流解析为词法单元列表,通过以下方法实现:按照预设构词规则将字符流解析为词法单元列表,其中,词法单元列表中的每个词法单元包括:符号名和属性值,其中,符号名为词法单元本身,属性值为词法单元的类型。
[0056] 语法分析器接收字符流,按照设定的构词规则,把源程序解析为词法单元列表。词法单元由符号名(token‑name)以及属性值(attribute‑value)构成。符号名为单词本身,将由语法分析器使用。属性值表示单词的类型,包括关键字、常量、运算符、界限符、标识符。将错误信息输出到错误处理模块,将标识符输入到符号管理模块。
[0057] 本申请实施例提供的上述方法,可以解决数值计算编程语言中具有歧义符号的问题,也可以解决其他编程语言中含有歧义符号的问题。基于该技术方案的编译器,可以应用于数值计算编程语言,如Maltab和Octave。
[0058] 图6是根据本申请实施例的一种编程语言的解析装置的结构框图,如图6所示,该装置包括:
[0059] 第一解析模块60,用于将源代码识别为字符流,并将字符流解析为词法单元列表,其中,词法单元列表中包括多个词法单元;
[0060] 分类模块62,用于将多个词法单元分为第一类词法单元和第二类词法单元,其中,第一类词法单元为包括歧义符号的词法单元,第二类词法单元为不包括歧义符号的词法单元;
[0061] 转换模块64,用于将第一类词法单元转换为第二类词法单元;
[0062] 第二解析模块66,用于对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析。
[0063] 需要说明的是,图6所示实施例的优选实施方式可以参见图4所示实施例的相关描述,此处不再赘述。
[0064] 本申请实施例还提供了一种非易失性存储介质,非易失性存储介质包括存储的程序,其中,在程序运行时控制非易失性存储介质所在设备执行以上的编程语言的解析方法。
[0065] 上述非易失性存储介质用于存储执行以下功能的程序:将源代码识别为字符流,并将字符流解析为词法单元列表,其中,词法单元列表中包括多个词法单元;将多个词法单元分为第一类词法单元和第二类词法单元,其中,第一类词法单元为包括歧义符号的词法单元,第二类词法单元为不包括歧义符号的词法单元;将第一类词法单元转换为第二类词法单元;对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析。
[0066] 本申请实施例还提供了一种处理器,处理器用于运行存储在存储器中的程序,其中,程序运行时执行以上的编程语言的解析方法。
[0067] 上述处理器用于运行执行以下功能的程序:将源代码识别为字符流,并将字符流解析为词法单元列表,其中,词法单元列表中包括多个词法单元;将多个词法单元分为第一类词法单元和第二类词法单元,其中,第一类词法单元为包括歧义符号的词法单元,第二类词法单元为不包括歧义符号的词法单元;将第一类词法单元转换为第二类词法单元;对由第一类词法单元转换得到的第二类词法单元和将多个词法单元进行分类得到的第二类词法单元进行解析。
[0068] 上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
[0069] 在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0070] 在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
[0071] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0072] 另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0073] 所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对相关技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read‑Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
[0074] 以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。