用于处理程序代码中的变量的引用的方法和系统转让专利

申请号 : CN201911369988.8

文献号 : CN111158663B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 丛明舒瞿中明曲嘉宝曾凯唐来朋何毅良

申请人 : 深圳逻辑汇科技有限公司

摘要 :

本公开涉及用于处理程序代码中的变量的引用的方法和系统。提供的方法包括:顺序地接收用户输入中包含的字符流,该字符流是程序代码的一部分;从所接收的字符流中识别第一变量符号并且存储与第一变量符号相关的信息,其中第一变量符号表示第一变量;把第一变量符号与从程序代码中先前识别的至少一个变量符号进行匹配以确定所述至少一个变量符号中是否存在表示第一变量的第二变量符号;响应于确定存在至少一个第二变量符号,根据与第一变量符号相关的操作以及与所述一个或多个第二变量符号相关的操作,确定第一变量符号是否涉及未定义引用;以及响应于确定第一变量符号涉及未定义引用,向用户提供可视辅助来处理该未定义引用。

权利要求 :

1.一种用于处理程序代码中的变量的引用的方法,包括:顺序地接收用户输入中包含的字符流,其中所述字符流是所述程序代码的一部分;

从所接收的字符流中识别第一变量符号并且存储与第一变量符号相关的信息,其中第一变量符号表示第一变量并且与第一变量符号相关的信息至少包括与第一变量符号相关的操作;

把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配以确定所述至少一个变量符号中是否存在表示第一变量的第二变量符号;

响应于确定存在至少一个第二变量符号,根据与第一变量符号相关的操作以及与所述一个或多个第二变量符号相关的操作,确定第一变量符号是否涉及未定义引用,其中与变量符号相关的操作是指对变量符号代表的变量的操作;以及响应于确定第一变量符号涉及未定义引用,向用户提供可视辅助来处理该未定义引用。

2.根据权利要求1所述的方法,还包括:响应于确定不存在第二变量符号,根据与第一变量符号相关的操作,确定第一变量符号是否涉及未定义引用。

3.根据权利要求1所述的方法,还包括:从所接收的字符流中继续识别第三变量符号并且存储与第三变量符号相关的信息,其中第三变量符号表示第一变量;

把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配以确定所述至少一个变量符号中是否存在表示第一变量的变量符号;

通过所述匹配至少找到与第三变量符号均表示第一变量的第一变量符号;以及在确定与第一变量符号相关的操作依赖于与第三变量符号相关的操作的情况下,至少利用与第三变量符号相关的操作来执行与第一变量符号相关的操作。

4.根据权利要求1所述的方法,还包括解析或执行所述程序代码的一部分,该部分不包括包含第一变量符号的程序语句。

5.根据权利要求1所述的方法,其中,所述用户输入包括以下输入中的一者:用户编辑完成并存储的程序代码的至少一部分,由文本编辑器监听的用户输入动作产生的程序代码的至少一部分,以及通过用户在图形用户界面编辑器中的操作产生的程序代码的至少一部分。

6.根据权利要求5所述的方法,其中向用户提供可视辅助包括以下的一者或多者:在文本编辑器或图形用户界面编辑器中,在第一变量符号的附近显示提示框、或者突出显示第一变量符号。

7.根据权利要求1所述的方法,其中从所接收的字符流中识别第一变量符号包括利用词法分析器或者机器学习分类器中的一者或多者从所接收的字符流中识别第一变量符号。

8.根据权利要求1所述的方法,其中从所接收的字符流中识别第一变量符号包括把从图形用户界面编辑器的特定组件中接收的字符流识别为第一变量符号。

9.根据权利要求1或3所述的方法,其中与变量符号相关的信息包括以下信息中的一者或多者:变量符号的名称、变量符号在程序代码中的位置、变量符号的命名空间、变量符号的作用域、变量符号表示的变量的类型、变量符号表示的变量、以及与变量符号相关的操作。

10.根据权利要求9所述的方法,其中与变量符号相关的信息被存储到变量符号表中,并且其中所述变量符号表存储有与所述程序代码中的每个识别的变量符号相关的信息。

11.根据权利要求10所述的方法,还包括建立变量表以及建立变量符号表和变量表之间的关系。

12.根据权利要求11所述的方法,其中,所述变量表存储所识别的变量的状态,并且变量的状态包括以下一者或多者:表示该变量的变量符号、变量在内存中的地址、变量进行的操作、变量是否被定义、以及变量是否被引用。

13.根据权利要求11所述的方法,其中,建立变量符号表和变量表之间的关系包括:对于变量符号表中的每个变量符号,存储其表示的变量表中的变量;对于变量表中的每个变量,存储能表示它的变量符号表中的变量符号。

14.根据权利要求9所述的方法,其中,在图形用户界面编辑器环境中,变量符号在程序代码中的位置通过输入了该变量符号的组件的位置获得,变量符号的命名空间根据输入了该变量符号的组件与其它组件的结构关系或用户指定的该变量符号的路径获得,变量符号的作用域通过输入了该变量符号的组件与其它组件的结构关系获得,变量符号表示的变量的类型通过创建该变量时的组件的信息获得,与变量符号相关的操作通过用户在图形用户界面编辑器中的相应操作获得。

15.根据权利要求9所述的方法,其中,变量符号在程序代码中的位置使用表示该变量符号在程序代码中的位置的元组来表示,并且变量符号的命名空间、变量符号的作用域、变量符号表示的变量的类型、以及与变量符号相关的操作通过对该变量符号的上下文进行语法分析而获得。

16.根据权利要求9所述的方法,其中,把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当所存储的第一变量符号和所述至少一个变量符号中的第二变量符号的名称、命名空间、作用域、以及表示的变量的类型都相同时,确定第一变量符号和第二变量符号表示同一变量。

17.根据权利要求9所述的方法,其中,把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当第一变量符号和所述至少一个变量符号中的多个第二变量符号的名称相同时,根据预定义的规则确定第一变量符号和哪个第二变量符号表示同一变量。

18.根据权利要求17所述方法,其中所述预定义的规则包括将第一变量符号和距离其最近的相同名称的第二变量符号匹配为表示同一变量。

19.根据权利要求9所述的方法,其中,把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当所存储的第三变量符号和第一变量符号的名称、命名空间、作用域、以及表示的变量的类型都相同时,确定第三变量符号和第一变量符号表示同一变量。

20.根据权利要求9所述的方法,其中,把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当第三变量符号和所述至少一个变量符号中的多个变量符号的名称相同时,根据预定义的规则确定第三变量符号和哪个变量符号表示同一变量。

21.根据权利要求18所述方法,其中所述预定义的规则包括将第三变量符号和距离其最近的相同名称的第一变量符号匹配为表示同一变量。

22.根据权利要求9所述的方法,其中,把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当与第一变量符号相关的信息和与所述至少一个变量符号中的第二变量符号相关的信息之间的相似度高于阈值时,提示用户确认第一变量符号和第二变量符号是否表示同一变量。

23.根据权利要求9所述的方法,其中,把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当与第三变量符号相关的信息和与第一变量符号相关的信息之间的相似度高于阈值时,提示用户确认第三变量符号和第一变量符号是否表示同一变量。

24.根据权利要求22或23所述的方法,其中,所述相似度可以通过以下的一者或多者得到:变量符号名称之间的编辑距离、变量符号名称之间的语义相似度、变量符号命名空间之间的相似度、变量符号作用域之间的包含关系、以及变量符号在所述程序代码中的位置之间的距离。

25.根据权利要求22所述的方法,其中,当用户确认表示同一变量时,在变量符号表中把第一变量符号表示的变量存储为与第二变量符号表示的相同的变量。

26.根据权利要求23所述的方法,其中,当用户确认表示同一变量时,在变量符号表中把第三变量符号表示的变量存储为与第一变量符号表示的相同的变量。

27.根据权利要求22所述的方法,其中,当用户确认表示同一变量时,将第一变量符号和第二变量符号的名称和命名空间改成相同。

28.根据权利要求23所述的方法,其中,当用户确认表示同一变量时,将第三变量符号和第一变量符号的名称和命名空间改成相同。

29.根据权利要求13所述的方法,其中,响应于与变量符号相关的信息被存储到变量符号表中,把该变量符号与先前存储的变量符号逐个进行匹配。

30.根据权利要求13所述的方法,其中,通过变量符号的名称的哈希值在变量符号表中建立索引,并且其中,响应于与变量符号相关的信息被存储到变量符号表中,通过所述索引把该变量符号与先前存储的变量符号进行匹配。

31.根据权利要求3所述的方法,其中,与第一变量符号相关的操作、与第二变量符号相关的操作、以及与第三变量符号相关的操作中的每一个包括以下的至少一者:声明、定义、初始化、赋值、访问、以及析构。

32.根据权利要求31所述的方法,其中,与第一变量符号相关的操作依赖于与第三变量符号相关的操作包括以下的至少一者:对第一变量符号的访问依赖于对第三变量符号的定义,对第一变量符号的访问依赖于对第三变量符号的声明、定义或赋值、对第一变量符号的赋值依赖于对第三变量符号的声明或定义、以及对第一变量符号的析构依赖于对第三变量符号的声明或定义。

33.根据权利要求1所述的方法,其中所述程序代码是以编译型语言、解释型语言、或者用于构建电子表格模型的语言编写的。

34.根据权利要求22所述的方法,其中,当存在与第一变量符号的名称之间的相似度高于阈值的多个第二变量符号时,按照相似度的降序在列表中向用户显示所述多个第二变量符号。

35.根据权利要求34所述的方法,其中,响应于用户选择了列表中的所述多个第二变量符号中的一个,所述程序代码中的第一变量符号的名称被修改为所选择的第二变量符号的名称。

36.根据权利要求34所述的方法,其中,响应于用户选择了列表中的所述多个第二变量符号中的一个,确认第一变量符号与所选择的第二变量符号表示同一变量,并且提示用户统一第一变量符号与所选择的第二变量符号的名称。

37.根据权利要求23所述的方法,其中,当存在与第三变量符号的名称之间的相似度高于阈值的包含第一变量符号的多个变量符号时,按照相似度的降序在列表中向用户显示所述多个变量符号。

38.根据权利要求37所述的方法,其中,响应于用户选择了列表中的第一变量符号,所述程序代码中的第三变量符号的名称被修改为所选择的第一变量符号的名称,或者所述程序代码中的第一变量符号的名称被修改为第三变量符号的名称。

39.根据权利要求37所述的方法,其中,响应于用户选择了列表中的第一变量符号,确认第三变量符号与所选择的第一变量符号表示同一变量,并且提示用户统一第三变量符号与所选择的第一变量符号的名称。

40.根据权利要求3所述的方法,其中,向用户提供可视辅助包括在图形用户界面上展示一列表,该列表向用户展示所述程序代码中涉及未定义引用的所有变量符号并且包括第一变量符号。

41.根据权利要求40所述的方法,还包括:响应于通过所述匹配确定第三变量符号与第一变量符号都表示第一变量,在图形用户界面上的所述列表上中突出显示匹配成功的第一变量符号。

42.根据权利要求11所述的方法,其中,向用户提供可视辅助包括在图形用户界面上显示所述变量表和变量符号表以及它们之间的关系。

43.根据权利要求1所述的方法,其中,向用户提供可视辅助包括在图形用户界面上显示所述程序代码中的已经匹配成功的所有变量符号。

44.根据权利要求43所述的方法,其中,所显示的已经匹配成功的变量符号能够被用户修改其匹配关系。

45.根据权利要求16或17所述的方法,还包括:当确定第一变量符号和第二变量符号表示同一变量时,向用户进行提示。

46.根据权利要求19或20所述的方法,还包括:当确定第三变量符号和第一变量符号表示同一变量时,向用户进行提示。

47.根据权利要求12所述的方法,其中,所述变量表中的一个变量进行的操作等于与表示该变量的至少一个变量符号中的每个变量符号相关的操作的并集。

48.根据权利要求47所述的方法,还包括:根据所述并集中包括的操作来判断该变量是否被定义。

49.根据权利要求48所述的方法,还包括:响应于从变量表中检测到第一变量符号表示的第一变量变为被定义,从展示所述程序代码中涉及未定义引用的所有变量符号的列表中删除第一变量符号。

50.根据权利要求1或2所述的方法,还包括:从所接收的字符流中继续识别第三变量符号并且存储与第三变量符号相关的信息,其中第三变量符号表示第一变量;

把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配从而确定所述至少一个变量符号中是否存在表示第一变量的变量符号;

通过所述匹配至少找到与第三变量符号均表示第一变量的第一变量符号;以及响应于确定与第一变量符号相关的操作依赖于与第三变量符号相关的操作,调整包含第一变量符号的语句和包含第三变量符号的语句中的至少一个语句在所述程序代码中的位置以消除所述未定义引用。

51.根据权利要求50所述的方法,其中,所述调整是按照预定义的规则或者根据机器学习模型的预测结果而自动执行的。

52.根据权利要求50所述的方法,还包括显示经调整后的程序代码,其中所述经调整后的程序代码中的语句与所述程序代码中的语句存在一一对应的关系。

53.根据权利要求52所述的方法,其中所显示的经调整后的程序代码中的语句的顺序能够被用户手动地调整。

54.根据权利要求53所述的方法,其中在用户手动地调整所述经调整后的程序代码中的语句的顺序时选中了一语句时,向用户提示该语句可以被移动至的程序代码中的至少一个位置。

55.根据权利要求52所述的方法,其中所述经调整后的程序代码能够被编译执行或者被解释执行。

56.根据权利要求10所述的方法,其中,向用户提供可视辅助包括在图形用户界面上显示所述变量符号表,并且其中响应于用户选择了变量符号表中的变量符号,程序代码中的对应变量符号被突出显示。

57.一种计算机系统,包括:

一个或多个处理器;和

耦接到所述一个或多个处理器的存储器,所述存储器存储有计算机指令,所述计算机指令当由所述一个或多个处理器执行时使所述一个或多个处理器执行根据权利要求1至56中任一项所述的方法的操作。

58.一种计算机可读存储介质,存储有计算机指令,所述计算机指令当由处理器运行时使所述处理器执行根据权利要求1至56中任一项所述的方法。

说明书 :

用于处理程序代码中的变量的引用的方法和系统

技术领域

[0001] 本发明一般地涉及处理计算机编程领域,具体地说,涉及处理编程语言代码中的未声明、未定义、或未初始化的变量的引用的方法和系统。

背景技术

[0002] 计算机程序一般都涉及对变量的处理。在一些编程语言中,变量是对应于计算机的一块内存空间的占位符;在面向对象的编程语言中,变量也可以表现为作为某个类的实
例的对象。编程语言中对变量的操作例如可以包括声明(declare)、定义(define)、初始化
(initialize)、赋值(assignment)、访问(access)、析构(destruct)等。通常这些对于变量
的操作之间遵从严格的依赖关系。例如,无法访问一个未被初始化的变量,也无法析构一个
未被定义的变量。为了便于说明,在本申请中将对于同一个变量的存在依赖关系的两个变
量操作之中,被依赖的操作简称为对该变量的“定义”,而依赖于“定义”的变量操作称为对
该变量的“引用”。也就是说,本发明中的“定义”并不限于狭义的定义(define)操作,而是可
以包括“引用”操作可能依赖的各种操作。例如,对于C语言程序中的一个变量的引用操作
“赋值”而言,其所依赖的“定义”操作除了包括狭义的“定义”操作以外还包括“声明”操作。
[0003] 由于这种依赖关系的存在,大部分编程语言都要求在进行变量定义的代码和进行变量引用的代码之间遵从严格的位置顺序或输入顺序。这种顺序关系对于C++等编译型语
言而言,要求对变量进行定义的代码在源文件中的位置在对变量进行引用的代码之前;而
对于Python等解释型语言而言,要求对变量进行定义的代码在输入顺序上需要比对变量进
行引用的代码先输入。在现有技术中,如果违反了上述位置顺序或输入顺序,则编译或解释
执行时会报告错误。
[0004] 然而,对于某些领域特定编程语言而言,这种严格的顺序要求可能会给编程人员造成困难。例如在本申请的申请人深圳逻辑汇科技有限公司提出的用以构建电子表格模型
的领域特定语言“SMALL”中,可以通过输入代码来构建电子表格的行,并指定不同的行之间
的计算关系。此时,最直观且有利的是按照这些行在电子表格中的位置顺序来输入与这些
行对应的代码,但这种代码输入顺序无法保证对一个行(变量)进行定义的代码出现在对这
个行进行引用(例如,该变量作为等式的右值)的代码之前。在现实应用中,还经常出现
SMALL语言中出现在等式右边的变量尚没有全部被定义就需要解析SMALL语言的情形。

发明内容

[0005] 根据本公开的一个实施例,提供了一种用于处理程序代码中的变量的引用的方法。该方法包括顺序地接收用户输入中包含的字符流。所述字符流是所述程序代码的一部
分。该方法还包括从所接收的字符流中识别第一变量符号并且存储与第一变量符号相关的
信息。第一变量符号表示第一变量。该方法还包括把第一变量符号与从所述程序代码中先
前识别的至少一个变量符号进行匹配以确定所述至少一个变量符号中是否存在表示第一
变量的第二变量符号。该方法还包括响应于确定存在至少一个第二变量符号,根据与第一
变量符号相关的操作以及与所述一个或多个第二变量符号相关的操作,确定第一变量符号
是否涉及未定义引用。该方法还包括响应于确定第一变量符号涉及未定义引用,向用户提
供可视辅助来处理该未定义引用。
[0006] 根据本公开的另一个实施例,提供了一种计算机系统。该计算机系统包括一个或多个处理器和耦接到所述一个或多个处理器的存储器。所述存储器存储有计算机指令,所
述计算机指令当由所述一个或多个处理器执行时使所述一个或多个处理器执行上述的方
法的操作。
[0007] 根据本公开的又一实施例,提供了一种计算机可读存储介质。该计算机可读存储介质存储有计算机指令,所述计算机指令当由处理器运行时使所述处理器执行上述的方
法。

附图说明

[0008] 通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号
通常代表相同部件。
[0009] 图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图。
[0010] 图2示出了根据本公开的一个实施例的用于处理程序代码中的变量的引用的方法的流程图。
[0011] 图3示出了使用SMALL语言的图形用户界面编辑器的操作的示例。
[0012] 图4示出了根据本公开的一个实施例的使用SMALL语言的图形用户界面编辑器输入代码的示例。
[0013] 图5示出了根据本公开的一个实施例的变量符号表的示例。
[0014] 图6示出了根据公开的一个实施例的程序代码、变量符号表和变量表的关系示例。
[0015] 图7示出了根据本公开的一个实施例的建立变量表的过程的示例。
[0016] 图8示出了根据本公开的一个实施例的建立变量符号表和变量表之间的关系的示例。
[0017] 图9示出了根据本公开的实施例的更新变量符号表和变量表的示例。
[0018] 图10给出了根据本公开的一个实施例的根据变量符号表来更新变量表的另一个例子。
[0019] 图11示出了根据本公开的一个实施例的提供可视辅助的示例。
[0020] 图12示出了根据本公开的一个实施例的严格匹配的提示示例。
[0021] 图13示出了根据本公开的一个实施例的基于规则的匹配的提示示例。
[0022] 图14示出了根据本公开的一个实施例的模糊匹配的提示示例。
[0023] 图15示出了根据本公开的一个实施例的用户选择模糊匹配结果的示例。
[0024] 图16示出了根据本公开的一个实施例的根据匹配结果来改变变量符号的名称的示例。
[0025] 图17示出了根据本公开的一个实施例的未定义引用表的示例。
[0026] 图18示出了根据本公开的一个实施例的未定义引用表的显示示例。
[0027] 图19示出了根据本公开的一个实施例的未定义引用表的显示示例。
[0028] 图20示出了根据本公开的一个实施例的从未定义引用表删除已定义变量符号的示例。
[0029] 图21示出了根据本公开的一个实施例的利用在后的定义来执行在先的访问的示例。
[0030] 图22示出了根据本公开的一个实施例的变量符号表和变量表的显示示例。
[0031] 图23示出了根据本公开的一个实施例的变量符号表的显示示例。
[0032] 图24示出了根据本公开的一个实施例的错误更正的示例。
[0033] 图25示出了根据本公开的一个实施例的向用户显示经调整后的程序代码的示例。
[0034] 图26示出了根据本公开的一个实施例的源程序代码与经调整后的程序代码的对应关系的示例。
[0035] 图27示出了根据本公开的一个实施例的用户手动调整程序语句的顺序的示例。

具体实施方式

[0036] 本发明的发明人提出了一种在处理程序代码中的未定义的引用的系统和方法。该系统和方法可以放松传统编程语言对代码的位置顺序或输入顺序的限制。本发明例如允许
用户先输入对一个未定义的变量进行引用的代码,然后之后在任意位置输入对这个变量进
行定义的代码。本发明还允许在并非所有变量都已定义的情况下局部地解析并执行程序。
本发明还允许辅助用户调整变量定义操作代码和变量引用操作代码的顺序从而能够正确
地完成程序的编译和执行。此外,采用本公开的技术方案,系统会自动匹配对同一个变量的
定义和引用。
[0037] 这里提及的变量的“定义”操作同样使用上文所述的广义含义,即,包括“引用”操作所依赖的各种操作,不局限于狭义的定义操作,取决于引用操作的类型例如可以包括声
明、定义、赋值等。在一个C语言的例子中,对整型变量x的“访问”操作(称为引用)依赖于对
该变量x的“声明”、“定义”和“赋值”操作(为了简便均称为定义)。
[0038] 在本公开中,对变量的“定义”和“引用”是相对而言的,它们是对程序代码中的同一变量的两个操作,其中,对一个变量的“引用”操作依赖于对该变量的“定义”操作。变量的
定义和引用可以是对变量的以下操作:声明(declare)、定义(define)、初始化
(initialize)、赋值(assignment)、访问(access)、析构(destruct)等。变量的声明是程序
代码告诉编译器该变量的变量名和类型以及该变量将会被定义。变量的定义是指程序代码
告诉编译器创建一个变量,并为该变量分配一块内存空间。变量的初始化是指程序代码告
诉编译器为该变量赋予一个初始值。变量的赋值是指将一个指定值赋值给这个变量作为这
个变量的值。变量的访问是指读取或使用这个变量,包括将该变量的值赋给其他变量等。变
量的析构是指释放该变量占用的内存空间。
[0039] 在一些编程语言中,同一代码语句可以完成一个或多个变量操作。例如,在C语言中,“int a”同时完成了变量“a”的声明和定义;“int a=1”同时完成了对变量“a”的声明、
定义和初始化;而“extern int a”则仅仅在一个文件中对变量“a”进行了声明,需要在另一
个文件中对“a”进行定义;“a=1”仅仅对变量“a”进行了初始化。例如,在Python语言中,“a
=1”同时完成了对变量“a”的声明、定义和初始化。例如,在SMALL语言中,在一个表格中添
加一个名为“Revenue”的行的操作同时完成了对这个行的声明、定义和初始化。
[0040] 此外,访问一个变量是指读取该变量的地址或者值,并利用其进行某操作。例如,在C++语言中,“b=a”代表变量“a”被访问。例如,在SMALL语言中,为名为“Revenue”的变量
输入公式“Revenue={US Revenue}+{China Revenue}”,则变量“US Revenue”和“China 
Revenue”被访问,并且可以被用来进行计算“Revenue”的操作。
[0041] 在本公开中,由于“定义”和“引用”是相对而言的,所以当参照对象不同时,同一个变量操作可以是“定义”,也可以是“引用”。例如,在C++语言中,变量的初始化操作“a=1”相
对于变量的声明和定义操作“int a”而言是引用,而相对于“b=a+1”而言则是定义。
[0042] 在一些领域特定语言中,有时无法满足在对一个变量进行“引用”之前已经完成了对该变量进行“定义”的要求。例如,在SMALL语言中,按照在拟生成的电子表格中的行的顺
序输入定义不同行的代码,其中每个变量表示一个行。此时,如果希望为名为“Revenue”的
行输入了公式“Revenue={US Revenue}+{China Revenue}”,并且名为“US Revenue”和
“China Revenue”的行需要在之后才能定义,那么会出现在表示这两个行的变量被定义之
前这两个变量就被引用的情况。
[0043] 这个问题在C++和Python等语言中以另一种形式表现。在一些特殊的应用场景下,在编写例如C++语言的程序时,为了代码可读性,对变量的定义有可能会出现在对变量的引
用之后,现有技术在此时会报告编译错误。例如在Python解释器中,当先输入“b=a+1”,再
输入“a=1”并执行时,现有技术同样会报告错误。
[0044] 此外,在一些科学计算程序中,由于与数学公式的顺序一致,先执行变量的引用操作后执行该变量的定义操作的顺序可能会更符合程序编写者的思考逻辑,使得可读性更
强。
[0045] 下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方
式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的
范围完整地传达给本领域的技术人员。
[0046] 所属技术领域的技术人员知道,本发明可以实现为系统、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可以是完全的硬件、也可以是完全的软件(包括
固件、驻留软件、微代码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、“模
块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一个或多个计算机可读介质
中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。
[0047] 下面将参照本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框
的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用
计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,这些计算机程序指令
通过计算机或其它可编程数据处理装置执行,产生了实现流程图和/或框图中的方框中规
定的功能/操作的装置。
[0048] 图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图。图1显示的计算机系统/服务器12仅仅是一个示例,不应对本发明实施例的功能和使用范围
带来任何限制。
[0049] 如图1所示,计算机系统/服务器12以通用计算设备的形式表现。计算机系统/服务器12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接
不同系统组件(包括系统存储器28和处理单元16)的总线18。
[0050] 总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举
例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)
总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
[0051] 计算机系统/服务器12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机系统/服务器12访问的可用介质,包括易失性和非易失性介质,可移动的和
不可移动的介质。
[0052] 系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机系统/服务器12可以进一步包括其它可移
动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于
读写不可移动的、非易失性磁介质(图1未显示,通常称为“硬盘驱动器”)。尽管图1中未示
出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动
非易失性光盘(例如CD‑ROM,DVD‑ROM或者其它光介质)读写的光盘驱动器。在这些情况下,
每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一
个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行
本发明各实施例的功能。
[0053] 具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括——但不限于——操作系统、一个或者多个应用程序、其它程序
模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模
块42通常执行本发明所描述的实施例中的功能和/或方法。
[0054] 计算机系统/服务器12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通
信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设
备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并
且,计算机系统/服务器12还可以通过网络适配器20与一个或者多个网络(例如局域网
(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线
18与计算机系统/服务器12的其它模块通信。应当明白,尽管图中未示出,可以结合计算机
系统/服务器12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处
理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
[0055] 图2示出了根据本公开的一个实施例的用于处理程序代码中的变量的引用的方法的流程图。图2中所示的方法例如可以由图1中所示的计算机系统或服务器12来执行。图2中
所示的方法包括步骤210至250,但是这仅仅是示意性的,该方法还可以包括更多或更少的
步骤。
[0056] 图2中所示的方法开始于步骤210,在步骤210中,用户输入中包含的字符流可以被顺序地接收。所述字符流是程序代码的一部分,并且所述程序代码是以编译型语言、解释型
语言、或者用于构建电子表格模型的语言编写的。
[0057] 用户可以通过文本编辑器或图形用户界面编辑器输入全部或者部分程序代码,也可以直接读取存储在存储设备中的全部或部分程序代码。本公开中的“程序代码”可以由纯
文本代码构成,也可以由图形用户界面中用户的一组操作构成。例如,C++、Python等传统编
程语言仅接收纯文本的代码,但是SMALL语言的程序既可以是纯文本的代码,也可以是图形
用户界面中用户的一组操作。
[0058] 根据本公开的另一个实施例,所述用户输入可以包括由文本编辑器监听的用户输入动作产生的程序代码的至少一部分。在该实施例中,如果用户通过文本编辑器输入纯文
本代码,步骤210被实现为由文本编辑器监听输入设备的输入操作,将已经输入的所有字
符、光标所在的位置、和上一步操作存储在内存中,供后续步骤使用。例如当用户依次输入
以下字符“i”、“n”、“t”、“”、“x”、“=”、“aa”、“+”,文本编辑器接收这些字符并将它们连接成
字符串“int x=aa+”保存,并将光标的位置也保存。如果用户继续输入“b”、“*”、“2”,则文
本编辑器把增加的字符串“b*2”保存并且保存更新的光标位置。如果用户从后向前删除了
“2”、“*2”,则文本编辑器将删除了“*2”的字符串保存并且保存更新的光标位置。当用户手
动保存(例如通过用户按下“Ctrl+S”快捷键或用鼠标点击文本编辑器的保存按钮)时,文本
编辑器将存储于内存中的内容转存至硬盘。后续步骤(例如步骤220)可以通过读取文本编
辑器保存的字符串和光标位置来执行相应的操作。
[0059] 在根据本公开的又一个实施例中,所述用户输入可以包括通过用户在图形用户界面编辑器中的操作产生的程序代码的至少一部分。在该实施例中,如果用户使用图形用户
界面编辑器输入程序代码,例如使用图3所示的用以构建电子表格模型的图形用户界面编
辑器,则该编辑器监听图形用户界面中的用户操作,以供后续步骤使用。图3示出了使用
SMALL语言的图形用户界面编辑器的操作的示例。如图3中所示,作为本发明的一个应用场
景,使用SMALL语言的图形用户界面编辑器中包含不同的组件,用户可以通过用鼠标点击图
形用户界面的行添加组件“+row”301来添加组件302,组件302代表电子表格中的一个行。如
果在组件302中输入行的名称“Revenue”303,则该新添加的行将被命名为“Revenue”。在根
据本公开的一个实施例中,系统将用户添加行的操作(例如点击组件301)以及在组件302内
输入的字符串保存以供后续步骤使用。
[0060] 根据本公开的一个实施例,所述用户输入可以包括用户编辑完成并存储的程序代码的至少一部分。在该实施例中,系统可以直接读取由用户之前编辑并保存在存储设备中
的全部或部分程序。此时步骤210被实现为由系统将用户保存的全部或部分程序代码读入
内存,并且开始顺序地读取内存中的所述程序代码以形成字符流。
[0061] 再次参考图2,该方法进行到步骤220。在步骤220中,从所接收的字符流中识别第一变量符号并且存储与第一变量符号相关的信息。这里,第一变量符号表示第一变量。
[0062] 根据本公开的一个实施例,从所接收的字符流中识别第一变量符号可以包括利用词法分析器或者机器学习分类器中的一者或多者从所接收的字符流中识别第一变量符号。
在该实施例中,如果输入的程序代码是文本代码,则可以使用词法分析器(Lexer)逐字符扫
描文本代码,将文本字符流分解为单个字符组成的序列,然后根据词法规则识别出其中代
表变量符号的字符串。词法分析器通过有限状态机实现。例如,在扫描一个C语言代码语句
“int x=aa+b*2”时,当扫描完“int”,“x”、“=”、“aa”、“+”、“b”、“*”、“2”,有限状态机会分
别返回“keyword”(关键字)、“identifier”(标识符)、“operator”(运算符)、“identifier”、
“operator”、“identifier”、“operator”、“constant”(常量)的状态。其中,与“identifier”
对应的字符串“x”、“aa”、“b”就是变量符号。
[0063] 在该实施例中,替代地或者附加地,可以利用机器学习分类器来识别变量符号。在一个实施例中,可以使用机器学习分类器来给文本代码中的子字符串打分。如果分数大于
预定阈值,则认为该子字符串是一个变量符号。例如,在SMALL语言的代码中,如果以文本方
式输入“Revenue=US Revenue+China Revenue”,则分类器会给“Revenue”、“US Revenue”、
“China Revenue”这些子字符串打出较高的分数并且将它们识别为变量符号。
[0064] 根据本公开的一个实施例,从所接收的字符流中识别第一变量符号可以包括把从图形用户界面编辑器的特定组件中接收的字符流识别为第一变量符号。在该实施例中,如
果用户通过图形用户界面输入程序代码,则识别变量符号的过程可以只部分地使用或者不
使用词法分析。例如,可以将用户在特定图形用户界面组件中输入的内容识别为变量符号。
图4示出了根据本公开的一个实施例的使用SMALL语言的图形用户界面编辑器输入代码的
示例。如图4中所示,当用户在一个行组件401中的栏402中输入“Revenue”时,“Revenue”将
被识别为一个类型为“行”的变量符号。在图形用户界面编辑器中同样也可以使用词法分析
器或机器学习分类器来识别变量符号。例如,如果在图4所示的行组件401中的等号右侧的
公式输入栏中输入“{US Revenue}+{China Revenue}”(403,404),则词法分析器可以将大
括号内的内容识别为变量符号;而如果在公式输入栏中输入“US Revenue+China 
Revenue”,则机器学习分类器可以将“US Revenue”和“China Revenue”识别为变量符号。
[0065] 根据本公开的一个实施例,与变量符号相关的信息可以包括以下信息中的一者或多者:变量符号的名称、变量符号在程序代码中的位置、变量符号的命名空间、变量符号的
作用域、变量符号表示的变量的类型、变量符号表示的变量、以及与变量符号相关的操作。
[0066] 变量符号的名称是指代表这个变量符号的字符串,例如在上面的例子中,“x”、“aa”、“b”、“Revenue”、“US Revenue”、“China Revenue”都是变量符号的名称。在识别出变
量符号的同时,得到了变量符号的名称。
[0067] 变量符号在程序代码中的位置是指能够在程序代码中定位到该变量符号的信息。对于文本形式的程序代码,变量符号在程序代码中的位置可以使用表示该变量符号在程序
代码中的位置的元组来表示,例如(8,10,3)代表该变量符号是程序代码中第8行第10个字
符起的3个字符。对于图形用户界面的程序代码,变量符号在程序代码中的位置可以通过输
入了该变量符号的组件的位置获得。
[0068] 根据本公开的一个实施例,一个程序中的所有变量符号可以被分组,每一个组归属于一个命名空间或一个作用域,在不同命名空间或不同作用域中拥有同样名称的两个变
量符号实际上代表不同的变量。例如,对于C程序代码,如果输入“int a=1;”,之后又输入
“int f(){int a=2}”,则程序代码中有两个名称为“a”的变量符号,但前者归属于文件作
用域,后者归属于“f()”函数内的作用域,所以它们代表两个不同的变量。命名空间的概念
类似于作用域,也是指代变量符号归属的分组的一种方式。例如,在C语言中,可以用命名空
间进一步区分相同作用域的相同名称的变量符号。例如对于C语言中的两个命名空间
“namespaceA”和“namespaceB”,两个变量符号“namespaceA::a”和“namespaceB::a”指代的
变量名称都为“a”,但是由于它们归属于不同的命名空间,所以代表两个不同的变量。例如,
在SMALL语言的程序代码中,如果在一个名为“Revenue Breakup”的表中添加了一个行
“Revenue”,又在一个名为“Income Statement”的表中添加一个行“Revenue”,那么这两个
名称都是“Revenue”的变量符号归属于不同的命名空间。即,前者归属于表“Revenue 
Breakup”内的命名空间,而后者归属于表“Income Statement”内的命名空间。
[0069] 根据本公开的一个实施例,对于文本形式的程序代码,命名空间可以通过对该变量符号的上下文进行语法分析而获得。所述语法分析是根据语法规则,将词法分析得到的
标记序列(Tokens)构建为解析树(Parse Tree)或抽象语法树(Abstract Syntax Tree)或
其他层级数据结构中的至少一种。该数据结构中记录了变量符号之间的从属和依赖关系以
及命名空间等信息。此外,变量符号的作用域、变量符号表示的变量的类型也可以通过对该
变量符号的上下文进行语法分析而获得。
[0070] 根据本公开的一个实施例,对于图形用户界面的程序代码,命名空间可以通过建立该变量时的图形用户界面组件的信息获得。例如,变量符号的命名空间可以根据输入了
该变量符号的组件与其它组件的结构关系获得。或者变量符号的命名空间可以根据用户指
定的该变量符号的路径获得。与变量符号的命名空间类似,变量符号的作用域可以通过输
入了该变量符号的组件与其它组件的结构关系获得。
[0071] 根据本公开的一个实施例,与变量符号相关的操作包括以下的至少一者:声明、定义、初始化、赋值、访问、以及析构。与变量符号相关的操作指的是对变量符号代表的变量的
操作。对于文本形式的程序代码,与变量符号相关的操作可以通过对该变量符号的上下文
进行语法分析而获得。例如,在C语言中,“int x=aa+b*2”中的“x”由于前面有关键词
“int”,后面跟着一个表达式“=aa+b*2”,所以这行代码对变量符号“x”所代表的变量进行
了声明、定义和初始化。例如,对于图形用户界面的程序代码,与变量符号相关的操作可以
通过用户在图形用户界面编辑器中的相应操作获得。如图3所示,例如通过点击行添加组件
301并输入“Revenue”303从而添加一个名称为“Revenue”的行(即变量),这一系列操作代表
对这个行进行了声明和定义。如图4所示,在行401的等号右侧的公式输入框中输入“US 
Revenue”403和“China Revenue”404的操作则代表了对这两个变量的访问。
[0072] 此外,对于图形用户界面的程序代码,变量符号表示的变量的类型可以通过创建该变量时的组件的信息获得。例如,如图3所示,在创建行“Revenue”时,由于点击了行添加
组件301,所以变量“Revenue”的类型为行。
[0073] 这里,第一变量符号是指方法此时正在识别的变量符号。在第一变量符号之前可能已经识别了在程序代码中位于第一变量符号之前的其他变量符号。在步骤220中存储与
第一变量符号相关的信息时,与第一变量符号相关的信息被存储到一个数据结构中。在一
个实施例中,该数据结构可以是一个表格,在下文中为了便于描述该表格将被称为变量符
号表。该变量符号表存储有与程序代码中的每个识别的变量符号相关的信息。
[0074] 变量符号表用于存储在步骤220中识别的变量符号及其相关信息。在识别了一个变量符号后,系统将该识别的变量符号及其相关信息存储至变量符号表。如果变量符号表
不存在,则先建立变量符号表,再将识别的变量符号及其相关信息存入变量符号表。在一个
实现中,创建变量符号表的过程为:向操作系统申请存储空间并在该存储空间中建立变量
符号表数据结构。在对变量符号表的操作过程中,如果变量符号表的存储空间不足,则动态
地向操作系统申请更多的存储空间以存储新增的内容。根据本公开的一个实施例,可以通
过变量符号的名称的哈希值在变量符号表中建立索引。变量符号表中的每一个变量符号都
对应于一个哈希值,根据哈希值建立树状索引,并存储在变量符号表中。图5示出了根据本
公开的一个实施例的变量符号表的示例。在变量符号表中,如果代表同一个变量的变量符
号在程序代码中出现多次,则它们在变量符号表中对应多个条目。例如,如图5所示,以图5
左侧的程序代码作为输入,可以依次识别出变量符号“a”、“a”、“b”、“a”、“c”,并存储在图5
右侧示出的变量符号表中。例如,图5中的变量符号“a”在程序代码中出现了三次,它在变量
符号表中也被对应地记录了三次,参见id为1、2和4的条目。本领域技术人员可以理解,图5
中的变量符号表仅仅是示意性的,它还可以包括其他列,例如变量符号在程序代码中的位
置、变量符号的命名空间、变量符号的作用域、变量符号表示的变量的类型、变量符号表示
的变量、以及与变量符号相关的操作等。对于下文中出现的其他示意性变量符号表也是如
此。
[0075] 尽管图5示出了表格形式的变量符号表,但是本发明不应局限于此。例如,变量符号表也可以采用其他数据结构,例如链表、数据库等。
[0076] 现在返回参照图2,在步骤230中,第一变量符号与从所述程序代码中先前识别的至少一个变量符号被进行匹配,以确定所述至少一个变量符号中是否存在表示第一变量的
第二变量符号。步骤230的目的是把当前识别的变量符号与先前识别的各个变量符号进行
比较,以确定哪个或哪些先前识别的变量符号与当前识别的变量符号表示同样的变量。这
里,第二变量符号是指先前已识别的并记录在变量符号表中的也表示第一变量的变量符号
之一。
[0077] 根据本公开的一个实施例,响应于与变量符号相关的信息被存储到变量符号表中,可以通过所述索引把该变量符号与先前存储的变量符号进行匹配。例如,当通过变量符
号名称的哈希值建立索引时,可以计算当前识别的变量符号名称的哈希值,并通过索引搜
索变量符号表中与当前识别的变量符号名称类似的变量符号名称,并进行匹配。
[0078] 根据本公开的一个实施例,在步骤230中,响应于与变量符号相关的信息被存储到变量符号表中,把该变量符号与先前存储的变量符号逐个进行匹配。也就是说,针对新识别
的第一变量符号,将它与变量符号表中的每一条目进行比较,确定它们是否表示同一个变
量。这种匹配例如可以是严格匹配、规则匹配、或者模糊匹配。
[0079] 根据本公开的一个实施例,把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配可以包括:当所存储的第一变量符号和所述至少一个变量符号中的
第二变量符号的名称、命名空间、作用域、以及表示的变量的类型都相同时,确定第一变量
符号和第二变量符号表示同一变量。在该实施例中,可以采用严格匹配。当且仅当两个变量
符号的命名空间、作用域、名称、类型都相同时,确定这两个变量符号匹配。例如,在C语言的
代码中,如果同时输入“int a=1;”和“void f(){int global a=2};”,则这两个名称为
“a”的变量符号都属于默认命名空间以及文件作用域,所以它们可以被严格匹配。例如,在
SMALL语言中,在同一个表格下先分别建立“Revenue”、“US Revenue”、“China Revenue”三
个行,并输入公式“Revenue={US Revenue}+{China Revenue}”,则两个名为“US Revenue”
的变量符号属于同一命名空间,所以它们可以被严格匹配。
[0080] 根据本公开的一个实施例,把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配可以包括:当第一变量符号和所述至少一个变量符号中的多个第二
变量符号的名称相同时,根据预定义的规则确定第一变量符号和哪个第二变量符号表示同
一变量。在该实施例中,可以采用基于规则的匹配。该预定义的规则可以包括将第一变量符
号和距离其最近的相同名称的第二变量符号匹配为表示同一变量。例如,在SMALL语言中,
如果在“Revenue”行中输入公式“={US Revenue}+{China Revenue}”,但是在同一命名空
间中建立过两个名为“US Revenue”的行。这里,把这三个变量符号分别称为“US Revenue
[1]”、“US Revenue[2]”、“US Revenue[3]”。那么可以确定“US Revenue[2]”和“US Revenue
[3]”代表的行哪一个距离“Revenue”这一行更近,将更近的行确定为与“US Revenue[1]”匹
配。上述规则示例基于行之间的距离,但是本发明不限于此,还可以规定其他的规则,例如
基于行建立时间先后的规则、基于空值较少的规则等等。
[0081] 根据本公开的一个实施例,把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配可以包括:当与第一变量符号相关的信息和与所述至少一个变量符
号中的第二变量符号相关的信息之间的相似度高于阈值时,提示用户确认第一变量符号和
第二变量符号是否表示同一变量。在该实施例中,可以采用模糊匹配,从而即使不同名称的
变量符号之间也可以被匹配。例如,在SMALL语言中,如果用户建立了一个名为“Sales”的
行,又在其他行的公式栏中输入“={Revenue}”,则基于自然语言识别的匹配,建议将
“Revenue”这一变量符号和“Sales”这一变量符号匹配,并提示用户确认。模糊匹配的一种
实现是对任何一个变量符号计算其对应的词向量,根据两个变量符号的词向量之间的距离
计算两个变量符号之间的相似度,将相似度高于一阈值的两个变量符号确定为匹配。另一
种实现是根据两个变量符号之间的编辑距离来计算相似度。例如,对于变量符号“Revenue”
和变量符号“revenue”,只是首字母不同,且首字母之间的区别仅是大小写区别,那么可以
通过对比两个变量符号中相同字符的比例,得出变量符号之间的编辑距离从而计算相似
度。因此,上述两个变量符号之间的相似度较高,可以向用户发出提示进行确认是否匹配。
[0082] 在以上的例子中,相似度是基于变量符号的名称的编辑距离或词向量距离计算。在根据公开的另一实施例中,所述相似度可以通过以下的一者或多者得到:变量符号名称
之间的编辑距离、变量符号名称之间的语义相似度、变量符号命名空间之间的相似度、变量
符号作用域之间的包含关系、以及变量符号在所述程序代码中的位置之间的距离。
[0083] 返回参照图2,方法继续进行到步骤240,在步骤240中,响应于确定存在至少一个第二变量符号,根据与第一变量符号相关的操作以及与所述一个或多个第二变量符号相关
的操作,确定第一变量符号是否涉及未定义引用。
[0084] 根据本公开的一个实施例,为了识别程序代码中有哪些变量,还可以建立变量表并且建立变量符号表和变量表之间的关系。在另一个实施例中,不需要建立单独的变量表,
而可以使用同一个数据结构来保存变量符号和变量,例如可以使用表格、链表等。为了便于
说明,以下基于分别维护变量表和变量符号表的实施例进行描述。变量表用于存储变量符
号所指代的变量。在步骤220完成后如果变量表不存在,则先建立变量表,再将变量符号指
代的变量存入变量表。变量符号和变量是不同的,在程序代码中,每一个变量都至少被一个
变量符号指代,但是在本公开中,并非每个变量符号都指向一个变量。例如,在C语言中,如
果仅写“x=1”却没有声明过“x”,则“x”这个变量符号并未指向一个变量。对于C语言代码,
可以用变量的内存地址表示变量;对于SMALL语言,由于每个变量都对应于电子表格的层级
结构中的某个层级,可以用这个层级的唯一ID表示该变量。图6示出了根据公开的一个实施
例的程序代码、变量符号表和变量表的关系示例。如图6所示,本发明在变量表中设定了一
种特殊的变量类型,称为空变量。如果变量符号代表的变量尚未定义,则在变量表中添加一
个类型为空(null)的变量。例如,在图6中的语句“int b=a+c;”601中,变量“c”未定义,那
么在变量表中添加类型为空的变量c602。变量表中可以有多个类型为空的变量,它们具有
不同的id。变量的id可以是自动分配的序号,也可以是变量的地址。
[0085] 根据本公开的一个实施例,变量表存储所识别的变量的状态,并且变量的状态包括以下一者或多者:表示该变量的变量符号、变量在内存中的地址、变量进行的操作、变量
是否被定义、以及变量是否被引用。
[0086] 本领域技术人员可以理解,图6中的变量表仅仅是示意性的,它还可以包括其他列,例如表示该变量的变量符号、变量在内存中的地址、变量进行的操作、变量是否被定义、
以及变量是否被引用等。对于下文中出现的其他示意性变量表也是如此。
[0087] 变量进行的操作可以是声明、定义、初始化、赋值、访问、析构中的一者或多者。由于在程序代码中同一个变量可能被多个变量符号指代,这些变量符号在程序代码中的不同
位置可能进行了不同的操作,所以“变量进行的操作”可能与“与变量符号相关的操作”不
同。图7示出了根据本公开的一个实施例的建立变量表的过程的示例。如图7所示,例如,在
SMALL语言中,参见图7的上部,先输入“Revenue={US Revenue}+{China Revenue}”701,此
时对于变量符号表中的“US Revenue”条目702和变量表中的“US Revenue”条目703,“操作”
都是“访问”。但是,参见图7的下部,在建立了“US Revenue”704这一行后,变量符号表中有
两个名称为“US Revenue”的变量符号705和706,对应的“操作”分别是“访问”和“声明,定
义,赋值”,这两个变量符号对应的变量相同,都是变量表中的“US Revenue”703。这个变量
的“操作”是“声明,定义,赋值,访问”707。
[0088] 根据本公开的一个实施例,所述变量表中的一个变量进行的操作等于与表示该变量的至少一个变量符号中的每个变量符号相关的操作的并集。也就是说,以图7为例,变量
表的条目703中的操作707等于与表示该变量的每个变量符号相关的操作的并集。也就是
说,条目703中的操作707“声明,定义,赋值,访问”是条目705的操作“访问”和条目706的操
作“声明,定义,赋值”的并集。图10给出了根据本公开的一个实施例的根据变量符号表来更
新变量表的另一个例子。变量表中的变量的操作由与之相关的所有变量符号的操作决定。
如图10所示,如果变量“a”1007对应变量符号表中的id为1、2、4的变量符号1001、1002、
1003,并且它们进行的操作分别是“声明、定义”1004、“赋值”1006、“访问”1005,则变量“a”
进行的操作为“声明、定义、赋值、访问”。
[0089] 根据本公开的一个实施例,可以根据所述并集中包括的操作来判断该变量是否被定义。由于“定义”和“引用”是相对而言的,“变量是否被定义”和“变量是否被引用”这两个
状态需要对应于一个特定的场景。这两个状态是根据本发明设置的标志位,可以由布尔值
表示。在一个实施例中,可以规定如下的适应不用场景的这两个标志的判断方式。
[0090] 表1
[0091]
[0092]
[0093] 表1中的操作指的是变量表中的变量的操作。例如,对于C语言的程序代码,如果变量x在变量表的操作中包含了“访问”,则标志位变量被引用为“真”;此时如果变量x在变量
表的操作中缺少了“声明”、“定义”和“赋值”中的任一个,则说明该变量未准备好(以下称为
未定义),那么标志位“变量被定义”为“假”。在“变量被定义”为假且“变量被引用”为真的情
况下,确定了该变量x涉及未定义引用。
[0094] 在步骤240中假定匹配到与第一变量符号表示同一变量的至少一个第二变量符号。在根据本公开的另一个实施例中,当确定不存在第二变量符号时,根据与第一变量符号
相关的操作,确定第一变量符号是否涉及未定义引用。在此情况下,第一变量符号是首个识
别的表示第一变量的变量符号,之前没有识别出表示第一变量的其他变量符号。例如,图7
中的变量符号“US Revenue”702就属于这种情况,因为在该变量符号之前仅识别了id为1的
变量符号“Revenue”。此时,变量表中的变量“US Revenue”703的操作与变量符号表中的变
量符号“US Revenue”702的操作相同,都是访问(access)。而从以上的表1中可知,在SMALL
语言的情况下,由于变量“US Revenue”703的操作不包括定义,却包括访问,所以标志位“变
量被定义”为假且标志位“变量被引用”为真,从而确定了新识别的变量符号“US Revenue”
702涉及未定义引用。
[0095] 根据本公开的一个实施例,在建立变量符号表和变量表之间的关系时,对于变量符号表中的每个变量符号,存储其表示的变量表中的变量;对于变量表中的每个变量,存储
能表示它的变量符号表中的变量符号。在一个实现中,如果一个变量符号A指代的变量为
空,则在变量表中建立一个空变量B,并建立变量符号A和空变量B之间的关系。例如,在变量
符号表中的变量符号A的条目的“变量符号表示的变量”字段中存储变量B在变量表中的位
置或ID,并且在变量表中的变量B的条目的“表示该变量的变量符号”字段中存储变量符号A
在变量符号表中的位置或ID。例如,在C语言的程序代码中,如果没有声明“x”而直接输入“x
=1”,则“x”这一变量符号就指向变量表中的一个类型为空的变量。图8示出了根据本公开
的一个实施例的建立变量符号表和变量表之间的关系的示例。如图8所示,在SMALL语言中,
如果之前没有构建“US Revenue”这一行,而直接输入“Revenue={US Revenue}+{China 
Revenue}”,则“US Revenue”这一变量符号也指向变量表中的一个类型为空的变量。在根据
本公开的一个实施例中,空变量的特征是,该变量在变量表中的类型为空,其他所有属性与
正常变量相同。
[0096] 返回参照图2,在步骤250中,响应于确定第一变量符号涉及未定义引用,向用户提供可视辅助来处理该未定义引用。
[0097] 根据本公开的一个实施例,向用户提供可视辅助包括以下的一者或多者:在文本编辑器或图形用户界面编辑器中,在第一变量符号的附近显示提示框、或者突出显示第一
变量符号。当用户输入的被引用的变量符号在变量表中对应的变量的状态为“未定义引用”
(即,“变量被定义”标志位为假且“变量被引用”标志位为真)时,系统向用户进行提示。在不
同的实现中,系统可以有不同的提示方式。在一个实现中,当输入光标离开当前输入行,而
该输入行的内容中的某被引用变量未被定义时,系统在该变量附近弹出提示框提示用户该
变量涉及未定义引用。该提示框可以在一定时间内自动消失。提示框消失后,涉及未定义引
用的变量符号的名称可以以特殊方式显示,例如,该变量符号名称的颜色、字体、大小、背景
中的至少一项与正常变量的名称不同,以此区分正常变量符号与涉及未定义引用的变量符
号。图11示出了根据本公开的一个实施例的提供可视辅助的示例。如图11所示,例如用户在
某行输入了“int x=aa+b*2;”1102,然后输入光标移动至下一行,而变量符号“aa”在变量
表中对应的变量尚未被定义。此时系统在变量符号“aa”右上角弹出提示框,提示“未定义”
1101。例如在三秒后该提示框消失,变量符号的名称“aa”的背景颜色变为了浅灰色1103,区
别于正常变量符号。
[0098] 根据本公开,用户输入的程序代码被顺序的识别,所以图2所示的方法被循环地执行从而顺序地识别程序代码中的各个变量标识符。
[0099] 根据本公开的一个实施例,在确定第一变量符号涉及未定义引用之后,图2中的方法可以进一步包括从所接收的字符流中继续识别第三变量符号并且存储与第三变量符号
相关的信息,其中第三变量符号表示第一变量。以图7为例进行说明,例如,在识别了涉及未
定义引用的变量符号“US Revenue”702之后,用户继续输入了“US Revenue=$567,890”
704,其中“US Revenue”702对应于第一变量符号,“US Revenue”704对应于第三变量符号。
[0100] 该方法还包括把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配以确定所述至少一个变量符号中是否存在表示第一变量的变量符号。该匹配过
程包括把第三变量符号与先前识别的各变量符号进行匹配以确定是否有表示同一变量的
先前识别的变量符号,这与对第一变量符号进行匹配的过程相同,例如可以是严格匹配、规
则匹配、或者模糊匹配。
[0101] 根据本公开的一个实施例,在进行模糊匹配时,无论是用第一变量符号来匹配第二变量符号的过程,还是用第三变量符号来匹配第一变量的过程,当提示用户确认两个变
量符号是否表示同一变量时,如果用户确认表示同一变量时,则在变量符号表中把新识别
的变量符号表示的变量存储为与所匹配的变量符号表示的相同的变量。根据本公开的另一
个实施例,当用户确认表示同一变量时,将这两个变量符号的名称和命名空间改成相同。
[0102] 该方法还包括通过所述匹配至少找到与第三变量符号均表示第一变量的第一变量符号。以图7为例进行说明,例如,通过上述的匹配找到了与变量符号“US Revenue”704对
应的变量符号“US Revenue”702。此时,更新变量表中的条目703以把其类型从“null”修改
为“row”并且把该条目703的操作707修改为所匹配的两个变量符号702和704的操作的并
集。
[0103] 该方法还包括在确定与第一变量符号相关的操作依赖于与第三变量符号相关的操作的情况下,至少利用与第三变量符号相关的操作来执行与第一变量符号相关的操作。
从表1中可以得到,与第一变量符号相关的操作依赖于与第三变量符号相关的操作包括以
下的至少一者:对第一变量符号的访问依赖于对第三变量符号的定义,对第一变量符号的
访问依赖于对第三变量符号的声明、定义或赋值、对第一变量符号的赋值依赖于对第三变
量符号的声明或定义、以及对第一变量符号的析构依赖于对第三变量符号的声明或定义。
根据本公开的一个实施例,由于第三变量符号的识别导致了第三变量符号所表示的变量的
状态“变量被定义”从假变为真,从而该变量不再涉及未定义引用。所以可以基于此来确定
与第一变量符号相关的操作依赖于与第三变量符号相关的操作。以图7为例进行说明,例
如,由于在后输入的“US Revenue=$567,890”给出了变量“US Revenue”的定义,所以变量
“US Revenue”不再涉及未定义引用。图21示出了根据本公开的一个实施例的利用在后的定
义来执行在先的访问的示例。如图21所示,在输入行“Product Sales={iPhone Sales}+
{iPad Sales}+{Mac Sales}”时,由于等式右侧的变量符号“iPhone Sales”、“iPad 
Sales”、“Mac Sales”都未被定义,所以它们都涉及未定义引用。在继续输入了三个行
“iPhone Sales=$23,456”、“iPad Sales=$23,456”、“Mac Sales=$23,456”后,完成了对
这三个变量符号表示的变量的定义。这里,变量的在后的定义操作被利用以执行在前的访
问操作,从而使得“Product Sales”可以通过这些访问操作而取得值“$70,368”(参见图21
中右侧的表格)。
[0104] 根据本公开的一个实施例,变量符号表中变量符号表示的变量可以根据新变量符号的匹配而被更新。图9示出了根据本公开的实施例的更新变量符号表和变量表的示例。如
图9所示,如果变量符号表中的变量符号“c”902成功匹配至变量符号“c”901,并且变量符号
“c”902指向变量表中的变量“c”904,变量符号“c”901指向变量表中的一个空变量“c”903,
则可以将变量表中的空变量“c”903删除,并且使变量符号表中的变量符号“c”901指向变量
表中的变量“c”904,并且使变量表中的变量“c”904指向变量符号表中的变量符号“c”901。
根据本公开的另一个实施例,变量符号表的变量符号“c”902是新输入的变量符号,当它成
功匹配至变量符号“c”901后,可以直接使变量符号“c”902指向变量表中的空变量“c”903并
且使空变量“c”903指向变量符号“c”902,此外,将空变量“c”903的类型从“null”修改为
“int”。此实施例不需要建立或删除任何空变量。
[0105] 根据本公开的一个实施例,对于Python和C++等对执行顺序有强要求的语言,处理未定义引用包括生成第二程序代码,第二程序代码相对于原程序代码调整了包含表示第一
变量的一个或多个变量符号的语句在程序代码中的位置,以使得调整后的第二程序代码中
对变量的操作顺序符合程序设计语言所要求的顺序。根据该实施例,在确定第一变量符号
涉及未定义引用之后,图2中的方法可以进一步包括从所接收的字符流中继续识别第三变
量符号并且存储与第三变量符号相关的信息,其中第三变量符号表示第一变量。该方法还
包括把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配从而确
定所述至少一个变量符号中是否存在表示第一变量的变量符号。以上步骤与上文所述的对
应步骤的执行是相同的。该方法还包括通过所述匹配至少找到与第三变量符号均表示第一
变量的第一变量符号,以及响应于确定与第一变量符号相关的操作依赖于与第三变量符号
相关的操作,调整包含第一变量符号的语句和包含第三变量符号的语句中的至少一个语句
在所述程序代码中的位置以消除所述未定义引用。以下面的C语言的程序代码A为例进行说
明。
[0106] int a;
[0107] a=1;
[0108] c++;
[0109] int b=a+c;
[0110] int c=0;
[0111] c=2;
[0112] 对于上述的原程序代码A,根据本公开的方法,首先会确定“c++”中的“c”和“int b=a+c”中的“c”(第一变量符号)涉及未定义引用,然后会确定“int c=2”中的“c”以及“c=
2”中的“c”(第三变量符号)与上述的涉及未定义引用的变量符号匹配,在此情况下,可以利
用与第三变量符号相关的操作“声明、定义、赋值”来执行与第一变量符号相关的操作“c++”
和“int b=a+c”,即“访问”。
[0113] 此时,需要将包含表示第一变量的变量符号的语句“c++”、“int b=a+c”、“int c=0”、“c=2”在程序代码中的位置进行调整,以生成如下的第二程序代码B或C:
[0114] 表2
[0115]
[0116] 根据本公开的一个实施例,所述经调整后的程序代码能够被编译执行或者被解释执行。如上面的例子所示,经调整后的两种程序代码B和C中对变量c的操作顺序都符合C语
言所要求的顺序,从而可以被编译并执行。根据本公开的一个实施例,所述经调整后的程序
代码中的语句与所述程序代码中的语句存在一一对应的关系。此外,还可以通过图形用户
界面向用户显示经调整后的程序代码。在一个实施例中,在图形用户界面上,可以同时显示
第一程序代码和第二程序代码。图25示出了根据本公开的一个实施例的向用户显示经调整
后的程序代码的示例。如图25所示,原程序代码2701经调整后生成第二程序代码2702,第二
程序代码2702中的每一行与原程序代码2701中内容相同的行一一对应。例如,第二程序代
码2702中的“int c=0;”行2704对应于原程序代码2701中“int c=0;”行2703。
[0117] 根据本公开的一个实施例,当用户选择原程序代码中的一个语句时,第二程序代码中的相应的语句被高亮显示;并且当用户选择第二程序代码中的一个语句时,原程序代
码中的相应的语句被高亮显示。图26示出了根据本公开的一个实施例的源程序代码与经调
整后的程序代码的对应关系的示例。如图26所示,当用户点击第二程序代码中的“int c=
0;”行2802时,原程序代码中相应的”int c=0;”行2801被高亮显示。
[0118] 根据本公开的一个实施例,所述调整是按照预定义的规则或者根据机器学习模型的预测结果而自动执行的。在按照预定义的规则调整程序代码行的位置的实施例中,例如
可以将包含对变量的声明的操作的语句(例如“int c=0”)调整至所有包含表示该变量的
变量符号的语句之前,即,调整到“c=2;”、“c++;”、“int b=a+c;”的前一行。在根据机器学
习模型的预测结果来调整程序代码行的位置的实施例中,可以构建预测未定义引用在第二
程序代码中的位置的机器学习模型。例如,该机器学习模型可以是一个循环神经网络,该循
环神经网络按照顺序输入原程序代码的每一行语句,提取每一行语句中的变量符号、变量
符号表示的变量、对该变量符号进行的操作、变量符号对应的位置、该语句在程序代码中的
位置、该语句是否包含未定义引用等特征,根据这些特征预测原程序代码中的每一行语句
在第二程序代码中的位置,并根据机器学习模型的预测结果生成第二程序代码。例如,在上
面的例子中,由于“int c=0;”语句在声明变量的同时对变量进行了定义与赋值,根据机器
学习的结果,此时紧接着出现对这个变量重新赋值的操作“c=2”的概率要小于访问这个变
量的操作“c++”的概率。基于该预测,应生成上述的程序代码C。
[0119] 根据本公开的一个实施例,所显示的经调整后的程序代码中的语句的顺序能够被用户手动地调整。如果用户对于系统自动对程序语句的顺序的调整不满意,那么用户可以
在交互界面上手动地更改存在未定义引用的语句在第二程序代码中的位置。具体而言,在
图形用户界面中可以同时显示原程序代码和第二程序代码,并将原程序代码中包含涉及未
定义引用的变量符号的语句高亮显示,用户可以在第二程序代码中手动地调整这些高亮显
示的语句的位置。
[0120] 根据本公开的一个实施例,在用户手动地调整所述经调整后的程序代码中的语句的顺序时选中了一语句时,向用户提示该语句可以被移动至的程序代码中的至少一个位
置。图27示出了根据本公开的一个实施例的用户手动调整程序语句的顺序的示例。如图27
所示,假定图27的右上角为系统自动生成的第二程序代码B,但是用户对该调整结果不满
意。此时,用户选择程序语句“c=2”2902,则“c=2”在原程序代码中对应的语句2901被高亮
显示。根据本公开的一个实施例,当用户选择了第二程序代码中的一程序语句时,向用户提
示该程序语句可以被移动至的可能位置。例如,在图27中,当选择了第二程序代码中的“c=
2”2902时,其可以被移动至的多个位置2903被显示。此时,用户可以拖拽语句“c=0”将其手
动调整至目标位置2904。从而,系统自动生成的程序代码B,被用户手动地调整为程序代码
C。
[0121] 根据本公开的一个实施例,当存在与新识别的变量符号的名称之间的相似度高于阈值的多个在先的变量符号时,按照相似度的降序在列表中向用户显示所述多个在先的变
量符号。该过程对于把第一变量符号与第二变量符号进行模糊匹配以及把第三变量符号与
第一变量符号进行模糊匹配而言是相同的。如上所述,如果在匹配变量符号时采用模糊匹
配,需要给用户以提示。例如,当将“Revenue”和“Sales”进行匹配时,需要向用户展示提示
框。在一些实现中,当有多个模糊匹配的备选项时,可以显示提示框供用户选择。此时,可以
建立一个临时表,把与一个变量符号的相似度(例如,名称的相似度)较高的多个变量符号
至该临时表中。在一些实现中,可以设定一个相似度的阈值,当变量符号的名称之间的相似
度超过该阈值时,将匹配的变量符号添加至该临时表。系统对临时表中的所有变量符号排
序,排序的一种方式是依据相似度,由高至低进行排序。然后,将该有序临时表的部分或全
部变量符号展示给用户。例如,在一个应用场景中,与变量符号“Revenue”相似度较高的变
量符号有“Total Revenue”,“Revenue per User”,“revenue”,“Revenue”,“Sales”,“Cost 
of Revenue”,该临时表中排序后的结果是“Revenue”,“Total Revenue”,“revenue”,
“Revenue per User”,“Sales”,“Cost of Revenue”。如果选择只将排序后的临时表中的一
部分展示给用户,则展示的部分可以是“Revenue”,“Total Revenue”,“revenue”。
[0122] 在一些实现中,用户可以手动确认或修改变量符号匹配结果。对于模糊匹配的变量符号,用户可以在模糊匹配结果的提示框中选定一个模糊匹配结果,确认与当前输入的
变量符号匹配。图15示出了根据本公开的一个实施例的用户选择模糊匹配结果的示例。如
图15所示,例如,用户输入了变量“Revenue”,展示的模糊匹配结果1501中的变量符号包括
“Total Revenue”,“revenue”,“Revenue per User”,“Sales”,“Cost of Revenue”。用户可
移动光标1502,并按“Enter”键选择一个变量符号,也可使用鼠标1504点击提示框中的变量
符号1503。当用户选择了变量符号“revenue”1503后,系统将“revenue”与当前输入的变量
符号“Revenue”匹配。
[0123] 根据本公开的一个实施例,响应于用户选择了列表中的所述多个匹配的变量符号中的一个,所述程序代码中的当前输入的变量符号的名称被修改为所选择的匹配的变量符
号的名称。根据本公开的另一个实施例,响应于用户选择了列表中的所述多个匹配的变量
符号中的一个,确认当前输入的变量符号与所选择的变量符号表示同一变量,并且提示用
户统一当前输入的变量符号与所选择的变量符号的名称。在一些实现中,系统会提示用户
修改变量符号的名称使得能够严格匹配。图16示出了根据本公开的一个实施例的根据匹配
结果来改变变量符号的名称的示例。例如,在图16中,如果用户选择了提示框中的变量符号
“revenue”1603,“revenue”中的“r”被高亮显示1602。当前输入的变量符号“Revenue”中的
“R”也被高亮显示1601。此时,如果用户按下“Tab”键,则当前输入的变量符号被修改为
“revenue”1604;而如果用户按下“Shift+Tab”键,则所选择的变量符号“revenue”会被修改
为当前输入的变量符号“Revenue”1605。
[0124] 当用户输入的变量符号与变量表中的其他变量符号匹配成功时,系统对用户进行提示。根据匹配方式不同,系统提示方式不同。根据本公开的一个实施例,当确定当前输入
的变量符号与先前识别的变量符号表示同一变量时,向用户进行提示。当匹配结果是严格
匹配的结果时,系统自动将这两个变量符号指向变量表中的同一个变量,并提示用户系统
已自动匹配这两个变量符号。图12示出了根据本公开的一个实施例的严格匹配的提示示
例。如图12所示,例如当前输入的程序代码为“int x=aa+b*2;”1202中的变量符号“aa”和
之前输入的“int aa=3;”中的变量符号“aa”严格匹配时,系统自动将变量符号表中的这两
个变量符号指向变量表中的同一个变量。然后,在当前输入的变量符号“aa”附近弹出提示
框,提示框中的内容为“匹配int aa=3;”1201。消息框中的“aa”可以被高亮显示,例如在三
秒后消息框可以淡出消失。当进行基于规则的匹配时,系统仍然可以自动将这两个变量符
号指向变量表中的同一个变量,并提示用户系统已自动依据规则匹配了这两个变量符号。
图13示出了根据本公开的一个实施例的基于规则的匹配的提示示例。如图13所示,例如,在
SMALL语言中,如果在第32行“Revenue”行中输入公式“={US Revenue}+{China Revenue}”
1301,但是同一命名空间中建立过两个名为“US Revenue”的行(上述三个变量符号分别称
为第32行的“US Revenue[1]”、第18行的“US Revenue[2]”、第6行的“US Revenue[3]”),则
判断“US Revenue[2]”和“US Revenue[3]”代表的行中的哪一个距离“US Revenue[1]”1302
这一行更近。将最近的行与“US Revenue[1]”匹配。例如,当“US Revenue[2]”与“US 
Revenue[1]”距离更近时,将这两个变量符号指向变量表中同一个变量。然后,在变量符号
“US Revenue[1]”附近弹出提示框,提示框中的内容可以为“匹配US Revenue,第18行”
1303,例如在三秒后消息框可以淡出消失。
[0125] 当进行模糊匹配时,系统不会自动将匹配的两个变量符号指向变量表中的同一个变量,而是将模糊匹配的结果向用户提示,提醒用户当前输入的变量符号可能与变量符号
表中的一些项匹配。图14示出了根据本公开的一个实施例的模糊匹配的提示示例。如图14
所示,例如在SMALL语言中,用户输入的变量符号“Revenue”的模糊匹配结果包括变量符号
“Total Revenue”,“revenue”,“Revenue per User”,“Sales”,“Cost of Revenue”。系统在
变量符号“Revenue”的下方弹出展示框1401,将模糊匹配的结果展示在提示框内。光标可在
提示框中的变量符号之间移动,当光标移动到一个变量符号上时,该变量符号以特定方式
显示1402,以区别于其他变量符号。
[0126] 根据本公开的一个实施例,向用户提供可视辅助可以包括在图形用户界面上展示一列表,该列表向用户展示所述程序代码中涉及未定义引用的所有变量符号并且包括第一
变量符号。可以在图形用户界面中向用户提供可视化的变量符号表和变量表中的一些关键
信息,从而使用户了解这些关键信息的动态变化过程。未定义引用变量是变量表中状态为
“未定义引用”的变量。可以将与未定义引用变量对应的变量符号展示在图形用户界面中的
称为“未定义引用表”的表格中。当变量符号表和变量表变化时,图形用户界面中展示的未
定义引用表也相应变化。在一些实现中,“未定义引用”有多种类型。例如在C++中,有“未声
明变量赋值”、“未初始化变量访问”等,不同类型的未定义变量可以用不同的格式显示。例
如,当相继输入“a=1;”、“int c;”和“int b=d+c;”时,系统判断“a=1;”中的变量符号“a”
为“未声明变量赋值”,“int b=d+c;”中变量符号“d”为“未声明变量访问”,变量符号“c”为
“未初始化变量访问”。在未定义引用表中这三类未定义引用可以以不同的方式显示。图17
示出了根据本公开的一个实施例的未定义引用表的示例。如图17所示,在未定义引用表
1701中,“未声明变量赋值”以浅灰色展示1702,“未声明变量访问”以白色展示1703,“未初
始化变量访问”以深灰色展示1704。
[0127] 在本发明的一些实现中,未定义引用表可以隐藏于编辑器边缘,当鼠标移至编辑器边缘时才展示未定义引用表。用户也可以按下按键使得未定义引用表始终展示。图18示
出了根据本公开的一个实施例的未定义引用表的显示示例。如图18所示,未定义引用表
1801中展示的内容为涉及未定义引用的变量符号和其输入位置。当鼠标或光标移动至未定
义引用表中的变量符号“Cash”所在的区域1802时,该变量符号所在的区域被高亮显示。当
点击或选取未定义引用表中的变量符号“Cash”1802时,输入区域中的编辑光标会跳至该变
量符号被输入的位置1803,并且该变量符号在输入区域中会以特定的方式显示,以区别于
其他变量符号。当输入内容涉及未定义引用变量时,未定义引用表会弹出,系统将该被引用
的未定义变量符号和其位置等信息添加至未定义引用表。添加完毕后未定义引用表可以自
动隐藏。图19示出了根据本公开的一个实施例的未定义引用表的显示示例。根据本公开的
一个实施例,响应于通过所述匹配确定第三变量符号与第一变量符号都表示第一变量,在
图形用户界面上的包括涉及未定义引用的所述变量符号的列表上中突出显示匹配成功的
第一变量符号。如图19所示,当输入内容中再次引用该未定义变量符号时,例如当输入“int 
x=aa”1904后又输入“int y=aa+c;”1905,并且“aa”未被定义时,在第二次输入“aa”时,会
弹出未定义引用表1901。之前输入的变量符号“aa”1902(对应于代码1904)被高亮显示,提
示与之后输入的变量符号“aa”1903(对应于代码1905)匹配。
[0128] 根据本公开的一个实施例,响应于从变量表中检测到第一变量符号表示的第一变量变为被定义,从展示所述程序代码中涉及未定义引用的所有变量符号的列表中删除第一
变量符号。也就是说,当展示的未定义引用变量之后被定义时,系统将该变量符号从图形用
户界面的未定义引用表中删除。当输入内容中的变量符号包括定义操作且被严格匹配至在
先的涉及未定义引用的变量符号时,未定义引用表弹出。系统将该涉及未定义引用的变量
符号(此时已定义)从未定义引用表中删除。图20示出了根据本公开的一个实施例的从未定
义引用表删除已定义变量符号的示例。如图20所示,当输入“int aa=3;”2003后,此处的变
量符号“aa”与之前涉及未定义引用的两个变量符号“aa”严格匹配,系统弹出未定义引用表
2001并将表中的相关“aa”变量符号高亮显示2002,提示与之匹配。然后,系统将未定义引用
表中的两个“aa”变量符号都删除2004。
[0129] 根据本公开的一个实施例,向用户提供可视辅助可以包括在图形用户界面上显示所述变量表和变量符号表以及它们之间的关系。变量符号表和变量表中的变量符号和变量
以及它们的相关信息可以在图形用户界面中展示,并且用户可以通过图形用户界面与上述
两个表进行交互。图22示出了根据本公开的一个实施例的变量符号表和变量表的显示示
例。图22中显示是输入的程序代码与变量符号表、变量表、以及这两个表之间的关系。
[0130] 根据本公开的一个实施例,向用户提供可视辅助可以包括在图形用户界面上显示所述程序代码中的已经匹配成功的所有变量符号,并且所显示的已经匹配成功的变量符号
能够被用户修改其匹配关系。对于严格匹配和基于规则的匹配,系统允许用户修改自动匹
配的结果,将当前输入的变量符号匹配至其他变量符号。例如,如果在第32行“Revenue”行
中输入公式“={US Revenue}+{China Revenue}”,但是同一命名空间中建立过两个名为
“US Revenue”的行(上述三个变量符号分别称为第32行的“US Revenue[1]”、第18行的“US 
Revenue[2]”、第6行的“US Revenue[3]”)。系统按照基于规则的匹配自动将第32行的“US 
Revenue[1]”与第18行的“US Revenue[2]”指向变量表中同一个变量。用户可手动将“US 
Revenue[1]”匹配的变量符号修改为第6行的“US Revenue[3]”。系统可以将变量符号“US 
Revenue[1]”指向变量表中“US Revenue[3]”指向的同一个变量,而取消原来“US Revenue
[1]”指向的变量表中US Revenue[2]”指向的变量。
[0131] 根据本公开的一个实施例,向用户提供可视辅助可以包括在图形用户界面上显示所述变量符号表,并且响应于用户选择了变量符号表中的变量符号,程序代码中的对应变
量符号被突出显示。图23示出了根据本公开的一个实施例的变量符号表的显示示例。如图
23所示,展示变量符号表的图形用户界面2301展示了所有变量符号的名称和位置等信息。
当使用鼠标或其他选择方式选择了图形用户界面中变量符号表中的某一个变量符号2302
时,可直接跳至程序代码中该变量符号被输入的行,并将变量符号表中的对应变量符号条
目以特殊方式显示2302(例如使用不同的背景色)。同时,输入区域中该变量符号所在的区
域也可以以特殊方式显示2304。
[0132] 根据本公开的一个实施例,当用户在输入时输入了错误的变量符号名称时,系统可以为用户提供错误更正功能。当用户输入了错误的变量符号名称时,模糊匹配功能依然
可以为用户匹配与输入的变量符号相似的变量符号,用户可以选择模糊匹配结果中的某一
变量符号并选择更正已输入的变量符号名称。系统根据用户的选择,自动将该错误的变量
符号名称更正为用户选择的变量符号的名称。图24示出了根据本公开的一个实施例的错误
更正的示例。如图24所示,例如当用户输入变量符号名称“Ravenue”2401时,系统检测到用
户输入中可能有错误,将“Ravenue”中的“a”高亮显示,以提示输入错误。模糊匹配返回的结
果例如可以是“Revenue”,“Total Revenue”,“revenue”,“Revenue per User”,“Cost of 
Revenue”2402。如果用户选择了模糊匹配结果中的“Revenue”2403,则系统自动将用户输入
的错误的“Ravenue”变量符号更正为用户选择的“Revenue”2404。
[0133] 根据本公开的一个实施例,系统还可以提供变量命名规范,并根据变量命名规范来自动更正变量符号名称。例如在SMALL语言中,由于用该语言编写的程序多用于金融建模
领域,所以使用的变量名多为会计专业词汇,而专业词汇是有行业标准的。本公开的系统和
方法可按照相关的标准与规范为用户提供特定的命名规范。当用户输入的变量名不符合规
范时,系统可以给出提示并推荐符合规范的变量名。如果用户选择了推荐的变量名,则系统
自动将用户输入的变量名替换为选择的变量名。例如,假定某规范有如下的规则:变量名应
以大写字母开头。如果用户输入了变量符号“revenue”,则系统会提示用户该变量符号不符
合命名规范,并为用户推荐符合命名规范的变量符号名称,例如“Revenue”。如果用户选择
了推荐的“Revenue”,则系统将原来输入的“revenue”替换为“Revenue”。
[0134] 根据本公开的一个实施例,根据用户的选择,系统在用户输入的时候不进行实时的变量符号匹配,而在用户完成输入时再批量匹配变量符号。这种方式也适用于对用户输
入包括从存储设备加载全部或部分程序作为用户输入的情况。用户可以批量修改匹配结
果。例如,在SMALL语言中,用户可将已输入的程序保存到硬盘等存储设备中,并且可以之后
从存储设备加载被保存的程序。当程序被加载时,系统批量匹配程序中所有的变量符号,将
符合严格匹配和基于规则的匹配的变量符号自动识别,并令它们指向变量表中的同一变
量。系统将模糊匹配的结果提示给用户,辅助用户手动确认是否表示同一变量。
[0135] 根据本发明的一个实施例的方法还包括解析或执行所述程序代码的一部分,该部分不包括包含涉及未定义引用的程序语句。本公开的实施例支持将未定义引用对程序的影
响限定在一定范围内,使得可以对包含有未定义引用的程序进行部分解析,并且使得不受
未定义引用影响的程序部分能够被正常处理。例如,在SMALL语言中,如果一个行的公式中
包含未定义引用(例如,未定义访问),则在生成的电子表格中只是该行的公式为空从而值
为空,但不影响该行在电子表格中的绘制以及该行的格式,也不影响电子表格中的其余行。
图21示出了根据本公开的一个实施例的部分执行程序代码的示例。如图21所示,由于在变
量“Revenue”定义的行中2101引用了未定义的变量“China Revenue”2102,从而在生成的电
子表格中2103,除了变量“Revenue”所在行2104和China Revenue”所在的行2105的值为空
之外,其余所有变量所在的行都可以被正常解析和绘制。
[0136] 本发明可以解决传统技术的不能引用未定义的变量的问题。使用本发明的方法和系统引用未定义的变量对于用户高效且方便。高效的原因在于,本发明可以自动记录用户
引用的未定义的变量符号,并在用户该变量符号在之后的声明或定义出现后自动匹配该新
声明或定义的变量符号和其对应涉及未定义引用的变量符号。方便的原因在于本发明为用
户提供了各种输入辅助、未定义引用提示和变量匹配提式等功能。此外,采用本发明,可以
在程序代码的一部分涉及未定义引用的情况下,解释执行程序代码的不涉及未定义引用的
其余部分。此外,采用本发明,在程序代码中出现未定义引用的情况下,可以提示用户调整
代码中的语句的顺序以使其符合编译规则从而可以成功地被编译执行。
[0137] 本发明可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。
[0138] 根据本公开的一个实施例,提供了一种计算机系统。该计算机系统包括一个或多个处理器以及耦接到所述一个或多个处理器的存储器。所述存储器存储有计算机指令,所
述计算机指令当由所述一个或多个处理器执行时使所述一个或多个处理器执行以上任意
实施例中的方法的操作。
[0139] 根据本公开的一个实施例,提供了一种计算机可读存储介质。计算机可读存储介质存储有计算机指令,所述计算机指令当由处理器运行时使所述处理器执行以上任意实施
例中的方法。
[0140] 计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储
设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的
更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存
储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式
压缩盘只读存储器(CD‑ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上
存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。
[0141] 这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外
部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关
计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计
算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计
算机可读存储介质中。
[0142] 用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的
任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如
Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机
可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独
立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机
或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包
括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利
用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令
的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可
编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方
面。
[0143] 这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/
或框图中各方框的组合,都可以由计算机可读程序指令实现。
[0144] 这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据
处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功
能/动作的装置。
[0145] 以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技
术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨
在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领
域的其它普通技术人员能理解本文披露的各实施例。
[0146] 基于以上说明,本公开还提供了以下技术方案。
[0147] 方案1.一种用于处理程序代码中的变量的引用的方法,包括:
[0148] 顺序地接收用户输入中包含的字符流,其中所述字符流是所述程序代码的一部分;
[0149] 从所接收的字符流中识别第一变量符号并且存储与第一变量符号相关的信息,其中第一变量符号表示第一变量;
[0150] 把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配以确定所述至少一个变量符号中是否存在表示第一变量的第二变量符号;
[0151] 响应于确定存在至少一个第二变量符号,根据与第一变量符号相关的操作以及与所述一个或多个第二变量符号相关的操作,确定第一变量符号是否涉及未定义引用;以及
[0152] 响应于确定第一变量符号涉及未定义引用,向用户提供可视辅助来处理该未定义引用。
[0153] 方案2.根据方案1所述的方法,还包括:响应于确定不存在第二变量符号,根据与第一变量符号相关的操作,确定第一变量符号是否涉及未定义引用。
[0154] 方案3.根据方案1所述的方法,还包括:
[0155] 从所接收的字符流中继续识别第三变量符号并且存储与第三变量符号相关的信息,其中第三变量符号表示第一变量;
[0156] 把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配以确定所述至少一个变量符号中是否存在表示第一变量的变量符号;
[0157] 通过所述匹配至少找到与第三变量符号均表示第一变量的第一变量符号;以及
[0158] 在确定与第一变量符号相关的操作依赖于与第三变量符号相关的操作的情况下,至少利用与第三变量符号相关的操作来执行与第一变量符号相关的操作。
[0159] 方案4.根据方案1所述的方法,还包括解析或执行所述程序代码的一部分,该部分不包括包含第一变量符号的程序语句。
[0160] 方案5.根据方案1所述的方法,其中,所述用户输入包括以下输入中的一者:用户编辑完成并存储的程序代码的至少一部分,由文本编辑器监听的用户输入动作产生的程序
代码的至少一部分,以及通过用户在图形用户界面编辑器中的操作产生的程序代码的至少
一部分。
[0161] 方案6.根据方案5所述的方法,其中向用户提供可视辅助包括以下的一者或多者:在文本编辑器或图形用户界面编辑器中,在第一变量符号的附近显示提示框、或者突出显
示第一变量符号。
[0162] 方案7.根据方案1所述的方法,其中从所接收的字符流中识别第一变量符号包括利用词法分析器或者机器学习分类器中的一者或多者从所接收的字符流中识别第一变量
符号。
[0163] 方案8.根据方案1所述的方法,其中从所接收的字符流中识别第一变量符号包括把从图形用户界面编辑器的特定组件中接收的字符流识别为第一变量符号。
[0164] 方案9.根据方案1或3所述的方法,其中与变量符号相关的信息包括以下信息中的一者或多者:变量符号的名称、变量符号在程序代码中的位置、变量符号的命名空间、变量
符号的作用域、变量符号表示的变量的类型、变量符号表示的变量、以及与变量符号相关的
操作。
[0165] 方案10.根据方案9所述的方法,其中与变量符号相关的信息被存储到变量符号表中,并且其中所述变量符号表存储有与所述程序代码中的每个识别的变量符号相关的信
息。
[0166] 方案11.根据方案10所述的方法,还包括建立变量表以及建立变量符号表和变量表之间的关系。
[0167] 方案12.根据方案11所述的方法,其中,所述变量表存储所识别的变量的状态,并且变量的状态包括以下一者或多者:表示该变量的变量符号、变量在内存中的地址、变量进
行的操作、变量是否被定义、以及变量是否被引用。
[0168] 方案13.根据方案11所述的方法,其中,建立变量符号表和变量表之间的关系包括:对于变量符号表中的每个变量符号,存储其表示的变量表中的变量;对于变量表中的每
个变量,存储能表示它的变量符号表中的变量符号。
[0169] 方案14.根据方案9所述的方法,其中,在图形用户界面编辑器环境中,变量符号在程序代码中的位置通过输入了该变量符号的组件的位置获得,变量符号的命名空间根据输
入了该变量符号的组件与其它组件的结构关系或用户指定的该变量符号的路径获得,变量
符号的作用域通过输入了该变量符号的组件与其它组件的结构关系获得,变量符号表示的
变量的类型通过创建该变量时的组件的信息获得,与变量符号相关的操作通过用户在图形
用户界面编辑器中的相应操作获得。
[0170] 方案15.根据方案9所述的方法,其中,变量符号在程序代码中的位置使用表示该变量符号在程序代码中的位置的元组来表示,并且变量符号的命名空间、变量符号的作用
域、变量符号表示的变量的类型、以及与变量符号相关的操作通过对该变量符号的上下文
进行语法分析而获得。
[0171] 方案16.根据方案9所述的方法,其中,把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当所存储的第一变量符号和所述至少一个变量符
号中的第二变量符号的名称、命名空间、作用域、以及表示的变量的类型都相同时,确定第
一变量符号和第二变量符号表示同一变量。
[0172] 方案17.根据方案9所述的方法,其中,把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当第一变量符号和所述至少一个变量符号中的多
个第二变量符号的名称相同时,根据预定义的规则确定第一变量符号和哪个第二变量符号
表示同一变量。
[0173] 方案18.根据方案17所述方法,其中所述预定义的规则包括将第一变量符号和距离其最近的相同名称的第二变量符号匹配为表示同一变量。
[0174] 方案19.根据方案9所述的方法,其中,把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当所存储的第三变量符号和第一变量符号的名
称、命名空间、作用域、以及表示的变量的类型都相同时,确定第三变量符号和第一变量符
号表示同一变量。
[0175] 方案20.根据方案9所述的方法,其中,把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当第三变量符号和所述至少一个变量符号中的多
个变量符号的名称相同时,根据预定义的规则确定第三变量符号和哪个变量符号表示同一
变量。
[0176] 方案21.根据方案18所述方法,其中所述预定义的规则包括将第三变量符号和距离其最近的相同名称的第一变量符号匹配为表示同一变量。
[0177] 方案22.根据方案9所述的方法,其中,把第一变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当与第一变量符号相关的信息和与所述至少一个
变量符号中的第二变量符号相关的信息之间的相似度高于阈值时,提示用户确认第一变量
符号和第二变量符号是否表示同一变量。
[0178] 方案23.根据方案9所述的方法,其中,把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配包括:当与第三变量符号相关的信息和与第一变量符号
相关的信息之间的相似度高于阈值时,提示用户确认第三变量符号和第一变量符号是否表
示同一变量。
[0179] 方案24.根据方案22或23所述的方法,其中,所述相似度可以通过以下的一者或多者得到:变量符号名称之间的编辑距离、变量符号名称之间的语义相似度、变量符号命名空
间之间的相似度、变量符号作用域之间的包含关系、以及变量符号在所述程序代码中的位
置之间的距离。
[0180] 方案25.根据方案22所述的方法,其中,当用户确认表示同一变量时,在变量符号表中把第一变量符号表示的变量存储为与第二变量符号表示的相同的变量。
[0181] 方案26.根据方案23所述的方法,其中,当用户确认表示同一变量时,在变量符号表中把第三变量符号表示的变量存储为与第一变量符号表示的相同的变量。
[0182] 方案27.根据方案22所述的方法,其中,当用户确认表示同一变量时,将第一变量符号和第二变量符号的名称和命名空间改成相同。
[0183] 方案28.根据方案23所述的方法,其中,当用户确认表示同一变量时,将第三变量符号和第一变量符号的名称和命名空间改成相同。
[0184] 方案29.根据方案13所述的方法,其中,响应于与变量符号相关的信息被存储到变量符号表中,把该变量符号与先前存储的变量符号逐个进行匹配。
[0185] 方案30.根据方案13所述的方法,其中,通过变量符号的名称的哈希值在变量符号表中建立索引,并且其中,响应于与变量符号相关的信息被存储到变量符号表中,通过所述
索引把该变量符号与先前存储的变量符号进行匹配。
[0186] 方案31.根据方案3所述的方法,其中,与第一变量符号相关的操作、与第二变量符号相关的操作、以及与第三变量符号相关的操作中的每一个包括以下的至少一者:声明、定
义、初始化、赋值、访问、以及析构。
[0187] 方案32.根据方案31所述的方法,其中,与第一变量符号相关的操作依赖于与第三变量符号相关的操作包括以下的至少一者:对第一变量符号的访问依赖于对第三变量符号
的定义,对第一变量符号的访问依赖于对第三变量符号的声明、定义或赋值、对第一变量符
号的赋值依赖于对第三变量符号的声明或定义、以及对第一变量符号的析构依赖于对第三
变量符号的声明或定义。
[0188] 方案33.根据方案1所述的方法,其中所述程序代码是以编译型语言、解释型语言、或者用于构建电子表格模型的语言编写的。
[0189] 方案34.根据方案22所述的方法,其中,当存在与第一变量符号的名称之间的相似度高于阈值的多个第二变量符号时,按照相似度的降序在列表中向用户显示所述多个第二
变量符号。
[0190] 方案35.根据方案34所述的方法,其中,响应于用户选择了列表中的所述多个第二变量符号中的一个,所述程序代码中的第一变量符号的名称被修改为所选择的第二变量符
号的名称。
[0191] 方案36.根据方案34所述的方法,其中,响应于用户选择了列表中的所述多个第二变量符号中的一个,确认第一变量符号与所选择的第二变量符号表示同一变量,并且提示
用户统一第一变量符号与所选择的第二变量符号的名称。
[0192] 方案37.根据方案23所述的方法,其中,当存在与第三变量符号的名称之间的相似度高于阈值的包含第一变量符号的多个变量符号时,按照相似度的降序在列表中向用户显
示所述多个变量符号。
[0193] 方案38.根据方案37所述的方法,其中,响应于用户选择了列表中的第一变量符号,所述程序代码中的第三变量符号的名称被修改为所选择的第一变量符号的名称,或者
所述程序代码中的第一变量符号的名称被修改为第三变量符号的名称。
[0194] 方案39.根据方案37所述的方法,其中,响应于用户选择了列表中的第一变量符号,确认第三变量符号与所选择的第一变量符号表示同一变量,并且提示用户统一第三变
量符号与所选择的第一变量符号的名称。
[0195] 方案40.根据方案3所述的方法,其中,向用户提供可视辅助包括在图形用户界面上展示一列表,该列表向用户展示所述程序代码中涉及未定义引用的所有变量符号并且包
括第一变量符号。
[0196] 方案41.根据方案40所述的方法,还包括:响应于通过所述匹配确定第三变量符号与第一变量符号都表示第一变量,在图形用户界面上的所述列表上中突出显示匹配成功的
第一变量符号。
[0197] 方案42.根据方案11所述的方法,其中,向用户提供可视辅助包括在图形用户界面上显示所述变量表和变量符号表以及它们之间的关系。
[0198] 方案43.根据方案1所述的方法,其中,向用户提供可视辅助包括在图形用户界面上显示所述程序代码中的已经匹配成功的所有变量符号。
[0199] 方案44.根据方案43所述的方法,其中,所显示的已经匹配成功的变量符号能够被用户修改其匹配关系。
[0200] 方案45.根据方案16或17所述的方法,还包括:当确定第一变量符号和第二变量符号表示同一变量时,向用户进行提示。
[0201] 方案46.根据方案19或20所述的方法,还包括:当确定第三变量符号和第一变量符号表示同一变量时,向用户进行提示。
[0202] 方案47.根据方案12所述的方法,其中,所述变量表中的一个变量进行的操作等于与表示该变量的至少一个变量符号中的每个变量符号相关的操作的并集。
[0203] 方案48.根据方案47所述的方法,还包括:根据所述并集中包括的操作来判断该变量是否被定义。
[0204] 方案49.根据方案48所述的方法,还包括:响应于从变量表中检测到第一变量符号表示的第一变量变为被定义,从展示所述程序代码中涉及未定义引用的所有变量符号的列
表中删除第一变量符号。
[0205] 方案50.根据方案1或2所述的方法,还包括:
[0206] 从所接收的字符流中继续识别第三变量符号并且存储与第三变量符号相关的信息,其中第三变量符号表示第一变量;
[0207] 把第三变量符号与从所述程序代码中先前识别的至少一个变量符号进行匹配从而确定所述至少一个变量符号中是否存在表示第一变量的变量符号;
[0208] 通过所述匹配至少找到与第三变量符号均表示第一变量的第一变量符号;以及
[0209] 响应于确定与第一变量符号相关的操作依赖于与第三变量符号相关的操作,调整包含第一变量符号的语句和包含第三变量符号的语句中的至少一个语句在所述程序代码
中的位置以消除所述未定义引用。
[0210] 方案51.根据方案50所述的方法,其中,所述调整是按照预定义的规则或者根据机器学习模型的预测结果而自动执行的。
[0211] 方案52.根据方案50所述的方法,还包括显示经调整后的程序代码,其中所述经调整后的程序代码中的语句与所述程序代码中的语句存在一一对应的关系。
[0212] 方案53.根据方案52所述的方法,其中所显示的经调整后的程序代码中的语句的顺序能够被用户手动地调整。
[0213] 方案54.根据方案53所述的方法,其中在用户手动地调整所述经调整后的程序代码中的语句的顺序时选中了一语句时,向用户提示该语句可以被移动至的程序代码中的至
少一个位置。
[0214] 方案55.根据方案52所述的方法,其中所述经调整后的程序代码能够被编译执行或者被解释执行。
[0215] 方案56.根据方案10所述的方法,其中,向用户提供可视辅助包括在图形用户界面上显示所述变量符号表,并且其中响应于用户选择了变量符号表中的变量符号,程序代码
中的对应变量符号被突出显示。
[0216] 方案57.一种计算机系统,包括:
[0217] 一个或多个处理器;和
[0218] 耦接到所述一个或多个处理器的存储器,所述存储器存储有计算机指令,所述计算机指令当由所述一个或多个处理器执行时使所述一个或多个处理器执行根据方案1至56
中任一项所述的方法的操作。
[0219] 方案58.一种计算机可读存储介质,存储有计算机指令,所述计算机指令当由处理器运行时使所述处理器执行根据方案1至56中任一项所述的方法。