发明内容
本发明主要解决的技术问题是提供一种解析并执行程序语言的方法及解释装置,能够实现对上下行间有关系的代码的解析。
为解决上述技术问题,本发明采用的一个技术方案是:提供一种解析并执行程序语言的方法,包括以下步骤:解释器获取一行代码;对所述代码进行解析,以获得解析结果;如果所述解析结果包括变量时,将所述变量的信息存储在变量表中、或修改所述变量表中的所述变量的信息、或从所述变量表中获得所述变量的信息;如果所述解析结果包括程序跳转的语句时,记录调用程序的程序运行信息以及程序调用轨迹,以实现程序调用;如果所述解析结果包括控制语句时,记录控制语句信息以及控制语句嵌套轨迹,以实现控制语句的运行。
其中,所述程序运行信息包括程序的程序名、起始行号、运行行号、剩余循环次数及所在文件的文件句柄。
其中,所述如果解析结果包括程序跳转的语句时,记录调用程序的程序运行信息以及程序调用轨迹,以实现程序调用的步骤包括:如果解析结果包括程序调用语句时,进入调用的子程序,并记录所述子程序的程序运行信息,以及程序调用轨迹;如果所述解析结果包括程序结束标识时,根据所述程序结束标识所在的程序的剩余循环次数,判断是否结束所述程序,如果是,则根据所述程序调用轨迹返回上一级程序,并重新记录所述程序调用轨迹;如果不是,则根据所述程序运行信息返回所述程序的起始行,并重新记录所述程序运行信息。
其中,所述控制语句信息包括所述控制语句的类型、所在程序的文件名、起始行号、条件表达式及运行标识,其中,所述运行标识为控制语句中的条件表达式是否成立的标识。
其中,所述如果解析结果包括控制语句时,记录控制语句信息以及控制语句嵌套轨迹,以实现控制语句的运行的步骤包括:如果解析结果包括控制语句起始标识时,记录控制语句信息以及控制语句嵌套轨迹;如果解析结果包括控制语句结束标识时,根据所述控制语句嵌套轨迹读取正在运行的控制语句的类型,判断所述控制语句的类型与所述控制语句结束标识是否匹配,如果匹配,则根据控制语句信息,判断是否结束所述控制语句;如果是,则结束所述控制语句,并重新记录控制语句嵌套轨迹;如果不是,则根据所述控制语句信息返回所述控制语句的起始行,并重新记录所述控制语句信息。
其中,所述控制语句包括选择控制语句和循环控制语句。
其中,所述变量表包括系统变量表、全局变量表及局部变量表,其中,所述系统变量表用于记录系统变量的信息,所述全局变量表用于记录全局变量的信息,所述局部变量表用于记录局部变量的信息。
其中,所述解释器获取一行代码的步骤包括:解释器读取当前运行的程序的程序运行信息,根据所述程序运行信息,获取所述程序的一行代码。
其中,所述解释器包括词法分析器和语法分析器,其中,所述对所述代码进行解析的步骤包括:所述词法分析器对所述代码进行词法分析,判断是否符合所述词法分析器的规则,如果不符合,则进行报错处理,如果符合,则将词法分析结果向所述语法分析器发送,使得所述语法分析器对词法分析结果进行语法分析;所述语法分析器对所述词法分析器的词法分析结果的进行语法分析,判断是否符合所述语法分析器的规则,如果不符合,则进行报错处理;如果符合所述语法分析器的规则,则将所述语法分析器的分析结果作为所述解析结果。
其中,所述词法分析器为利用flex词法分析生成器对预设的词法规则进行翻译生成的词法分析器;所述语法分析器为利用bison语法分析器对预设的语法规则进行翻译生成的语法分析器。
其中,所述解释器用于工业机器人和数控系统。
为解决上述技术问题,本发明采用的另一个技术方案是:提供一种解释装置,包括获取模块、解析模块、变量处理模块、程序处理模块及控制语句处理模块;所述获取模块用于获取一行代码;所述解析模块用于对所述代码进行解析,以获得解析结果,并将解析结果向所述变量处理模块、程序处理模块及控制语句处理模块发送;所述变量处理模块用于在所述解析结果包括变量时,将所述变量的信息存储在变量表中、或修改所述变量表中的所述变量的信息、或从所述变量表中获得所述变量的信息;所述程序处理模块用于在所述解析结果包括程序跳转的语句时,记录调用程序的程序运行信息以及程序调用轨迹,以实现程序调用;所述控制语句处理模块用于在所述解析结果包括控制语句时,记录控制语句信息以及控制语句嵌套轨迹,以实现控制语句的运行。
其中,所述程序运行信息包括程序的程序名、起始行号、运行行号、剩余循环次数及所在文件的文件句柄。
其中,所述程序处理模块包括程序调用单元及程序结束单元;所述程序调用单元用于在解析结果包括程序调用语句时,进入调用的子程序,并记录所述子程序的程序运行信息,以及程序调用轨迹;所述程序结束单元用于在所述解析结果包括程序结束标识时,根据所述程序结束标识所在的程序的剩余循环次数,判断是否结束所述程序,在判断为结束所述程序时,根据所述程序调用轨迹返回上一级程序,并重新记录所述程序调用轨迹,在判断为不结束所述程序时,则根据所述程序运行信息返回所述程序的起始行,并重新记录所述程序运行信息。
其中,所述控制语句信息包括所述控制语句的类型、所在程序的文件名、起始行号、条件表达式及运行标识,其中,所述运行标识为控制语句中的条件表达式是否成立的标识。
其中,所述控制语句处理模块包括控制起始单元和控制结束单元;所述控制起始单元用于在解析结果包括控制语句起始标识时,记录控制语句信息以及控制语句嵌套轨迹;所住控制结束单元用于在解析结果包括控制语句结束标识时,根据所述控制语句嵌套轨迹读取正在运行的控制语句的类型,判断所述控制语句的类型与所述控制语句结束标识是否匹配,在匹配时,根据控制语句信息,判断是否结束所述控制语句,在判断为结束时,结束所述控制语句,并重新记录控制语句嵌套轨迹,在判断为不结束时,根据所述控制语句信息返回所述控制语句的起始行,并重新记录所述控制语句信息。
其中,所述控制语句包括选择控制语句和循环控制语句。
其中,所述变量表包括系统变量表、全局变量表及局部变量表,其中,所述系统变量表用于记录系统变量的信息,所述全局变量表用于记录全局变量的信息,所述局部变量表用于记录局部变量的信息。
其中,所述获取模块具体用于读取当前运行的程序的程序运行信息,根据所述程序运行信息,获取所述程序的一行代码。
其中,所述解析模块包括词法分析单元和语法分析单元,其中,所述词法分析单元用于对所述代码进行词法分析,判断是否符合所述词法分析单元的规则,在不符合时,进行报错处理,在符合时,将分析结果向语法分析单元发送;所述语法分析单元用于对所述词法分析单元的词法分析结果的进行语法分析,判断是否符合所述语法分析单元的规则,在不符合时,进行报错处理,在符合所述语法分析单元的规则时,将分析结果作为所述解析结果。
其中,所述词法分析单元为利用flex词法分析生成器对预设的词法规则进行翻译生成的词法分析器;所述语法分析单元为利用bison语法分析器对预设的语法规则进行翻译生成的语法分析器。
为解决上述技术问题,本发明采用的再一个技术方案是:提供一种工业机器人,包括上述的解释装置。
为解决上述技术问题,本发明采用的又再一个技术方案是:提供一种数控系统,包括上述的解释装置。
本发明的有益效果是:区别于现有技术的情况,本发明通过记录程序的运行信息及程序调用轨迹,使得解释器实现程序间的跳转;通过设置控制语句信息及控制语句嵌套轨迹,使得解释器实现控制语句的嵌套;通过设置变量表,以记录变量的信息,使得解释器实现进行变量的运算。故本发明实现了解释器对上下行间有关系的程序的解析,增强了解释器的解析功能。
具体实施方式
下面结合附图和具体的实施方式进行说明。
参阅图1至图3,图1是本发明解析并执行程序语言的方法一实施方式的流程图,图2是图1步骤S104中程序运行信息堆栈的结构示意图,图3是图1步骤S105中控制语句信息堆栈的结构示意图。本实施方式包括以下步骤:
步骤S101:解释器获取一行代码。
在工业机器人或数控系统中,本实施方式的解释器同样采用行解释方式。但为了能支持上下行间有关系的语句,解释器在解析程序代码的同时,也会记录运行程序的运行信息。解释器通过读取程序的运行信息,获悉需要解析的代码的行号,进而获取该行号的代码,以实现解析。而且,在解析并执行完该行代码后,解释器继续获取下一行代码,直到程序的代码全部解析并执行完。此外,在开机第一次获取代码前,应对解释器进行初始化,再进行代码的解析。需要说明的是,本实施方式中的解释器用于工业机器人或数控系统,但并不限于用于工业机器人或数据系统,在具体应用实施方式中,还可以用于任意需要解析并执行计算机语言的系统。
步骤S102:解释器对所述代码进行解析,以获得解析结果。
解释器对获取的代码进行解析,将代码解析为解释器可识别执行的格式,解释器再根据解析结果进行相应的处理。其中,如果解析结果包括变量,则进入步骤S103,如果解析结果包括程序跳转的语句,则进入步骤S104,如果解析结果包括控制语句,则进入步骤S105。
步骤S103:解释器将变量的信息存储在变量表中、或修改变量表中的变量信息、或从所述变量表中获得变量信息。
进一步地,如果解析结果包括变量赋值语句,则解释器将该变量的信息存储至变量表中,若变量表中已存在该变量信息,则修改变量表中的变量信息,以实现程序中的其他代码对该变量的使用。如果解析结果包括变量运算语句,则解释器从变量表中获取相应变量的信息,以实现本行代码对在其他代码中被赋值的变量的运算。其中,变量信息应包括变量名、变量类型及变量值。
步骤S104:解释器记录调用的程序的程序运行信息以及程序调用轨迹,以实现程序调用。
在解析结果包括程序跳转的语句时,解释器记录调用的子程序的程序运行信息以及程序调用轨迹,使得解释器可根据程序运行信息及程序调用轨迹实现程序间的跳转。
具体地,解释器通过建立程序运行信息堆栈实现程序运行信息以及程序调用轨迹的记录。请参阅图2,当调用子程序时,将子程序的运行信息推入程序运行信息堆栈的栈顶,以记录子程序的程序运行信息,以及程序间的调用轨迹。解释器可通过读取栈顶的运行信息获悉程序当前的运行情况,从而获取相应的代码继续进行解析。当结束子程序时,将运行的子程序弹出程序运行信息堆栈的栈顶,此时,结束的子程序的上一级程序运行信息处于堆栈的栈顶,解释器读取栈顶的运行信息,跳转回上一级程序,并获取相应的代码继续进行解析。解释器通过记录程序运行信息和调用轨迹,实现了主程序与子程序之间的跳转,且能实现程序的循环执行。
步骤S105:解释器记录控制语句信息以及控制语句嵌套轨迹,以实现控制语句的运行。
在解析结果包括控制语句时,解释器记录控制语句信息以及控制语句嵌套轨迹,使得解释器可根据记录控制语句信息以及控制语句嵌套轨迹实现控制语句间的嵌套和控制语句的执行。其中,控制语句包括选择控制语句和循环控制语句。例如:选择控制语句IF-ELSE-ENDIF,循环控制语句WHILE-ENDWHILE、FOR-ENFFOR、REPEAT-UNTIL等语句。
具体地,解释器通过建立控制语句信息堆栈实现控制语句信息以及控制语句轨迹的记录。请参阅图3,当进入控制语句时,将该控制语句的信息推入控制语句信息堆栈的栈顶。当结束控制语句时,将该控制语句弹出控制语句信息堆栈的栈顶,此时,该控制语句的上一级控制语句的信息处于堆栈的栈顶,解释器读取栈顶的控制语句信息,以获取相应的代码继续进行解析。解释器通过记录控制语句信息和嵌套轨迹,实现了控制语句间的嵌套,且能实现循环控制语句的循环执行。
区别于现有技术,本发明实施方式通过记录程序的运行信息及程序调用轨迹,使得解释器实现主程序与子程序之间的跳转及程序的循环执行;通过设置控制语句信息及控制语句嵌套轨迹,使得解释器实现了控制语句间的嵌套及循环控制语句的循环执行;通过设置变量表,以记录变量的信息,使得解释器实现进行变量的运算。故本发明实施方式实现了解释器对上下行间有关系的程序的解析,增强了解释器的解析功能。
请参阅图4,图4是本发明解析并执行程序语言的方法另一实施方式的流程图。在本实施方式包括以下步骤:
步骤S201:解释器读取当前运行的程序的程序运行信息。
解释器读取程序运行信息堆栈的栈顶中的程序运行信息,以获悉当前运行程序的状态。
步骤S202:解释器获取一行代码。
解释器根据获取的程序运行信息,获悉需要解析的代码的行号,进而获取该行号的代码,以实现解析。例如:解释器获取当前运行的程序的运行信息中的运行行号为58,则直到上一行运行代码为58行,故获取58加1为59行的代码,并将运行行号变为59,以表示当前运行59行。当然,解释器未必均在获取代码后将运行行号加1,在开始执行程序,即执行程序起始行时,则应将运行行号设为起始行号,以表示当前运行的行号为起始行。此外,解释器也未必仅限于在获取代码后更改运行行号,以表示当前运行行号,只要运行行号能提示解释器获取相应行的代码,均在本发明的保护范围之内。
步骤S203:词法分析器对代码进行词法分析。
本实施方式中,解释器包括词法分析器。词法分析器为通过flex词法分析生成器对预设的词法规则进行翻译生成的词法分析器。其中,词法规则为由正则表达式和C代码组成,根据正则表达式规定,解释器可识别的每个代码单词。具体地,flex词法分析生成器读入描述预设的词法规则的文件后,根据预设的词法规则的描述,生成一个可执行文件即词法分析器。由于内部使用有穷自动机,flex将词法规则中的正则表达式翻译成一种高效的词法分析器,使得词法分析器几乎可以同时处理所有需要匹配的模式,因此提高了解释器的词法分析速度。
解释器获取代码后,利用词法分析器分析获取的代码,为词法规则中的每一个正则表达式寻找匹配。当发现一个匹配时,词法分析器根据相关的C代码,确定与匹配的单词相应的标识符,以供解释器进行语法分析。
步骤S204:判断是否符合词法分析器的规则。
词法分析器判断代码是否符合词法规则。具体地,若代码中的单词无法与词法规则中的正则表达式匹配,则判断为代码不符合词法规则,解释器进入步骤S205进行报错处理。如果代码中的所有单词均可在词法规则中的正则表达式寻找到匹配,则进入步骤S206。
步骤S205:解释器报错处理。
解释器在发现代码词法有错或语法有错时,进行报错处理。
步骤S206:语法分析器对代码进行语法分析。
本实施方式中,解释器还包括语法分析器。语法分析器为利用bison语法分析器对预设的语法规则进行翻译生成的语法分析器。其中,语法规则为通过标识符的不同组合形式规定不同的执行动作。bison语法分析生成器读入描述预设的语法规则的文件后,根据预设的语法规则的描述,生成语法分析器。
语法分析器对词法分析器分析确定的标识符的组合形式进行语法分析,与语法规则中的标识符组合进行匹配。当发现匹配时,语法分析器获得语法规则中相应标识符组合的执行命令,根据执命令执行相应的动作。
步骤S207:判断是否符合语法分析器的规则。
语法分析器判断代码是否符合语法规则。具体地,语法分析器判断词法分析器对代码分析产生的标识符的组合是否属于语法规则中的标识符组合,如果不属于,则判断为代码不符合语法规则,进入步骤S205进行报错处理。如果属于,则判断为代码符合语法规则。
进一步地,语法分析器判断为代码符合语法规则后,还包括对代码进行语义分析。语法分析器分析代码有无语义错误。若有,则进行报错处理,若没有,则进入步骤S208。可以理解的是,语义分析是属于语法分析器的根据语法规则进行分析的,故语义分析也可以当做为语法分析的一部分,在此不作限定。
步骤S208:解释器获得解析结果。
解释器根据代码中标识符的组合,语法规则中获得相应的执行命令,作为解析结果。如果解析结果包括操作语句时,则进入步骤S209,如果解析结果包括变量,则进入步骤S210,如果解析结果包括程序跳转的语句,则进入步骤S211,如果解析结果包括控制语句,则进入步骤S212。
步骤S209:解释器获取并发送操作信息。
如果解析结果包括操作语句,则解释器根据操作语句,获取相应的外部操作模块可识别操作信息,并将操作信息向外部操作模块发送,使得外部操作模块根据操作信息,执行相应的操作,并在外部操作模块执行完该操作后,返回步骤S201继续进行下一行代码的解析并执行。例如,在工业机器人系统中,解释器对代码解析,并得到指示机器人向前移动一步的信息,解释器向外部操作模块发送向前移动一步的信息。使得外部操作模块接收到信息后,指示机器人向前移动一步。在机器人向前移动一步之后,解释器继续获取并解析下一行代码。
步骤S210:解释器将变量的信息存储在变量表中、或修改变量表中的变量信息、或从所述变量表中获得变量信息。
进一步地,如果解析结果包括变量赋值语句,则解释器将该变量的信息存储至变量表中,若变量表中已存在该变量信息,则修改变量表中的变量信息,以实现程序中的其他代码对该变量的使用。如果解析结果包括变量运算语句,则解释器从变量表中获取相应变量的信息,以实现本行代码对在其他代码中被赋值的变量的运算。其中,变量信息应包括变量名、变量类型及变量值。在解释器执行完该语句后,返回步骤S201继续获取另一行代码进行解析并执行。
本实施方式中,变量表包括系统变量表、全局变量表及局部变量表。其中,系统变量表用于存储系统变量的信息,全局变量表用于存储全局变量的信息,局部变量表用于存储局部变量的信息。关于系统变量、全局变量及局部变量进行以下说明:系统变量为由系统配置文件产生的,且系统中的各程序模块均能访问的变量。系统变量在系统关闭时被销毁,相应地,系统变量表在系统启动时建立,在系统关闭时销毁。全局变量为根据用户代码建立和访问的,且用户主程序和子程序可共享的变量。全局变量在一次主程序和子程序均运行结束时被销毁,相应地,全局变量在运行用户程序时建立,在一次用户程序运行结束时被销毁。局部变量为根据用户代码建立和访问的,且仅有一个程序使用的变量。局部变量在该程序结束时被销毁,相应地,局部变量表在程序运行时建立,在该程序运行结束时销毁。
在代码中,为了实现三种变量的区分,可在变量名前添加识别标识,即在变量名前加上系统标识作为系统变量,在变量名前加上全局标识作为全局变量,在变量名前加上局部标识作为局部标识。例如,系统标识设置为$,全局标识设置为,局部标识设置为#,即若在代码中出现“$v1=1”、“v2=2”、“#v3=3”,解释器则可区分出v1为系统变量,并在系统变量表中保存变量v1及其对应值为1,v2为全局变量,并在全局变量表中保存变量v2及其对应值为2,v3为局部变量,并在局部统变量表中保存变量v3及其对应值为3。当然,识别标识不一定设置在变量名前面,在其他实施方式中,可将解释器设置为根据变量名后加识别标识区分三种变量,进一步地说,该识别标识也并不限于为一个字符,在具体应用中,解释器可将该识别标识设置为字符串形式或者为一种特定格式。
步骤S211:解释器记录调用的程序的程序运行信息以及程序调用轨迹,以实现程序调用。
在解析结果包括程序跳转的语句时,解释器记录调用的子程序的程序运行信息以及程序调用轨迹,使得解释器可根据程序运行信息及程序调用轨迹实现程序间的跳转。在解释器执行完该语句后,返回步骤S201继续获取另一行代码进行解析并执行。其中,程序跳转的语句为执行程序间跳转的语句,包括程序调用语句和程序结束语句等。根据字面意思可以理解,程序调用语句即为执行调用子程序的语句,程序结束语句即为执行结束程序的语句,结束后,若有上一级程序,则返回上一级程序。
进一步地,如果解析结果包括程序调用语句时,解释器运行调用的子程序,记录子程序的程序运行信息,以及程序间的调用轨迹。如果解析结果包括程序结束标识时,根据程序结束标识所在的程序的剩余循环次数,判断是否结束所述程序。如果是,则根据程序调用轨迹返回上一级程序,并重新记录所述程序调用轨迹。如果不是,则根据程序运行信息返回所述程序的起始行,并重新记录所述程序运行信息。
本实施方式中,程序运行信息包括程序的程序名、起始行号、运行行号、剩余循环次数及所在文件的文件句柄。解释器通过建立程序运行信息堆栈实现程序运行信息以及程序调用轨迹的记录。当调用子程序时,将子程序的运行信息推入程序运行信息堆栈的栈顶,以记录子程序的程序运行信息,以及程序间的调用轨迹。解释器可通过读取栈顶的运行信息获悉程序当前的运行情况,从而获取相应的代码继续进行解析。当结束子程序时,将运行的子程序弹出程序运行信息堆栈的栈顶,此时,结束的子程序的上一级程序运行信息处于堆栈的栈顶,解释器读取栈顶的运行信息,跳转回上一级程序,并获取相应的代码继续进行解析。
举例具体说明,在主程序文件main.txt中,
“......
Line56:CALL sub1 ROW 2 LOOP 2(int pl=20)
......
Line90:RETURN”
解释器开始运行主程序main,并将主程序main的运行信息推入程序运行信息堆栈,其中,程序名为main,起始行号为1,剩余循环次数为1,文件句柄为fn0,运行行号为当前运行的行号。在解释器对56行进行解析后,获悉需要调用子程序sub1,并从子程序sub1的第2行开始执行,且子程序sub1循环执行两次。解释器运行子程序sub1的第2行,在子程序文件sun1.txt中,
“......
Line2:CALL sub2ROW25LOOP3(bool i2=true)
......
Line50:RETURN”
同理,解释器开始运行子程序sub1,并将子程序sub1的运行信息推入程序运行信息堆栈的栈顶,其中,程序名为sub1,起始行号为2,剩余循环次数为2,文件句柄为fn1,运行行号为当前运行的行号。在解释器对第2行进行解析后,获悉需要调用子程序sub2,并从子程序sub2的第25行开始执行,且子程序sub3循环执行3次。解释器运行子程序sub2的第25行,在子程序文件sun21.txt中,
“......
Line25:G01X50Y50
......
Line30:RETURN”
同理,解释器开始运行子程序sub2,并将子程序sub2的运行信息推入程序运行信息堆栈的栈顶,其中,程序名为sub2,起始行号为25,剩余循环次数为3,文件句柄为fn2,运行行号为当前运行的行号。解释器对第25行代码进行解析。此时,程序运行信息堆栈的堆栈内容如下:
程序名 |
起始行号 |
运行行号 |
剩余循环次数 |
文件句柄 |
main.txt |
1 |
56 |
1 |
fn0 |
sub1.txt |
2 |
89 |
2 |
fn1 |
sub2.txt |
25 |
25 |
3 |
fn2 |
当解释器执行完子程序sub2的第25行后,继续解析并执行第26行并将栈顶的运行行号改为26,直至解释器执行至第30行。解释器解析出该程序结束标识“RETURN”,此时,解释器获悉已执行子程序sub2一遍,故将栈顶的剩余循环次数减1,此时,剩余循环次数为2。解释器判断剩余循环次数是否为0,如果不是,则继续返回子程序sub2的起始行第25行重复执行子程序sub2,直至解释器解析到第30行的程序结束标识后,且剩余循环次数为0时,解释器判断为需要结束子程序sub2。解释器则将子程序sub2的运行信息弹出堆栈,此时,子程序sub1处于栈顶。解释器读取栈顶的运行信息,根据文件句柄fn1返回子程序sub1,并获悉子程序sub1执行完第89行,进而执行第90行代码,并将运行行号加1改为90。同理,当解释器解析到第50行的程序结束标识后,且剩余循环次数为0时,解释器判断为需要结束子程序sub1。解释器则将子程序sub1的运行信息弹出堆栈,此时,主程序main处于栈顶。解释器读取栈顶的运行信息,根据文件句柄fn0返回主程序main,并继续执行剩余的代码,直至解释器解析到第90行的程序结束标识后,且剩余循环次数为0,解释器将主程序main弹出堆栈。解释器通过记录程序运行信息和调用轨迹,实现了主程序与子程序之间的跳转,且能实现程序的循环执行。
更进一步地,在其他实施方式中,在程序调用时若存在参数,解释器可将参数存储在变量表中,使得主调程序能保存参数变量的更改。如主调程序中代码1为:“CALL sub(int pl=20)”,被调程序sub对应的代码2为“pl++”。解释器在执行代码1时,将参数“int pl=20”保存在变量表中,在执行被调程序中的代码2后,pl为21,并用更改后的pl的值替换变量表中原来的pl的值。当执行完被调程序sub返回主调程序后,由于变量表存储有pl的值,故主调程序可获悉参数pl的更改,并在后面的代码中实现对pl的正确运算。
步骤S212:解释器记录控制语句信息以及控制语句嵌套轨迹,以实现控制语句的运行。
在解析结果包括控制语句时,解释器记录控制语句信息以及控制语句嵌套轨迹,使得解释器可根据记录控制语句信息以及控制语句嵌套轨迹实现控制语句间的嵌套和控制语句的执行。在解释器执行完该语句后,返回步骤S201继续获取另一行代码进行解析并执行。其中,控制语句包括选择控制语句和循环控制语句。例如:选择控制语句IF-ELSE-ENDIF,循环控制语句WHILE-ENDWHILE、FOR-ENFFOR、REPEAT-UNTIL等语句。
本实施方式中,控制语句信息包括控制语句的类型、所在程序的文件名、起始行号、条件表达式及运行标识,其中,运行标识为控制语句中的条件表达式是否成立的标识。例如,当控制语句中的条件表达式成立时,运行标识为ture,反之,则运行标识为false。当然,运行标识不一定设置为true/false,在其他实施方式中,解释器可将运行标识设置为其他字符串或字符,解释器通过识别该运行标识,实现对判断控制语句的条件是否成立。
解释器通过建立控制语句信息堆栈实现控制语句信息以及控制语句轨迹的记录。当进入控制语句时,将该控制语句的信息推入控制语句信息堆栈的栈顶。当结束控制语句时,将该控制语句弹出控制语句信息堆栈的栈顶,此时,该控制语句的上一级控制语句的信息处于堆栈的栈顶,解释器读取栈顶的控制语句信息,以获取相应的代码继续进行解析。
进一步地,按结构上区分,控制语句还包括控制语句起始标识和结束标识。例如,选择控制语句IF-ELSE-ENDIF中,IF为控制语句起始标识,ENDIF为控制语句结束标识。循环控制语句WHILE-ENDWHILE中,WHILE为控制语句起始标识,ENDWHILE为控制语句结束标识。如果解析结果包括控制语句起始标识时,解释器将该控制语句的信息推入控制语句信息堆栈的栈顶,以记录控制语句信息以及控制语句嵌套轨迹。解释器可通过读取栈顶的控制语句信息获悉该控制语句当前状态,从而获取相应的代码继续进行解析。如果解析结果包括控制语句结束标识时,根据所述控制语句嵌套轨迹读取正在运行的控制语句的类型,判断所述控制语句的类型与所述控制语句结束标识是否匹配。如果匹配,则根据控制语句信息,判断是否结束所述控制语句。如果是,则结束所述控制语句,并将所述控制语句的信息弹出堆栈的栈顶,以重新记录控制语句嵌套轨迹。如果不是,则根据所述控制语句信息返回所述控制语句的起始行,并根据当前所述控制语句的状态,更改栈顶中的控制语句信息,以实现重新记录所述控制语句信息。
举例具体说明,在主程序文件main.txt中,
“Line1:int#ident=3;
Line2:IF(#ident<6)
Line3:G00X100Y30
Line4:WHILE(#ident<4)
Line5:G01X33Y99
Line6:#ident++;
Line7:ENDWHILE
Line8:ELSE
Line9:G00X99Y87
Line10:ENDIF”
解释器运行主程序main的第1行,获悉变量ident前面的标识#为局部标识,则确认ident为局部变量,并将int ident=3保存在主程序main的局部变量表中。解释器运行第2行,解析到该代码为控制语句起始标识“IF”,即将IF控制语句信息推进控制语句信息堆栈的栈顶,其中,该控制语句信息包括流程控制类型为条件类型IF,程序文件名为main.txt,控制语句起始行号2,条件表达式#ident<6,运行标识为判断条件表达式#ident<6是否成立,由于变量表中ident=3,故该条件成立,即运行标识为true。解释器读取运行标识为true,则表示执行IF中的内容,故解释器继续解析第3行,解析出该代码为操作语句,则相应获得该操作语句信息,并将操作信息向外部控制模块发送,使得外部控制模块实现相应的操作。外部控制模块执行后,解释器再解析第4行代码,解析为控制语句起始标识“WHILE”,即将WHILE控制语句信息推进控制语句信息堆栈的栈顶,包括流程控制类型为循环类型WHILE,程序文件名为main.txt,控制语句起始行号4,条件表达式#ident<4,运行标识为判断条件表达式#ident<4是否成立,由于变量表中ident=3,故该条件成立,即运行标识为true。此时,控制语句信息堆栈中的堆栈内容如下:
解释器获悉WHILE的运行标识为true,执行WHILE语句中的内容。解释器执行完第6行后,将局部变量表中的变量ident值改为4。当解析到第7行控制语句结束标识“ENDWHILE”时,解释器判断“ENDWHILE”与栈顶中的控制类型“WHILE”为匹配,即认为该控制语句结束标识是属于栈顶的控制语句的。对于循环控制语句,解释器需要在获得结束标识,且运行标识为false时,才能判断为循环语句结束。因此,解释器继续获悉栈顶的循环控制语句运行标识为true,即不能判断为结束循环语句。解释器返回起始行第4行,继续判断条件表达式是否成立,此时ident=4,故ident<4不成立,运行标识改为false。解释器不再循环执行WHILE语句的内容,直到解析到第7行“ENDWHILE”。同理,解释器判断该结束标识属于栈顶的控制语句,继续获取运行标识,此时运行标识为false,故解释器结束WHILE控制语句,并将栈顶的WHILE控制语句的信息弹出。解释器继续解析IF控制语句的第8行,解析出为控制语句ELSE,且与此时位于栈顶的IF类型匹配,且IF的运行标识为true,故解释器不执行ELSE的语句,直到解析到第10行控制语句结束标识ENDIF,解析器判断ENDIF是属于栈顶的IF语句的,故结束该选择控制语句,并将栈顶的IF控制语句的信息弹出。解释器通过记录控制语句信息和嵌套轨迹,实现了控制语句间的嵌套,且能实现循环控制语句的循环执行。
优化地,在其他实施方式中,还可以通过对词法规则和语法规则进行相应的设定,使得解释器能够识别坐标变换语句、轴定向及旋转语句及各种编程模态语句等,从而使得解释器所在的系统根据解释器发送的操作信息,相应自动执行的坐标变换、轴定向或轴旋转等。其中,识别坐标变换语句包括坐标旋转、比例缩放、镜像、平移等,轴定向及旋转语句包括轴的正反转及定位等,编程模态语句包括绝对编程、增量编程、不同单位制编程等。
更进一步地,也可以通过在语法规则设定一行多指令执行,使得解释器能够按照语法规则识别出一行中的多指令,并对解析结果进行执行。例如,对于数控系统的运动指令,在一行中实现运动G指令与辅助M指令、刀补T指令、速度F指令和轴运动S指令的多指令执行。
区别于现有技术,本发明实施方式通过记录程序的运行信息及程序调用轨迹,使得解释器实现主程序与子程序之间的跳转及程序的循环执行;通过设置控制语句信息及控制语句嵌套轨迹,使得解释器实现了控制语句间的嵌套及循环控制语句的循环执行;通过设置变量表,以记录变量的信息,使得解释器实现进行变量的运算。故本发明实现了解释器对上下行间有关系的程序的解析,增强了解释器的解析功能。此外,本发明实施方式通过利用flex词法分析生成器和bison语法分析生成器,分别生成词法、语法分析器,使得解析速度快。同时,在需要扩展或修改时,仅需要对词法或语法规则进行修改,再利用flex及bison工具即可生成新的词法、语法生成器,故具有较强的扩展性。
请参阅图5,图5是本发明解释装置一实施方式的结构示意图。本实施方式中,解释装置包括获取模块310、解析模块320、变量处理模块330、程序处理模块340及控制语句处理模块350。
获取模块310用于获取一行代码,并将获取的代码向解析模块320发送。在工业机器人或数控系统中,本实施方式的解释装置同样采用行解释方式。但为了能支持上下行间有关系的语句,解释装置在解析程序代码的同时,也会记录运行程序的运行信息。获取模块310通过读取程序的运行信息,获悉需要解析的代码的行号,进而获取该行号的代码,以实现解析。而且,在解释装置解析并执行完该行代码后,获取模块310继续获取下一行代码,直到程序的代码全部解析并执行完。此外,在开机第一次获取代码前,应对解释装置进行初始化,再进行代码的解析。需要说明的是,本实施方式中的解释装置用于工业机器人或数控系统,但并不限于用于工业机器人或数据系统,在具体应用实施方式中,本发明解释装置还可以用于任意需要解析并执行计算机语言的系统。
解析模块320用于对所述代码进行解析,以获得解析结果,并将解析结果向变量处理模块330、程序处理模块340及控制语句处理模块350发送。
变量处理模块330用于在解析结果包括变量时,将变量的信息存储在变量表中、或修改变量表中的变量信息、或从所述变量表中获得变量信息。
进一步地,如果解析结果包括变量赋值语句,则变量处理模块330将该变量的信息存储至变量表中,若变量表中已存在该变量信息,则修改变量表中的变量信息,以实现程序中的其他代码对该变量的使用。如果解析结果包括变量运算语句,则变量处理模块330从变量表中获取相应变量的信息,以实现本行代码对在其他代码中被赋值的变量的运算。其中,变量信息应包括变量名、变量类型及变量值。
程序处理模块340用于在解析结果包括程序跳转的语句时,记录调用的程序的程序运行信息以及程序调用轨迹,使得解释装置可根据程序运行信息及程序调用轨迹实现程序间的跳转,以实现程序调用。
具体地,程序处理模块340通过建立程序运行信息堆栈实现程序运行信息以及程序调用轨迹的记录。当调用子程序时,程序处理模块340将子程序的运行信息推入程序运行信息堆栈的栈顶,以记录子程序的程序运行信息,以及程序间的调用轨迹。当结束子程序时,程序处理模块340将运行的子程序弹出程序运行信息堆栈的栈顶,此时,结束的子程序的上一级程序运行信息处于堆栈的栈顶,程序处理模块340读取栈顶的运行信息,跳转回上一级程序。程序处理模块340通过记录程序运行信息和调用轨迹,实现了主程序与子程序之间的跳转,且能实现程序的循环执行。
控制语句处理模块350用于在解析结果包括控制语句时,记录控制语句信息以及控制语句嵌套轨迹,使得解释装置可根据记录控制语句信息以及控制语句嵌套轨迹实现控制语句间的嵌套和控制语句的执行。其中,控制语句包括选择控制语句和循环控制语句。例如:选择控制语句IF-ELSE-ENDIF,循环控制语句WHILE-ENDWHILE、FOR-ENFFOR、REPEAT-UNTIL等语句。
具体地,控制语句处理模块350通过建立控制语句信息堆栈实现控制语句信息以及控制语句轨迹的记录。当进入控制语句时,控制语句处理模块350将该控制语句的信息推入控制语句信息堆栈的栈顶。当结束控制语句时,控制语句处理模块350将该控制语句弹出控制语句信息堆栈的栈顶,此时,该控制语句的上一级控制语句的信息处于堆栈的栈顶,解释装置读取栈顶的控制语句信息,以获取相应的代码继续进行解析。控制语句处理模块350通过记录控制语句信息和嵌套轨迹,实现了控制语句间的嵌套,且能实现循环控制语句的循环执行。
区别于现有技术,本发明实施方式通过记录程序的运行信息及程序调用轨迹,使得解释装置实现主程序与子程序之间的跳转及程序的循环执行;通过设置控制语句信息及控制语句嵌套轨迹,使得解释装置实现了控制语句间的嵌套及循环控制语句的循环执行;通过设置变量表,以记录变量的信息,使得解释装置实现进行变量的运算。故本发明实施方式实现了解释装置对上下行间有关系的程序的解析,增强了解释装置的解析功能。
请参阅图6,图6是本发明解释装置另一实施方式的结构示意图。在本实施方式,解释装置包括获取模块410、解析模块420、操作处理模块430、变量处理模块440、程序处理模块450及控制语句处理模块460。其中,解析模块420包括词法分析单元421和语法分析单元422,程序处理模块450包括程序调用单元451和程序结束单元452,控制语句处理模块460包括控制起始单元461和控制结束单元462。
获取模块410用于读取当前运行的程序的程序运行信息,根据程序运行信息,获取一行代码,并将代码向解析模块420发送。获取模块410读取程序运行信息堆栈的栈顶中的程序运行信息,以获悉当前运行程序的状态。获取模块410再根据获取的程序运行信息,获悉需要解析的代码的行号,进而获取该行号的代码,以实现解析。例如:获取模块410获取当前运行的程序的运行信息中的运行行号为58,则直到上一行运行代码为58行,故获取58加1为59行的代码,并将运行行号变为59,以表示当前运行59行。当然,获取模块410未必均在获取代码后将运行行号加1,在开始执行程序,即执行程序起始行时,则应将运行行号设为起始行号,以表示当前运行的行号为起始行。此外,获取模块410也未必仅限于在获取代码后更改运行行号,以表示当前运行行号,只要运行行号能提示获取模块410获取相应行的代码,均在本发明的保护范围之内。
词法分析单元421用于对获取模块410发送的代码进行词法分析,并判断是否符合所述词法分析单元421的规则,在不符合时,进行报错处理,在符合时,将分析结果向语法分析单元422发送。具体地,词法分析单元421判断词法规则中是否存在正则表达式与代码中的单词匹配,在不存在时,判断为代码不符合词法规则,词法分析单元421进行报错处理。在词法规则中存在正则表达式与代码中的单词匹配时,判断为代码符合词法规则,词法分析单元421将分析结果向语法分析单元422发送。
进一步地,词法分析单元421为通过flex词法分析生成器对预设的词法规则进行翻译生成的词法分析器。其中,词法规则为由正则表达式和C代码组成,根据正则表达式规定,词法分析单元421可识别的每个代码单词。具体地,flex词法分析生成器读入描述预设的词法规则的文件后,根据预设的词法规则的描述,生成一个可执行文件即词法分析器。词法分析单元421对获取模块410发送的代码进行词法分析,即为代码在词法规则中的所有正则表达式中寻找匹配。当发现一个匹配时,词法分析单元421根据相关的C代码,确定与匹配的单词相应的标识符,并向语法分析单元422发送,以供语法分析单元422进行语法分析。由于内部使用有穷自动机,flex将词法规则中的正则表达式翻译成一种高效的词法分析器,使得词法分析器几乎可以同时处理所有需要匹配的模式,因此提高了词法分析单元421的词法分析速度。
语法分析单元422用于对词法分析单元421的词法分析结果的进行语法分析,并判断是否符合语法分析单元422的规则,在不符合时,进行报错处理,在符合时,将分析结果作为所述解析结果。具体地,语法分析单元422判断词法分析单元421对代码分析产生的标识符的组合是否属于语法规则中的标识符组合,在不属于时,判断为代码不符合语法规则,语法分析单元422进行报错处理。在属于时,判断为代码符合语法规则,语法分析单元422获得语法规则中相应标识符组合的执行命令,并作为解析结果向并操作处理模块430、变量处理模块440、程序处理模块450及控制语句处理模块460发送。
进一步地,语法分析单元422判断为代码符合语法规则后,还包括对代码进行语义分析。语法分析单元422分析代码有无语义错误。在有语义错误时,进行报错处理,在没有语义错误时,将解析结果向并操作处理模块430、变量处理模块440、程序处理模块450及控制语句处理模块460发送。可以理解的是,语义分析是属于语法分析单元422的根据语法规则进行分析的,故语义分析也可以当作为语法分析的一部分,在此不作限定。
更进一步地,语法分析单元422为利用bison语法分析器对预设的语法规则进行翻译生成的语法分析器。其中,语法规则为通过标识符的不同组合形式规定不同的执行动作。bison语法分析生成器读入描述预设的语法规则的文件后,根据预设的语法规则的描述,生成语法分析单元422。
操作处理模块430用于在解析结果包括操作语句时,根据操作语句,获取相应的外部操作模块可识别操作信息,并将操作信息向外部操作模块发送,使得外部操作模块根据操作信息,执行相应的操作。并且,在外部操作模块执行完该操作后,操作处理模块430才指示获取模块410继续进行下一行代码的解析并执行。例如,在工业机器人系统中,解析模块420对代码解析,操作处理模块430根据解析结果得到指示机器人向前移动一步的信息,并向外部操作模块发送向前移动一步的信息。使得外部操作模块接收到信息后,指示机器人向前移动一步。在机器人向前移动一步之后,获取模块410才继续获取并解析下一行代码。
变量处理模块440用于将变量的信息存储在变量表中、或修改变量表中的变量信息、或从所述变量表中获得变量信息。
进一步地,在解析结果包括变量赋值语句时,变量处理模块440将该变量的信息存储至变量表中,若变量表中已存在该变量信息,则修改变量表中的变量信息,以实现程序中的其他代码对该变量的使用。在解析结果包括变量运算语句时,变量处理模块440从变量表中获取相应变量的信息,以实现本行代码对在其他代码中被赋值的变量的运算。其中,变量信息应包括变量名、变量类型及变量值。
本实施方式中,变量表包括系统变量表、全局变量表及局部变量表。其中,系统变量表用于存储系统变量的信息,全局变量表用于存储全局变量的信息,局部变量表用于存储局部变量的信息。关于系统变量、全局变量及局部变量进行以下说明:系统变量为由系统配置文件产生的,且系统中的各程序模块均能访问的变量。系统变量在系统关闭时被销毁,相应地,系统变量表在系统启动时建立,在系统关闭时销毁。全局变量为根据用户代码建立和访问的,且用户主程序和子程序可共享的变量。全局变量在一次主程序和子程序均运行结束时被销毁,相应地,全局变量在运行用户程序时建立,在一次用户程序运行结束时被销毁。局部变量为根据用户代码建立和访问的,且仅有一个程序使用的变量。局部变量在该程序结束时被销毁,相应地,局部变量表在程序运行时建立,在该程序运行结束时销毁。
在代码中,为了实现三种变量的区分,可在变量名前添加识别标识,即在变量名前加上系统标识作为系统变量,在变量名前加上全局标识作为全局变量,在变量名前加上局部标识作为局部标识。例如,系统标识设置为$,全局标识设置为,局部标识设置为#,即若在代码中出现“$v1=1”、“v2=2”、“#v3=3”,解释装置可区分出v1为系统变量,并在系统变量表中保存变量v1及其对应值为1,v2为全局变量,并在全局变量表中保存变量v2及其对应值为2,v3为局部变量,并在局部统变量表中保存变量v3及其对应值为3。当然,识别标识不一定设置在变量名前面,在其他实施方式中,可将解释装置设置为根据变量名后加识别标识区分三种变量,进一步地说,该识别标识也并不限于为一个字符,在具体应用中,解释装置可将该识别标识设置为字符串形式或者为一种特定格式。
更进一步地,在其他实施方式中,在程序调用时若存在参数,变量处理模块440可将参数存储在变量表中,使得主调程序能保存参数变量的更改。如主调程序中代码1为:“CALL sub(int pl=20)”,被调程序sub对应的代码2为“pl++”。在解释装置执行代码1时,变量处理模块440将参数“int pl=20”保存在变量表中。解释装置在执行被调程序中的代码2后,pl为21,并用更改后的pl的值替换变量表中原来的pl的值。当执行完被调程序sub返回主调程序后,由于变量表存储有pl的值,故主调程序可获悉参数pl的更改,并在后面的代码中实现对pl的正确运算。
程序处理模块450用于在解析结果包括程序跳转的语句时,记录调用的程序的程序运行信息以及程序调用轨迹,使得解释装置可根据程序运行信息及程序调用轨迹实现程序间的跳转,以实现程序调用。其中,程序跳转的语句为执行程序间跳转的语句,包括程序调用语句和程序结束语句等。根据字面意思可以理解,程序调用语句即为执行调用子程序的语句,程序结束语句即为执行结束程序的语句,结束后,若有上一级程序,则返回上一级程序。
程序调用单元451用于在解析结果包括程序调用语句时,记录调用的子程序的程序运行信息,以及程序间的调用轨迹。
程序结束单元452用于在解析结果包括程序结束标识时,根据程序结束标识所在的程序的剩余循环次数,判断是否结束所述程序。在判断为结束时,根据程序调用轨迹返回上一级程序,并重新记录所述程序调用轨迹。在判断为不结束时,根据程序运行信息返回所述程序的起始行,并重新记录所述程序运行信息。
本实施方式中,程序运行信息包括程序的程序名、起始行号、运行行号、剩余循环次数及所在文件的文件句柄。程序处理模块450通过建立程序运行信息堆栈实现程序运行信息以及程序调用轨迹的记录。当调用子程序时,程序调用单元451将子程序的运行信息推入程序运行信息堆栈的栈顶,以记录子程序的程序运行信息,以及程序间的调用轨迹。当结束子程序时,程序结束单元452将运行的子程序弹出程序运行信息堆栈的栈顶,此时,结束的子程序的上一级程序运行信息处于堆栈的栈顶,程序结束单元452读取栈顶的运行信息,跳转回上一级程序。
举例具体说明,在主程序文件main.txt中,
“......
Line56:CALL sub1ROW2LOOP2(int pl=20)
......
Line90:RETURN”
解释装置开始运行主程序main。程序调用单元451并将主程序main的运行信息推入程序运行信息堆栈,其中,程序名为main,起始行号为1,剩余循环次数为1,文件句柄为fn0,运行行号为当前运行的行号。在解析模块420对56行进行解析后,获悉需要调用子程序sub1,并从子程序sub1的第2行开始执行,且子程序sub1循环执行两次。解释装置运行子程序sub1的第2行,在子程序文件sun1.txt中,
“......
Line2:CALL sub2ROW25LOOP3(bool i2=true)
......
Line50:RETURN”
同理,解释装置开始运行子程序sub1。程序调用单元451将子程序sub1的运行信息推入程序运行信息堆栈的栈顶,其中,程序名为sub1,起始行号为2,剩余循环次数为2,文件句柄为fn1,运行行号为当前运行的行号。在解析模块420对第2行进行解析后,获悉需要调用子程序sub2,并从子程序sub2的第25行开始执行,且子程序sub3循环执行3次。解释装置运行子程序sub2的第25行,在子程序文件sun21.txt中,
“......
Line25:G01X50Y50
......
Line30:RETURN”
同理,解释装置开始运行子程序sub2。程序调用单元451将子程序sub2的运行信息推入程序运行信息堆栈的栈顶,其中,程序名为sub2,起始行号为25,剩余循环次数为3,文件句柄为fn2,运行行号为当前运行的行号。解析模块420对第25行代码进行解析。此时,程序运行信息堆栈的堆栈内容如下:
程序名 |
起始行号 |
运行行号 |
剩余循环次数 |
文件句柄 |
main.txt |
1 |
56 |
1 |
fn0 |
sub1.txt |
2 |
89 |
2 |
fn1 |
sub2.txt |
25 |
25 |
3 |
fn2 |
当解释装置执行完子程序sub2的第25行后,继续解析并执行第26行并将栈顶的运行行号改为26,直至解释装置执行至第30行。解析模块420解析出该程序结束标识“RETURN”,此时,程序结束单元452获悉已执行子程序sub2一遍,故将栈顶的剩余循环次数减1,此时,剩余循环次数为2。程序结束单元452判断剩余循环次数是否为0,在不是时,继续返回子程序sub2的起始行第25行重复执行子程序sub2,直至解析模块420解析到第30行的程序结束标识后,且剩余循环次数为0时,程序结束单元452判断为需要结束子程序sub2。程序结束单元452则将子程序sub2的运行信息弹出堆栈,此时,子程序sub1处于栈顶。程序结束单元452读取栈顶的运行信息,根据文件句柄fn1返回子程序sub1。解释装置获悉子程序sub1执行完第89行,进而执行第90行代码,并将运行行号加1改为90。同理,当解析模块420解析到第50行的程序结束标识后,且剩余循环次数为0时,程序结束单元452判断为需要结束子程序sub1。程序结束单元452则将子程序sub1的运行信息弹出堆栈,此时,主程序main处于栈顶。程序结束单元452读取栈顶的运行信息,根据文件句柄fn0返回主程序main。解释装置继续执行剩余的代码。直至解析模块420解析到第90行的程序结束标识后,且剩余循环次数为0,程序结束单元452将主程序main弹出堆栈。程序处理模块450通过记录程序运行信息和调用轨迹,实现了主程序与子程序之间的跳转,且能实现程序的循环执行。
控制语句处理模块460用于在在解析结果包括控制语句时,记录控制语句信息以及控制语句嵌套轨迹,使得解释装置可根据记录控制语句信息以及控制语句嵌套轨迹实现控制语句间的嵌套和控制语句的执行。
本实施方式中,控制语句信息包括控制语句的类型、所在程序的文件名、起始行号、条件表达式及运行标识,其中,运行标识为控制语句中的条件表达式是否成立的标识。例如,当控制语句中的条件表达式成立时,运行标识为ture,反之,则运行标识为false。当然,运行标识不一定设置为true/false,在其他实施方式中,控制语句处理模块460可将运行标识设置为其他字符串或字符,控制语句处理模块460通过识别该运行标识,实现对判断控制语句的条件是否成立。
进一步地,按结构上区分,控制语句还包括控制语句起始标识和结束标识。例如,选择控制语句IF-ELSE-ENDIF中,IF为控制语句起始标识,ENDIF为控制语句结束标识。循环控制语句WHILE-ENDWHILE中,WHILE为控制语句起始标识,ENDWHILE为控制语句结束标识。
控制起始单元461用于在解析结果包括控制语句起始标志时,将该控制语句的信息推入控制语句信息堆栈的栈顶,以记录控制语句信息以及控制语句嵌套轨迹。
控制结束单元462用于在解析结果包括控制语句结束标识时,根据控制语句嵌套轨迹读取正在运行的控制语句的类型,判断所述控制语句的类型与所述控制语句结束标识是否匹配。在匹配时,根据控制语句信息,判断是否结束所述控制语句。在判断为结束控制语句时,控制结束单元462结束所述控制语句,并将所述控制语句的信息弹出堆栈的栈顶,以重新记录控制语句嵌套轨迹。在判断为不结束控制语句时,根据所述控制语句信息返回所述控制语句的起始行,并根据当前所述控制语句的状态,更改栈顶中的控制语句信息,以实现重新记录所述控制语句信息。
举例具体说明,在主程序文件main.txt中,
“Line1:int#ident=3;
Line2:IF(#ident<6)
Line3:G00X100Y30
Line4:WHILE(#ident<4)
Line5:G01X33Y99
Line6:#ident++;
Line7:ENDWHILE
Line8:ELSE
Line9:G00X99Y87
Line10:ENDIF”
解释装置运行主程序main的第1行,获悉变量ident前面的标识#为局部标识,则确认ident为局部变量。变量处理模块440将int ident=3保存在主程序main的局部变量表中。解释装置运行第2行,解析到该代码为控制语句起始标识“IF”。控制起始单元461将IF控制语句信息推进控制语句信息堆栈的栈顶,其中,该控制语句信息包括流程控制类型为条件类型IF,程序文件名为main.txt,控制语句起始行号2,条件表达式#ident<6,运行标识为判断条件表达式#ident<6是否成立,由于变量表中ident=3,故该条件成立,即运行标识为true。解释装置读取运行标识为true,则表示执行IF中的内容,故解释装置继续解析第3行,解析出该代码为操作语句,则相应获得该操作语句信息,并将操作信息向外部控制模块发送,使得外部控制模块实现相应的操作。在外部控制模块执行后,解释装置再解析第4行代码,解析为控制语句起始标识“WHILE”。控制起始单元461将WHILE控制语句信息推进控制语句信息堆栈的栈顶,包括流程控制类型为循环类型WHILE,程序文件名为main.txt,控制语句起始行号4,条件表达式#ident<4,运行标识为判断条件表达式#ident<4是否成立,由于变量表中ident=3,故该条件成立,即运行标识为true。此时,控制语句信息堆栈中的堆栈内容如下:
解释装置获悉WHILE的运行标识为true,执行WHILE语句中的内容。解释装置执行完第6行后,将局部变量表中的变量ident值改为4。当解析到第7行控制语句结束标识“ENDWHILE”时,控制结束单元462判断“ENDWHILE”与栈顶中的控制类型“WHILE”为匹配,即认为该控制语句结束标识是属于栈顶的控制语句的。对于循环控制语句,控制结束单元462需要在获得结束标识,且运行标识为false时,才能判断为循环语句结束。因此,控制结束单元462继续获悉栈顶的循环控制语句运行标识为true,即不能判断为结束循环语句。控制结束单元462返回起始行第4行,继续判断条件表达式是否成立,此时ident=4,故ident<4不成立,运行标识改为false。解释装置不再循环执行WHILE语句的内容,直到解析到第7行“ENDWHILE”。同理,控制结束单元462判断该结束标识属于栈顶的控制语句,继续获取运行标识,此时运行标识为false,故控制结束单元462结束WHILE控制语句,并将栈顶的WHILE控制语句的信息弹出。解释装置继续解析IF控制语句的第8行,解析出为控制语句ELSE,且与此时位于栈顶的IF类型匹配,且IF的运行标识为true,故解释装置不执行ELSE的语句。直到解析到第10行控制语句结束标识ENDIF,控制结束单元462判断ENDIF是属于栈顶的IF语句的,故结束该选择控制语句,并将栈顶的IF控制语句的信息弹出。控制语句处理模块460通过记录控制语句信息和嵌套轨迹,实现了控制语句间的嵌套,且能实现循环控制语句的循环执行。
区别于现有技术,本发明实施方式通过记录程序的运行信息及程序调用轨迹,使得解释装置实现主程序与子程序之间的跳转及程序的循环执行;通过设置控制语句信息及控制语句嵌套轨迹,使得解释装置实现了控制语句间的嵌套及循环控制语句的循环执行;通过设置变量表,以记录变量的信息,使得解释装置实现进行变量的运算。故本发明实现了解释装置对上下行间有关系的程序的解析,增强了解释装置的解析功能。此外,本发明实施方式通过利用flex词法分析生成器和bison语法分析生成器,分别生成词法、语法分析单元,使得解析速度快。同时,在需要扩展或修改时,仅需要对词法或语法规则进行修改,再利用flex及bison工具即可生成新的词法、语法生成单元,故具有较强的扩展性。
在另一实施方式中,提供了一种工业机器人,该工业机器人包括上述任一实施方式所述的解释装置。
在再一实施方式中,提供了一种数控系统,该数控系统包括上述任一实施方式所述的解释装置。
以上所述仅为本发明的实施方式,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。