一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种编程语言的编译系统及方法与流程

2022-06-30 00:52:50 来源:中国专利 TAG:


1.本发明涉及一种编程语言的编译系统及方法,尤其涉及一种能够将规则代码转换为过程代码的编译系统及方法。


背景技术:

2.目前主流的科学计算系统实现方法通常是将用户交互界面与基于过程的编程语言的编译器、虚拟机结合,基于此构建的科学计算系统需要用户手动编写解决科学计算问题的过程代码,而过程代码的编写需要很强的专业性,出现错误的概率较高,所以存在用户工作量大且容易出错的系统性缺陷。
3.函数可以理解为是从条件到结果的一条逻辑路径,我们通常接触的编程语言中,通过编写函数、然后输入初始条件、最后求得结果;这种通过初始条件、条件到结果的逻辑路径推导结果的过程称为过程运算,其中需要输入的源代码即为过程代码。
4.当条件对结果来说是充分的时候,其实无论是否指明一条计算结果的逻辑路径,这个结果都是确定的。这种通过初始条件、计算规则推导结果的过程为规则运算,其中需要输入的源代码即为规则代码。
5.规则运算语言相较过程运算语言的优势是相当明显的,因为使用者不需要再花费大量时间思考由条件到结果的逻辑过程。例如要求解一元二次方程,原本需要使用者根据不同的方程编写不同的化简、合并、求解逻辑,现在只需要提供加法结合律、乘法分配律等基本转换规则、一元二次方程求解式,就可以求解所有一元二次方程。
6.针对这样的问题,目前有人提出了并设计了一些规则运算语言,规则运算语言相较过程运算语言是更高级的编程语言,通过规则运算可以减少用户的逻辑思考量,然而已有的规则运算语言存在适用范围狭窄,阅读较为困难,使用较为复杂等问题,用户体验不佳,其大范围推广应用受到严重制约。
7.由于上述原因,本发明对规则代码和过程代码做了深入研究,以期待设计出一种能够解决上述问题的编译系统及方法。


技术实现要素:

8.为了克服上述问题,本发明人进行了锐意研究,设计出一种编程语言的编译系统及方法,该系统包括交互模块、编译模块、预执行模块和执行模块,通过编译模块和预执行模块将接收到的规则代码转换为过程代码,再通过执行模块执行获得结果,从而使得使用者只需要向该编程语言的编译系统中输入规则代码即可最终获得解算结果,极大地降低了使用者的工作难度和错误量,从而完成本发明。
9.具体来说,本发明的目的在于提供以一种编程语言的编译系统,该系统包括:
10.交互模块,其用于接收源代码;
11.编译模块,其用于对源代码做预处理,得到一次代码表;
12.预执行模块,其用于预执行所述一次代码表,获得二次代码表;
13.执行模块,其用于执行二次代码表,获得问题的解。
14.其中,所述源代码包括待求解问题的问题约束和求解问题用到的变换规则。
15.其中,所述编译模块包括预处理子模块、编译子模块和转换子模块;
16.其中,所述预处理子模块用于对源代码进行预处理并生成预编译代码;
17.所述编译子模块用于对预编译代码进行编译,生成字符码,并储存在字符码表中;
18.转换子模块用于将字符码表中的字符码转换为一次代码,并生成作用域表、属性表和函数表。
19.其中,在所述预处理的过程中,所述预处理子模块执行下述步骤中的任意一个或多个:
20.步骤1,删除源代码注释;
21.步骤2,删除源代码中的空格、换行符;
22.步骤3,将多个文件中的源代码进行合并;
23.步骤4,语句替换;
24.步骤5,对无效源代码进行删除;
25.步骤6,将源代码标识符中出现的非ascii码替换为ascii码字符串;
26.步骤7,对源代码中的由字符串与参数构成的函数声明及其调用语句进行变形。
27.其中,在步骤7中,将所有的未在函数名字字符串后面的函数参数移动至字符串后面,并保持函数参数的顺序不变;同时,在函数参数原来的位置处用特定字符串代替形成新的函数名字字符串。
28.其中,在所述编译子模块中,通过词法分析算法和语法分析算法生成具有字符码类型标志位、字符码四元式、字符码四元式参数类型标志位数组的字符码。
29.其中,转换子模块从字符码表中逐行读入字符码并对字符码进行初步解析生成一次代码,储存在一次代码表中;解析同时生成作用域表、属性表和函数表。
30.其中,所述预执行模块的预执行过程包括如下步骤:
31.步骤a:对于“代码可执行标志位”为弃用或不执行的代码,直接跳过当前执行代码;所述当前执行代码,即正在预执行处理的代码;
32.步骤b:对于“代码可执行标志位”为“一定条件下执行”的代码,且在当前条件不为函数调用或当前条件不为条件语句执行时,直接跳过整个作用域内部的代码;
33.步骤c:对于“代码可执行标志位”为“一定条件下执行”的代码,且在当前条件是函数调用或条件语句执行时,或者,对于“代码可执行标志位”为“直接执行”的代码时,根据“代码类型标志位”设置执行过程,具体执行下述子步骤中的任意一个或多个步骤:
34.子步骤c-1,当“代码类型标志位”为“跳转”时,跳过当前执行代码;
35.子步骤c-2,当“代码类型标志位”为“标签”时,跳过当前执行代码;
36.子步骤c-3,当“代码类型标志位”为“返回操作”时,跳过当前执行代码;
37.子步骤c-4,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
38.子步骤c-5,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录附加信息,并将所创建的活动记录标记为当前活动记录;
39.子步骤c-6,当“代码类型标志位”为“域结束”时,销毁并离开当前活动记录,同时
将返回活动记录标记为当前活动记录;
40.子步骤c-7,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,以参数默认值为值的键值对;
41.优选地,还包括子步骤c-8,即当满足,“代码类型标志位”为“表达式”时,具体执行下述亚子步骤中的任意一个或多个步骤:
42.亚子步骤c-8-1,在当前执行代码已与函数进行绑定时,即此匹配函数地址不为空时,
43.若函数根结点标志位为假,则跳过当前执行代码;
44.若函数根结点标志位为真,则调用所绑定函数;即将以当前执行代码为根结点的语法树与所绑定函数的函数声明表达式对应语法树进行对比,生成形参实参对照表,设置当前执行代码为所绑定函数的函数实现作用域起始代码并以函数调用条件执行;
45.在当前执行代码未与函数进行绑定时,即匹配函数地址为空时,对当前执行代码进行代码替换和函数绑定;其中,复制当前执行代码所在最长的表达式对应代码段,将以初始累计权重值0为键、复制代码段为值的键值对,添加至当前代码仓;其中,所述代码仓,是以累计权重值为键,代码段为值的二维表,代码仓中各键值对根据累计权重值大小由小到大、从前往后排列,代码仓的可储存键值对的最大数目由用户设定,当尝试向一个已满的代码仓添加新键值对时,如果键值对中的累计权重值大于代码仓所有键中累计权重值的最小值,则代码仓先删除其头部键值对然后添加新的键值对,如果键值对中的累计权重值小于等于所有键中累计权重值的最小值,则代码仓不会对已添加的键值对做任何处理,也不会添加新的键值对;
46.在当前代码仓不为空时,从代码仓的末端弹出代码段及其累计权重值,将代码段中所有满足任何结点均未与函数进行绑定的条件的语法树分支对应的局部代码段与所有可以访问到的函数进行匹配;
47.当局部代码段与函数匹配成功且所匹配到的函数为返回表达式的函数时,复制待匹配代码段,将复制代码段中与函数声明表达式所匹配的局部代码段替换为经过参数替换的函数返回的表达式对应的代码段,将待匹配代码段的累计权重值与局部代码段所匹配到的函数的权重值相加获得此复制代码段的累计权重值,将由复制代码段的累计权重值和复制代码段组成的键值对添加到候等代码仓;
48.当局部代码段与函数匹配成功且所绑定函数为返回运算结果的函数,复制待匹配代码段,将复制代码段中与函数匹配的局部代码段中各行代码与所匹配函数进行绑定,并将局部代码段的根结点代码的根结点标志位置为“真”;此时检查复制代码段中的所有代码是否均与函数绑定,若所有代码均与函数绑定,则匹配过程结束,用复制代码段替换掉当前执行代码所在最长的表达式在代码表中的对应代码段,替换结束后将代码表中替换部分的第一行代码标记为当前执行代码并执行;
49.若复制代码段中存在代码段未与函数绑定,将待匹配代码段的累计权重值与所绑定函数的权重值相加获得此复制代码段的累计权重值,然后将由复制代码段的权重值和复制代码段组成的键值对添加到候等代码仓;
50.在当前代码仓为空时,将当前代码仓标记为候等代码仓,原候等代码仓标记为当前代码仓,重新执行当前代码仓不为空时的操作;
51.优选地,还包括子步骤c-9,即当“代码类型标志位”为“表达式结束”时,跳过当前执行代码。
52.其中,所述执行模块的执行过程包括如下步骤:
53.步骤甲,对于“代码可执行标志位”为弃用或不执行的代码,直接跳过此代码;
54.步骤乙,对于“代码可执行标志位”为“一定条件下执行”的代码,且当前条件不为函数调用或条件语句执行时,直接跳过整个作用域内部的代码;
55.步骤丙,对于“代码可执行标志位”为“一定条件下执行”的代码,且当前条件是函数调用或条件语句执行时,或者,对于“代码可执行标志位”为“直接执行”的代码时,
56.具体执行下述子步骤中的任意一个或多个步骤:
57.子步骤丙-1,当“代码类型标志位”为“跳转”时,若跳转条件为真,将当前执行代码设置为所跳转标签所在代码的下一行代码,否则直接跳过当前执行代码;
58.子步骤丙-2,当“代码类型标志位”为“标签”时,跳过当前执行代码;
59.子步骤丙-3,当“代码类型标志位”为“返回操作”时,结束执行此函数并返回函数调用位置;具体来说,被返回的运算值赋值给“形参实参对照表”中“形式返回参数”对应的“实际返回参数”,若“实际返回参数”不存在则不赋值;
60.将当前活动记录标记为待销毁活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,并递推销毁待销毁活动记录,执行当前执行代码;
61.子步骤丙-4,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
62.子步骤丙-5,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录信息,并将所创建的活动记录设置为当前活动记录;
63.子步骤丙-6,当“代码类型标志位”为“域结束”时,将当前活动记录标记为待销毁活动记录,若返回活动记录不存在,则销毁当前活动记录,程序执行结束;否则将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,递推销毁活动记录,执行当前执行代码;
64.子步骤丙-7,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,参数默认值为值的键值对;
65.子步骤丙-8,当“代码类型标志位”为“表达式”时,若函数根结点标志位为假,则跳过当前执行代码;若函数根结点标志位为真,则调用所绑定函数;
66.子步骤丙-9,当“代码类型标志位”为“表达式结束”时,表明当前执行代码的上一行代码所在表达式已经结束,跳过当前执行代码。
67.本发明还提供一种编程语言的编译方法,
68.该方法包括如下步骤:
69.通过交互模块接收源代码;
70.通过编译模块对源代码做预处理和编译,得到一次代码表;
71.通过预执行模块预执行所述一次代码表,获得二次代码表;
72.通过执行模块执行二次代码表,获得问题的解。
73.本发明所具有的有益效果包括:
74.根据本发明提供的编程语言的编译系统,能够将规则代码转换为过程代码,再进行解算获得问题的解,从而使得使用者不需要再花费大量时间思考由条件到结果的逻辑过程,在降低使用者工作强度的同时,也能够降低出现错误的可能性;一般而言,以最终求得结果时利用规则进行的变换次数总数(包括需要被用户排除的错误的变换)作为思考量的衡量标准,编写代码需要的工作量、代码中的错误数量以及代码长度与编写代码所需的思考量呈正相关当编程求解需要利用m个规则进行n步逻辑推导的问题时,用户编写过程代码需要的最大思考量的复杂度为0(n)(m=1)或 o(m^n)(m》1),而编写规则代码的复杂度则为o(0),所以用户使用本技术提供的编程语言的编译系统编写代码时,通过将需要多步推导的困难问题编写为规则代码可以大幅减少思考量,提高编写效率。
附图说明
75.图1示出根据本发明一种优选实施方式的编程语言的编译系统整体结构逻辑图。
76.附图标记
77.1-交互模块
78.2-编译模块
79.3-预执行模块
80.4-执行模块
具体实施方式
81.下面通过附图和实施例对本发明进一步详细说明。通过这些说明,本发明的特点和优点将变得更为清楚明确。
82.在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
83.根据本发明提供的一种编程语言的编译系统,如图1中所示,该系统包括交互模块1、编译模块2、预执行模块3和执行模块4。
84.在一个优选的实施方式中,所述交互模块1用于接收源代码,所述源代码是指用户通过输入端口输入的代码,所述源代码包括本技术中所述的规则代码,该规则代码具体是指待求解问题的问题约束和求解问题用到的变换规则。所以用户可以以源代码的形式,将待求解问题的问题约束和求解问题用到的变换规则直接输入到所述编译系统中,从而极大地简化了用户的输入工作量,在提高工作效率的情况下还能够降低出错风险。
85.本技术中所述的待求解问题的问题约束可以为一个表达式,所述变化规则可以对应为一个函数。
86.在一个优选的实施方式中,所述编译模块2用于对源代码做预处理,得到一次代码表、作用域表、属性表和函数表;
87.具体来说,所述编译模块2包括预处理子模块、编译子模块和转换子模块,
88.其中,所述预处理子模块用于对源代码进行预处理并生成预编译代码,在所述预处理的过程中,所述预处理子模块根据源代码的具体内容,执行下述步骤中的任意一个或多个:
89.步骤1,删除源代码注释;
90.步骤2,删除源代码中的空格、换行符;
91.步骤3,将多个文件中的源代码进行合并;
92.步骤4,语句替换;
93.步骤5,对无效源代码进行删除;其中,所述无效源代码为被用户通过预处理指令标注不需要编译的代码和由于用户编写不规范导致的一定不会被执行的代码;
94.步骤6,将源代码标识符中出现的非ascii码替换为ascii码字符串;
95.步骤7,对源代码中的由字符串与参数构成的函数声明及其调用语句进行变形;
96.其中,在步骤7中,将所有的未在函数名字字符串后面的函数参数移动至函数名字字符串后面,并保持函数参数的顺序不变;同时,在函数参数原来的位置处用特定字符串代替形成新的字符串,所述特定字符串用以标识此位置原先对应一个参数,例如:“_arg_”;具体来说, add(a)and(b)to(c)在预编译后变形成为add_arg_and_arg_to(a,b,c)。
97.所述编译子模块用于对预编译代码进行编译,生成字符码,并存储在字符码表中,优选地,在所述编译子模块中,通过词法分析算法和语法分析算法生成具有字符码类型标志位、字符码四元式、字符码四元式参数类型标志位数组的字符码;词法分析算法是将预编译代码的字符序列转换为单词序列的算法;语法分析算法是将单词序列组合成各类语法短语并将其输出为字符码的算法。
98.其中,所述字符码类型标志位用以标明该字符码的功能类型,具体来说:当编译子模块获得的字符码的类型标志位置为“域起始”时,能够标识该字符码的作用是设置作用域的开始;
99.当编译子模块获得的字符码的类型标志位置为“域结束”时,能够标识该字符码的作用是设置作用域的结束;
100.当编译子模块获得的字符码的类型标志位置为“变量声明”时,能够标识字符码的作用是创建一个新的变量;
101.当编译子模块获得的字符码的类型标志位置为“表达式”时,能够标识此字符码的四元式对应一个基础表达式,所述基础表达式是指一个可以被分解成的最小的运算单元的表达式,可以用一个四元式表示;
102.当编译子模块获得的字符码的类型标志位置为“表达式结束”时,能够标识此行字符码之前的字符码所在表达式已经结束,所述字符码所在表达式,是指字符码中的四元式所在表达式;
103.当编译子模块获得的字符码的类型标志位置为“函数操作”时,能够标识此字符码的作用是标明函数的函数声明作用域,或,函数实现作用域,或,函数权重值;
104.当编译子模块获得的字符码的类型标志位置为“返回操作”时,能够标识此字符码的作用是进行函数返回操作;
105.当编译子模块获得的字符码的类型标志位置为“标签”时,能够标识此行字符码是下一行字符码的标签;
106.当编译子模块获得的字符码类型标志位置为“跳转”时,能够标识字符码的作用是当满足跳转条件时跳转至指定标签对应字符码处继续执行;
107.关于所述字符码四元式,当字符码类型为“表达式”时,所述字符码四元式用于表
述基本的一元、二元、零元运算表达式并存储运算符、运算对象、运算结果;当字符码类型不是“表达式”时,所述字符码四元式仅用于储存参数;
108.所述字符码四元式参数类型标志位数组用于标明字符码四元式所存储的操作符、操作对象一、操作对象二、运算结果的参数类型,具体来说:当所述标志位数组中的标志位置为“地址”时,能够标明字符码四元式中对应参数类型为地址;当所述标志位数组中的标志位置为“数字”时,能够标明字符码四元式中对应参数类型为数字;当所述标志位数组中的标志位置为“标识符”时,能够标明字符码四元式中的对应参数类型为标识符;当所述标志位数组中的标志位置为“字符串”时,能够标明字符码四元式中的对应参数类型为字符串。
109.所述转换子模块用于将字符码表中的字符码转换为一次代码,并生成作用域表、属性表和函数表,其中,转换子模块从字符码表中逐行读入字符码并对字符码进行初步解析生成一次代码,储存在一次代码表中;解析同时生成作用域表、属性表和函数表;优选地,在一次代码表中的地址采用多级地址。
110.优选地,所述字符码表具体为:以单级地址为键、汇编四元式为值的二维表;其中,单级地址指通过一个整数表示的地址,字符码表中代码的单级地址即为该代码在字符码文件中所在行的行数,字符码表中各键值对根据单级地址的大小由小到大、从前往后排列;
111.优选地,所述转换子模块获得的一次代码表是以多级地址为键、一次代码为值的二维表;
112.其中,所述多级地址,具体为:由一个一维整数数组构成且数组首位和最后一位均不为零的地址,数组内只有一个数字的多级地址为单级地址,数组内有零个数字的多级地址为空地址;多级地址之间大小比较方式为从多级地址数组起始位置开始向后依次取各自对应位数字比较:如果每位数字都相等,则两个多级地址相等,如果出现两个数字不相等,则较大的数字所在数组对应的地址较大;如果一个多级地址的数组比另一个多级地址的数组短,比较时较短数组相对较长数组的空缺位置的数字默认为零;
113.所述一次代码具体包括:代码所在作用域的地址、代码可执行标志位、代码类型标志位、四元式形参标志位数组、四元式本作用域参数标志位数组、四元式参数可修改标志位数组和四元式参数类型标志位数组。
114.其中,所述代码所在作用域的地址用于记录代码所在的作用域的作用域信息在作用域表中对应的地址;
115.所述代码可执行标志位用于标识此行代码是否可被直接执行,如果标志位为“直接执行”,则此行代码可以被直接执行;如果标志位为“一定条件下执行”,则此行代码不可以被直接执行,但在满足一定条件下可以执行;如果标志位为“不执行”,则此行代码不可以被执行;如果标志位为“弃用”,则此行代码无效且应被删除;
116.所述代码类型标志位用于标识此行代码的代码类型,与字符码中的字符码类型标志位一致;
117.所述四元式形参标志位数组用于标识四元式中参数是否为形式参数,当“代码可执行标志位”为“不执行”并且四元式中对应参数的参数类型为标识符时有效;
118.所述四元式本作用域参数标志位数组用于标识查询四元式中对应参数时是否优先从当前代码所在作用域内开始查询,当“代码可执行标志位”为“立即执行”或“一定条件
下执行”、四元式中对应参数的参数类型为标识符时有效,将四元式参数在此标志位数组的对应标志位置为“真”以标识查询此参数时优先从当前作用域开始查询,若当前作用域不存在此参数则查询当前作用域的父作用域,依次递推,将首次查询到的同名标识符的值作为此四元式参数的值;将四元式参数在此标志位数组的对应标志位置为“假”以标识查询此参数时禁止从当前作用域查询,而是直接从当前作用域的父作用域开始递推查询此参数,将首次查询到的同名标识符的值作为此四元式参数的值;
119.所述四元式参数可修改标志位数组用于标识在此行代码被执行后四元式中参数的值是否允许被执行模块自动修改,当四元式中对应参数的参数类型为标识符或地址,且该四元式所在最长表达式内的所有参数中至少有一个参数的可修改标志位不为假时有效;当四元式参数在此标志位数组的对应标志位为“真”时,能够标识此四元式参数的值在四元式执行后允许被虚拟机自动修改;当四元式参数在此标志位数组的对应标志位为“假”时,能够标识此标志位对应四元式参数的值在四元式执行后禁止被虚拟机自动修改;
120.所述四元式参数类型标志位数组由字符码四元式参数类型标志位数组拓展而来,用于标识对应位置四元式参数的类型。
121.优选地,在转换子模块获得的作用域表是以多级地址为键、作用域信息为值的二维表;作用域表中各键值对根据多级地址的大小,由小到大、从前往后排列。
122.其中,所述作用域信息具体包括:作用域类型标志位、作用域起始地址、作用域结束地址、参数查询作用域地址和作用域属性地址数组;
123.其中,所述作用域类型标志位用于标识作用域的类型,当标志位为“函数声明”时,能够标识此作用域内表达式为函数声明表达式,即函数的名字;当标志位为“函数实现”时,能够标识此作用域内表达式为函数的实现;当标志位为“具有返回语句的函数实现”时,能够标识此作用域内的表达式为函数的实现且其中包含返回语句;
124.所述作用域起始地址是指作用域起始代码在代码表中的地址;
125.所述作用域结束地址是指作用域结束代码在代码表中的地址;
126.所述参数查询作用域地址用于查询此作用域内涉及但并未在此作用域以及此作用域的外层作用域中声明的参数所需访问的作用域的地址。例如,函数实现作用域的参数查询作用域地址即对应的函数声明作用域地址,条件执行作用域的参数查询作用域地址即对应的条件语句所在作用域的地址。所述作用域的外层作用域,即直接或间接包含该作用域的作用域;所述作用域(的)地址,即描述此作用域的作用域信息在作用域表中的地址。
127.所述作用域属性地址数组即为用于记录作用域所具有的属性的地址的数组;所述属性(的)地址,即为描述此属性的属性信息在属性表中的地址。
128.优选地,在转换子模块获得的属性表是以多级地址为键、属性信息为值的二维表;属性表中各键值对根据多级地址的大小由小到大、从前往后排列。
129.优选地,在转换子模块获得的函数表是以多级地址为键、函数信息为值的二维表;函数表中各键值对根据多级地址的大小由小到大、从前往后排列。
130.其中,所述函数信息具体包括:函数声明作用域起始地址、函数声明作用域结束地址、函数声明根结点地址、函数实现作用域地址、返回代码地址数组、函数实现作用域起始地址、函数实现作用域结束地址、函数返回表达式标志位、函数权重值和允许环状结构标志位。
131.其中,需要说明的是,所述函数声明作用域内只允许存在函数声明表达式这一个表达式,所述函数声明作用域起始地址即为函数声明所在作用域的作用域起始代码的地址;所述作用域起始代码,即代码类型为“域起始”的代码;所述代码(的)地址,即代码在代码表中对应的地址,具体为字符码在字符码表中的地址,一次代码在一次代码表中的地址,二次代码在二次代码表中的地址。
132.所述函数声明作用域结束地址即为函数声明所在作用域的作用域结束代码在一次代码表中的位置。所述作用域结束代码,即代码类型为“域结束”的代码。
133.所述函数声明根结点地址即为函数声明表达式的语法树的根结点对应一次代码的地址。所述语法树即为代码段或表达式对应语法结构的树状表现形式。
134.所述函数实现作用域地址即为函数实现作用域信息在作用域表中对应的地址。
135.所述返回代码地址数组即为在函数实现作用域中所有执行函数返回动作的代码的地址。所述执行函数返回动作的代码即为代码类型为“返回操作”的代码。
136.所述函数实现作用域起始地址即为函数实现所在作用域的作用域起始代码的地址。
137.所述函数实现作用域结束地址即为函数实现所在作用域的作用域结束代码的地址。
138.所述函数返回表达式标志位用于标识函数返回值是否为表达式;当此标志位为“真”时,说明函数返回结果是一个表达式,此函数为返回表达式的函数;当此标志位为“假”时,表示函数返回结果是运算值,此函数为返回运算值的函数。
139.返回表达式的函数被用来将与函数声明表达式所匹配的代码段替换为经过参数替换的与函数返回的表达式所对应的代码段;所述匹配是指两者对应的语法树结构一致;所述与函数声明表达式所匹配的代码段,即为与函数声明表达式对应语法树相匹配代码段,当此代码段对应的语法树为一个表达式语法树的子树时,此代码段不一定是连续的一段代码,也可能是多段不连续代码。所述经过参数替换的与函数返回值的表达式对应的代码段,即将作为函数返回值的表达式对应的代码段中的形式参数替换为实际参数后的代码段;当此返回表达式的函数代表的是一个化简操作,在使用返回表达式的函数进行代码替换后,可能产生脱离表达式语法树的代码片段(例如变换a*(x 1) b*(x 1)

(a b)*(x 1)会使得一个x 1脱离语法树),而当此返回表达式的函数代表的是一个化繁操作,则在使用返回表达式的函数进行代码替换后,表达式的语法树可能产生环状结构(例如变换(a b)*(x 1)

a*(x 1) b*(x 1)在语法树只有一个x 1分支的时候会导致a*(x 1)和b*(x 1)引用同一个x 1分支的根结点,对x 1 的二次引用产生了环状结构);在代码替换后,会强制自动查找并删除代码段中脱离表达式语法树的代码片段,在查找并删除代码段中脱离表达式语法树的代码片段后,若此函数的允许环状结构标志位为“真”则不进行环状结构的检查与展开,若此函数的允许环状结构标志位为“假”,则进行环状结构检查与展开,环状结构检查具体为,检查语法树的新替换部分是否出现了对同一语法树分支进行至少两次引用的情况,若出现这种情况,则存在环状结构,展开环状结构具体为,复制根节点被至少两次引用的语法树分支对应的代码段,用未被使用的地址替换复制的语法树分支对应代码段的代码地址与用于存储运行时生成的中间变量的地址以使此语法树分支复制代码段可以在不与原语法树分支对应代码段冲突的情况下插入进行代码替换后的代码段中并位于原语法树分支
的根节点的第二次被引用位置之前,随后将修改后的语法树分支复制代码段插入代码替换后的代码段中并将引起环状结构的对语法树分支的根结点的第二次引用改为对所插入的语法树分支复制代码段的根结点的引用,重复进行环状结构检查与展开直至语法树的新替换部分不存在环状结构;
140.当函数返回表达式标志位为“假”时,表示函数返回值是运算值;只有当一个表达式对应的代码段中所有类型为“表达式”、可执行标志位为“真”的代码均与返回运算值的函数绑定,此表达式对应代码段才会被执行,返回表达式的函数不能被用于绑定。所述将代码与函数绑定是指将代码的所绑定函数地址设置为函数的地址。
141.所述函数权重值用于标识此函数的权重值,可以为任意实数。
142.在一个优选的实施方式中,所述预执行模块3用于预执行所述一次代码表,获得二次代码表;
143.其中,其中所述二次代码表是指以地址为键、以二次代码为值的二维表;
144.所述二次代码由一次代码拓展而来,具体包括一次代码、匹配函数地址和函数根结点标志位;
145.所述匹配函数地址用于记录此行代码所在表达式匹配到的函数的函数信息在函数表中的地址,此地址当且仅当代码的可执行标志位不为“不执行”时有效;
146.所述函数根结点标志位用于标识此行代码所处结点是否对应于所绑定函数的函数声明表达式的根结点,当且仅当匹配函数地址不为空时有效。当此标志位置为“真”时,用于标识以此行代码所处结点对应于所绑定函数的函数声明表达式的根结点,当此标志位置为“假”时,用于标识此行代码所处结点对应于所绑定函数的函数声明表达式的子结点或子叶结点。本技术中所述的代码,在字符码表中指的是字符码,在一次代码表中指的是一次代码,在二次代码表中指的是二次代码;所述代码所处结点是指代码的四元式代表的基础表达式在代码所处的表达式对应语法树上的结点;所述函数声明表达式是指函数声明作用域内的表达式。
147.所述预执行模块3的预执行过程包括如下步骤:
148.步骤a:对于“代码可执行标志位”为弃用或不执行的代码,直接跳过当前执行代码;所述当前执行代码,即正在预执行处理的代码;所述弃用的代码是指没有任何作用的代码,所述不执行的代码是指位于函数声明作用域内部的代码,仅能用作函数声明,不能被执行;
149.步骤b:对于“代码可执行标志位”为“一定条件下执行”的代码,且在当前条件不为函数调用或条件语句执行时,直接跳过整个作用域内部的代码;所述一定条件下执行的代码为函数实现作用域的作用域起始与作用域结束代码和条件语句条件体作用域的作用域起始与作用域结束代码。
150.步骤c:对于“代码可执行标志位”为“一定条件下执行”的代码,且在当前条件是函数调用或条件语句执行时,或者,对于“代码可执行标志位”为“直接执行”的代码时,根据“代码类型标志位”设置执行过程;具体执行下述子步骤中的任意一个或多个步骤:
151.子步骤c-1,当“代码类型标志位”为“跳转”时,跳过当前执行代码;
152.子步骤c-2,当“代码类型标志位”为“标签”时,跳过当前执行代码;
153.子步骤c-3,当“代码类型标志位”为“返回操作”时,跳过当前执行代码;
154.子步骤c-4,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
155.子步骤c-5,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录附加信息,并将所创建的活动记录标记为当前活动记录;
156.所述活动记录即为对作用域的活动的记录,其用于记录此作用域内代码的特定的执行前后所涉及的上下文信息和执行过程中产生的信息,具体包括:数据表和活动区信息;
157.所述数据表是二维表,该二维表的键为标识符名称,或,参数所在地址,或,活动记录作用域地址,该二维表的值为数字,或,字符串,或,活动记录,或其他被支持的数据类型。
158.所述活动区信息具体包括:形参实参对照表,活动记录作用域地址、指向父活动记录的指针、指向返回活动记录的指针、当前活动记录的返回地址;
159.所述形参实参对照表是以形式参数标识符为键,实际参数标识符或实际参数地址为值的二维表,当且仅当此活动记录是因为函数调用而创建时此表才会被创建;
160.所述活动记录作用域地址是此活动记录对应的作用域的地址;
161.所述指向父活动记录的指针中的父活动记录是指数据表值域直接包含此活动记录的活动记录;
162.所述指向返回活动记录的指针中的返回活动记录是指从当前活动记录离开后,应当被设置为当前活动记录的活动记录,一个活动记录的返回活动记录默认为它的父活动记录;若一个活动记录因为函数调用而创建,则它的返回活动记录应当为记录此函数调用动作的活动记录,因此查询实际参数时需要访问返回活动记录进行查询;
163.所述当前活动记录的返回地址是指从当前活动记录返回后应当标记为当前执行代码的代码的地址,默认为当前执行代码的下一行代码,若当前活动记录是因为函数调用而创建,则该返回地址应为函数调用处代码的下一行代码。
164.子步骤c-6,当“代码类型标志位”为“域结束”时,销毁并离开当前活动记录,同时将返回活动记录标记为当前活动记录;
165.子步骤c-7,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,以参数默认值为值的键值对;
166.子步骤c-8,当满足,“代码类型标志位”为“表达式”时,具体执行下述亚子步骤中的任意一个或多个步骤:
167.亚子步骤c-8-1,在当前执行代码已与函数进行绑定时,即此匹配函数地址不为空时,
168.若函数根结点标志位为假,则跳过当前执行代码;
169.若函数根结点标志位为真,则调用所绑定函数;即将以当前执行代码为根结点的语法树与所绑定函数的函数声明表达式对应语法树进行对比,生成形参实参对照表,设置当前执行代码的所绑定函数的函数实现作用域的起始代码为当前执行代码并以函数调用条件执行当前执行代码。
170.亚子步骤c-8-2,在当前执行代码未与函数进行绑定时,即匹配函数地址为空时,对当前执行代码进行代码替换和函数绑定;具体来说,复制当前执行代码所在最长的表达式对应代码段,将以初始累计权重值(即0) 为键、复制代码段为值的键值对,添加至当前代码仓;所述代码仓是以累计权重值为键,代码段为值的二维表;代码仓中各键值对根据累计
权重值的大小,由小到大、从前往后排列;其中,代码仓的可储存键值对的最大数目由用户设定,当尝试向一个已满的代码仓添加新键值对时,如果键值对中的累计权重值大于代码仓所有键中累计权重值的最小值,则代码仓先删除其头部键值对然后添加新的键值对,如果键值对中的累计权重值小于等于所有键中累计权重值的最小值,则代码仓不会对已添加的键值对做任何处理,也不会添加新的键值对。所述累计权重值即为函数权重值的累加,当代码段在通过返回表达式的函数进行代码替换、或与返回运算值的函数进行绑定时,将这些函数的权重值进行累加,作为变换后代码段的累计权重值;未经任何代码替换且未与任何函数进行绑定的代码段的初始累计权重值为零;
171.在当前代码仓不为空时,从代码仓的末端弹出待匹配代码段及其累计权重值,将代码段中所有满足任何结点均未与函数进行绑定的条件的语法树分支对应的局部代码段与所有可以访问到的函数进行匹配;
172.所述局部代码段与函数进行匹配是指局部代码段与函数的函数声明表达式对应代码段进行匹配,亦即局部代码段对应语法树与函数的函数声明表达式对应语法树进行匹配。
173.进一步地,当局部代码段与函数匹配成功且所匹配的函数为返回表达式的函数时,复制待匹配代码段,将复制的代码段中与函数声明表达式所匹配的局部代码段替换为经过参数替换的函数返回的表达式对应的代码段,将待匹配代码段的累计权重值与所绑定函数的权重值相加获得此复制代码段的累计权重值,将由复制代码段的累计权重值和复制代码段组成的键值对添加到候等代码仓;
174.当局部代码段与函数匹配成功且所匹配的函数为返回运算结果的函数,复制待匹配代码段,将复制代码段中与函数匹配的局部代码段中各行代码与所匹配函数进行绑定,并将局部代码段的根结点代码的函数根结点标志位置为“真”;此时检查复制代码段中的所有代码是否均与函数绑定,若所有代码均与函数绑定,则匹配过程结束,用复制代码段替换掉当前执行代码所在最长的表达式在代码表中的对应代码段,替换过程中需要保证复制代码段内各行代码排列顺序不变、代码对应的多级地址范围处于代码表中被替换部分的上一行代码对应地址与下一行代码对应地址之间,替换结束后将代码表中替换部分的第一行代码标记为当前执行代码并执行;
175.若复制代码段中存在代码并未与函数绑定,将待匹配代码段的累计权重值与所绑定函数的权重值相加获得此复制代码段的累计权重值,然后将由复制代码段的权重值和复制代码段组成的键值对添加到候等代码仓。
176.在当前代码仓为空时,将当前代码仓标记为候等代码仓,原候等代码仓标记为当前代码仓,重新执行当前代码仓不为空时的操作;
177.子步骤c-9,当“代码类型标志位”为“表达式结束”时,可知当前执行代码的上一行代码所在的最长的表达式已经结束,跳过当前执行代码。
178.本技术中,所述预执行过程不求解具体值,因此预执行过程中不进行实际的数值运算与逻辑运算操作,但仍需根据语句创建变量以保证参数环境正确。
179.在预执行过程中,分支语句的各个分支以及循环结构的循环体都应该被执行一次,因此预执行过程中不执行跳转动作。
180.本技术中,通过所述预执行模块3,能够推导出待求解问题的求解过程,并将原待
求解问题的问题约束对应的代码替换为所推导的求解过程对应的代码;经过该预执行模块3的预执行处理后,一次代码表中问题约束的代码已经被替换为求解过程代码,此时代码表即为二次代码表,再通过执行模块4执行二次代码表即可获得问题的解。
181.在一个优选的实施方式中,所述执行模块4用于从二次代码表起始位置开始执行二次代码表中的代码,最终获得问题的解;
182.具体来说,执行模块4的执行过程包括如下步骤:
183.步骤甲,对于“代码可执行标志位”为弃用或不执行的代码,直接跳过此代码;
184.步骤乙,对于“代码可执行标志位”为“一定条件下执行”的代码,且当前条件不为函数调用或当前条件不为条件语句执行时,直接跳过整个作用域内部的代码;
185.步骤丙,对于“代码可执行标志位”为“一定条件下执行”的代码,且当前条件是函数调用或条件语句执行时,或者,对于“代码可执行标志位”为“直接执行”的代码时,具体执行下述子步骤中的任意一个或多个步骤:
186.子步骤丙-1,当“代码类型标志位”为“跳转”时,若跳转条件为真,将当前执行代码设置为所跳转标签所在代码的下一行代码,否则直接跳过当前执行代码;
187.子步骤丙-2,当“代码类型标志位”为“标签”时,跳过当前执行代码;
188.子步骤丙-3,当“代码类型标志位”为“返回操作”时,结束执行此函数并返回函数调用位置;具体来说,被返回的运算值赋值给“形参实参对照表”中“形式返回参数”对应的“实际返回参数”,若“实际返回参数”不存在则不赋值;
189.将当前活动记录标记为待销毁活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,并递推销毁待销毁活动记录,执行当前执行代码;所述递推销毁活动记录的具体处理过程为,若一个待销毁记录的父记录与当前活动记录不是同一个活动记录,则待销毁记录的父活动记录也会被标记为待销毁活动记录,依次递推,最终将所有待销毁活动记录一并销毁。
190.子步骤丙-4,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
191.子步骤丙-5,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录信息,并将所创建的活动记录设置为当前活动记录;
192.子步骤丙-6,当“代码类型标志位”为“域结束”时,将当前活动记录标记为待销毁活动记录,若返回活动记录不存在,则销毁当前活动记录,程序执行结束;否则将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,递推销毁待销毁活动记录,执行当前执行代码;
193.子步骤丙-7,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,参数默认值为值的键值对;
194.子步骤丙-8,当“代码类型标志位”为“表达式”时,若函数根结点标志位为假,则跳过当前执行代码;若函数根结点标志位为真,则调用所绑定函数;
195.子步骤丙-9,当“代码类型标志位”为“表达式结束”时,表明当前执行代码的上一行代码所在表达式已经结束,跳过当前执行代码。
196.本发明还提供一种编程语言的编译方法,该方法是基于所述编程语言的编译系统实现的,具体来说,该方法包括如下步骤:
197.s1:通过交互模块1接收源代码;
198.其中,所述源代码是指用户通过输入端口输入的代码,所述源代码包括本技术中所述的规则代码,该规则代码具体是指待求解问题的问题约束和求解问题用到的变换规则。
199.s2:通过编译模块2对源代码做预处理,得到一次代码表;
200.其中,首先通过预处理子模块对源代码进行预处理并生成预编译代码;具体来说包括如下步骤:
201.步骤1,删除源代码注释;
202.步骤2,删除源代码中的空格、换行符;
203.步骤3,将多个文件中的源代码进行合并;
204.步骤4,语句替换;
205.步骤5,对无效源代码进行删除;
206.步骤6,将源代码标识符中出现的非ascii码替换为ascii码字符串;
207.步骤7,对源代码中的由字符串与参数构成的函数声明及其调用语句进行变形;
208.然后通过编译子模块对预编译代码进行编译,生成具有字符码类型标志位、字符码四元式、字符码四元式参数类型标志位数组的字符码:
209.最后通过转换子模块将字符码表中的字符码转换为一次代码,并生成作用域表、属性表和函数表。
210.s3:通过预执行模块3预执行所述一次代码表,获得二次代码表;
211.其中,执行过程包括如下步骤:
212.步骤a:对于“代码可执行标志位”为弃用或不执行的代码,直接跳过当前执行代码;
213.步骤b:对于“代码可执行标志位”为“一定条件下执行”的代码,且在当前条件不为函数调用或条件语句执行时,直接跳过整个作用域内部的代码;
214.步骤c:对于“代码可执行标志位”为“一定条件下执行”的代码,且在当前条件是函数调用或条件语句执行时,或者,对于“代码可执行标志位”为“直接执行”的代码时,根据“代码类型标志位”位设置执行过程;具体执行下述子步骤中的任意一个或多个步骤:
215.子步骤c-1,当“代码类型标志位”为“跳转”时,跳过当前执行代码;
216.子步骤c-2,当“代码类型标志位”为“标签”时,跳过当前执行代码;
217.子步骤c-3,当“代码类型标志位”为“返回操作”时,跳过当前执行代码;
218.子步骤c-4,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
219.子步骤c-5,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录附加信息,并将所创建的活动记录标记为当前活动记录;
220.子步骤c-6,当“代码类型标志位”为“域结束”时,销毁并离开当前活动记录,同时将返回活动记录标记为当前活动记录;
221.子步骤c-7,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,以参数默认值为值的键值对;
222.子步骤c-8,当满足,“代码类型标志位”为“表达式”时,具体执行下述亚子步骤中
的任意一个或多个步骤:
223.亚子步骤c-8-1,在当前执行代码已与函数进行绑定时,即此匹配函数地址不为空时,
224.若函数根结点标志位为假,则跳过当前执行代码;
225.若函数根结点标志位为真,则调用所绑定函数;
226.亚子步骤c-8-2,在当前执行代码未与函数进行绑定时,即匹配函数地址为空时,则对当前执行代码进行代码替换和函数绑定;
227.其中,在当前代码仓不为空时,从代码仓的末端弹出代码段及其累计权重值,将代码段中所有满足任何结点均未与函数进行绑定的条件的语法树分支对应的局部代码段与所有可以访问到的函数进行匹配;
228.当局部代码段与函数匹配成功且所匹配到的函数为返回表达式的函数时,复制待匹配代码段,将复制代码段中与函数声明表达式所匹配的局部代码段替换为经过参数替换的函数返回的表达式对应的代码段,将待匹配代码段的累计权重值与局部代码段所匹配到的函数的权重值相加获得此复制代码段的累计权重值,将由复制代码段的累计权重值和复制代码段组成的键值对添加到候等代码仓;
229.当局部代码段与函数匹配成功且所绑定函数为返回运算结果的函数,复制待匹配代码段,将复制代码段中与函数匹配的局部代码段中各行代码与所匹配函数进行绑定,并将局部代码段的根结点代码的根结点标志位置为“真”;
230.检查复制代码段中的所有代码是否均与函数绑定,若所有代码均与函数绑定,则匹配过程结束,用复制代码段替换掉当前执行代码所在最长的表达式在代码表中的对应代码段,替换结束后将代码表中替换部分的第一行代码标记为当前执行代码并执行;
231.若复制代码段中存在代码段未与函数绑定,将待匹配代码段的累计权重值与所绑定函数的权重值相加获得此复制代码段的累计权重值,然后将由复制代码段的权重值和复制代码段组成的键值对添加到候等代码仓;。
232.在当前代码仓为空时,将当前代码仓标记为候等代码仓,原候等代码仓标记为当前代码仓,重新执行当前代码仓不为空时的操作;
233.子步骤c-9,当“代码类型标志位”为“表达式结束”时,可知当前执行代码的上一行代码所在的最长的表达式已经结束,跳过当前执行代码。
234.s4:通过执行模块4执行二次代码表,获得问题的解。
235.其中,执行模块4的执行过程包括如下步骤:
236.步骤甲,对于“代码可执行标志位”为弃用或不执行的代码,直接跳过此代码;
237.步骤乙,对于“代码可执行标志位”为“一定条件下执行”的代码,且当前条件不为函数调用或条件语句执行时,直接跳过整个作用域内部的代码;
238.步骤丙,对于“代码可执行标志位”为“一定条件下执行”的代码,且当前条件是函数调用或条件语句执行时,或者,对于“代码可执行标志位”为“直接执行”的代码时,具体执行下述子步骤中的任意一个或多个步骤:
239.子步骤丙-1,当“代码类型标志位”为“跳转”时,若跳转条件为真,将当前执行代码设置为所跳转标签所在代码的下一行代码,否则直接跳过当前执行代码;
240.子步骤丙-2,当“代码类型标志位”为“标签”时,跳过当前执行代码;
241.子步骤丙-3,当“代码类型标志位”为“返回操作”时,结束执行此函数并返回函数调用位置;
242.子步骤丙-4,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
243.子步骤丙-5,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录信息,并将所创建的活动记录设置为当前活动记录;
244.子步骤丙-6,当“代码类型标志位”为“域结束”时,将当前活动记录标记为待销毁活动记录,若返回活动记录不存在,则销毁当前活动记录,程序执行结束;否则将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,递推销毁活动记录,执行当前执行代码;
245.子步骤丙-7,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,参数默认值为值的键值对;
246.子步骤丙-8,当“代码类型标志位”为“表达式”时,若函数根结点标志位为假,则跳过当前执行代码;若函数根结点标志位为真,则调用所绑定函数;所述跳过当前执行代码是指将当前执行代码设置为当前执行代码的下一行代码并执行当前执行代码。
247.子步骤丙-9,当“代码类型标志位”为“表达式结束”时,表明当前执行代码的上一行代码所在表达式已经结束,跳过当前执行代码。
248.实施例
249.编辑源代码求解满足1*x 2*x (π-3)*x==100条件的x的值,该解算过程中用到的规则有乘法结合律与乘除转换,在求解过程中,采用本技术提供的编程语言的编译系统,所述编程语言的编译系统的交互模块接收到的源代码如下所示:
[0250][0251]
[0252]
该源代码中,创建参数pi,其值为3.14。“new”表示创建新的参数,“:”为属性运算符,表示将属性“new”赋予pi。
[0253]
定义乘法结合律a*c b*c

(a b)*c;
[0254]
其中@(30){a*c b*c}表明这是一个用于匹配满足格式a*c b*c的表达式的函数,“@”表明这是一个函数声明。“(30)”表示这个函数的权重为30。
[0255]
re表示函数返回;“$”表明其所修饰的参数b在此函数执行后其值可能会被修改,或者可以理解为表达式a*$b==c以b为待求解的未知量。
[0256]
x
‑‑
》0表示将参数x以默认方式输出。
[0257]
该源程序在所述编程语言的编译系统经过下述处理:
[0258]
通过交互模块接收该源代码;
[0259]
通过编译模块对源代码做预处理,得到一次代码表;其中,通过预处理子模块对源代码进行预处理并生成预编译代码;
[0260]
其中,在所述预处理的过程中,所述预处理子模块执行下述步骤中的任意一个或多个:
[0261]
步骤1,删除源代码注释;
[0262]
步骤2,删除源代码中的空格、换行符;
[0263]
通过编译子模块对预编译代码进行编译,生成字符码;通过转换子模块将字符码转换为一次代码,并生成作用域表、属性表和函数表;
[0264]
通过预执行模块预执行所述一次代码表,获得二次代码表;其中包括如下步骤:
[0265]
步骤a:对于“代码可执行标志位”为弃用或不执行的代码,直接跳过当前执行代码;所述当前执行代码,即正在预执行处理的代码;
[0266]
步骤b:对于“代码可执行标志位”为“一定条件下执行”的代码,且在当前条件不为函数调用或当前条件不为条件语句执行时,直接跳过整个作用域内部的代码;
[0267]
步骤c:对于“代码可执行标志位”为“一定条件下执行”的代码,且在当前条件是函数调用或条件语句执行时,或者,对于“代码可执行标志位”为“直接执行”的代码时,根据“代码类型标志位”设置执行过程,执行下述子步骤中的任意一个或多个子步骤:
[0268]
子步骤c-1,当“代码类型标志位”为“跳转”时,跳过当前执行代码;
[0269]
子步骤c-2,当“代码类型标志位”为“标签”时,跳过当前执行代码;
[0270]
子步骤c-3,当“代码类型标志位”为“返回操作”时,跳过当前执行代码;
[0271]
子步骤c-4,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
[0272]
子步骤c-5,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录附加信息,并将所创建的活动记录标记为当前活动记录;
[0273]
子步骤c-6,当“代码类型标志位”为“域结束”时,销毁并离开当前活动记录,同时将返回活动记录标记为当前活动记录;
[0274]
子步骤c-7,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,以参数默认值为值的键值对;
[0275]
优选地,还包括子步骤c-8,即当满足,“代码类型标志位”为“表达式”时,具体执行下述亚子步骤中的任意一个或多个步骤:
[0276]
亚子步骤c-8-1,在当前执行代码已与函数进行绑定时,即此匹配函数地址不为空时,
[0277]
若函数根结点标志位为假,则跳过当前执行代码;
[0278]
若函数根结点标志位为真,则调用所绑定函数;即将以当前执行代码为根结点的语法树与所绑定函数的函数声明表达式对应语法树进行对比,生成形参实参对照表,设置当前执行代码为所绑定函数的函数实现作用域起始代码并以函数调用条件执行;
[0279]
亚子步骤c-8-2,在当前执行代码未与函数进行绑定时,即匹配函数地址为空时,对当前执行代码进行代码替换和函数绑定;其中,复制当前执行代码所在最长的表达式对应代码段,将以初始累计权重值0为键、复制代码段为值的键值对,添加至当前代码仓,其中,所述代码仓,是以累计权重值为键,代码段为值的二维表,代码仓中各键值对根据累计权重值大小由小到大、从前往后排列,代码仓的可储存键值对的最大数目由用户设定,当尝试向一个已满的代码仓添加新键值对时,如果键值对中的累计权重值大于代码仓所有键中累计权重值的最小值,则代码仓先删除其头部键值对然后添加新的键值对,如果键值对中的累计权重值小于等于所有键中累计权重值的最小值,则代码仓不会对已添加的键值对做任何处理,也不会添加新的键值对;
[0280]
在当前代码仓不为空时,从代码仓的末端弹出代码段及其累计权重值,将代码段中所有满足任何结点均未与函数进行绑定的条件的语法树分支对应的局部代码段与所有可以访问到的函数进行匹配;
[0281]
当局部代码段与函数匹配成功且所匹配到的函数为返回表达式的函数时,复制待匹配代码段,将复制代码段中与函数声明表达式所匹配的局部代码段替换为经过参数替换的函数返回的表达式对应的代码段,将待匹配代码段的累计权重值与局部代码段所匹配到的函数的权重值相加获得此复制代码段的累计权重值,将由复制代码段的累计权重值和复制代码段组成的键值对添加到候等代码仓;
[0282]
当局部代码段与函数匹配成功且所绑定函数为返回运算结果的函数,复制待匹配代码段,将复制代码段中与函数匹配的局部代码段中各行代码与所匹配函数进行绑定,并将局部代码段的根结点代码的根结点标志位置为“真”;此时检查复制代码段中的所有代码是否均与函数绑定,若所有代码均与函数绑定,则匹配过程结束,用复制代码段替换掉当前执行代码所在最长的表达式在代码表中的对应代码段,替换结束后将代码表中替换部分的第一行代码标记为当前执行代码并执行;
[0283]
若复制代码段中存在未与函数绑定的代码段,将待匹配代码段的累计权重值与所绑定函数的权重值相加获得此复制代码段的累计权重值,然后将由复制代码段的权重值和复制代码段组成的键值对添加到候等代码仓;
[0284]
在当前代码仓为空时,将当前代码仓标记为候等代码仓,原候等代码仓标记为当前代码仓,重新执行当前代码仓不为空时的操作;
[0285]
优选地,还包括子步骤c-9,即当“代码类型标志位”为“表达式结束”时,跳过当前执行代码。
[0286]
通过执行模块执行二次代码表,获得问题的解;其中包括如下步骤:
[0287]
步骤甲,对于“代码可执行标志位”为弃用或不执行的代码,直接跳过此代码;
[0288]
步骤乙,对于“代码可执行标志位”为“一定条件下执行”的代码,且当前条件不为
函数调用或条件语句执行时,直接跳过整个作用域内部的代码;
[0289]
步骤丙,对于“代码可执行标志位”为“一定条件下执行”的代码,且当前条件是函数调用或条件语句执行时,或者,对于“代码可执行标志位”为“直接执行”的代码时,具体执行下述子步骤中的任意一个或多个步骤:
[0290]
子步骤丙-1,当“代码类型标志位”为“跳转”时,若跳转条件为真,将当前执行代码设置为所跳转标签所在代码的下一行代码,否则直接跳过当前执行代码;
[0291]
子步骤丙-2,当“代码类型标志位”为“标签”时,跳过当前执行代码;
[0292]
子步骤丙-3,当“代码类型标志位”为“返回操作”时,结束执行此函数并返回函数调用位置;具体来说,被返回的运算值赋值给“形参实参对照表”中“形式返回参数”对应的“实际返回参数”,若“实际返回参数”不存在则不赋值;
[0293]
将当前活动记录标记为待销毁活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,并递推销毁待销毁活动记录,执行当前执行代码;
[0294]
子步骤丙-4,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
[0295]
子步骤丙-5,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录信息,并将所创建的活动记录设置为当前活动记录;
[0296]
子步骤丙-6,当“代码类型标志位”为“域结束”时,将当前活动记录标记为待销毁活动记录,若返回活动记录不存在,则销毁当前活动记录,程序执行结束;否则将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,递推销毁活动记录,执行当前执行代码;
[0297]
子步骤丙-7,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,参数默认值为值的键值对;
[0298]
子步骤丙-8,当“代码类型标志位”为“表达式”时,若函数根结点标志位为假,则跳过当前执行代码;若函数根结点标志位为真,则调用所绑定函数;
[0299]
子步骤丙-9,当“代码类型标志位”为“表达式结束”时,表明当前执行代码的上一行代码所在表达式已经结束,跳过当前执行代码。
[0300]
最终得到的输出结果为:
[0301]
debug output:
[0302]
data:[dataflagbit:1addrflagbit:0content_i:31.8471
[0303]
content_s:content_a:]
[0304]
通过该结果可知,x取值为31.8471,解算获得的数值准确。
[0305]
通过上述实施例可知,编程语言的编译系统能够在输入的源程序中仅包含待求解问题的问题约束和求解问题用到的变换规则的情况下,能够获得问题的准确解,能够在降低使用者工作量的基础上,进一步降低编程过程中错误的出现率。
[0306]
以上结合了优选的实施方式对本发明进行了说明,不过这些实施方式仅是范例性的,仅起到说明性的作用。在此基础上,可以对本发明进行多种替换和改进,这些均落入本发明的保护范围内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献