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