手把手教你写脚本引擎(二)——号令脚本[VC/C++编程]
本文“手把手教你写脚本引擎(二)——号令脚本[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这次要实现的是一个情势最简单的脚本.这种脚本唯一号令、标号及跳转构成,看起来就跟汇编一样,不过好是对比好读的.固然这种脚本语言的语法非常简单,但是最基本的要素还是要有的.
作为一个脚本引擎,为了可以在各种各样的符合的宿主程序中利用,脚本本身最好不要触及到具体的范畴.当然,假如这个脚本被成立的目的仅仅是为了某个范畴的话,那就无所谓了.因此,一个脚本引擎需求一个查抄和运行代码的机制、运行时环境的保护以及一个功效充足利用的插件系统.一个完好的脚本引擎至少需求以下部件:
1、代码数据构造.代码的数据构造用来存放经过解析的脚本代码.事实上注释型的脚本引擎,也就是边履行边解析代码字符串的脚本引擎是对比难做,并且效率也不高的.脚本代码经过事前解析,可以查抄一出一些在运行之前就可以够查抄的错误.并且我们把脚本的代码重新处理成一个数据构造之后,履行也变得越发简单掌握.
2、运行时环境.运行时环境用于存放脚本在运行的历程中产生的数据,比方仓库、变量和状况信息等.关于一个已知的代码,差别的运行时环境代表差别的脚本履行流程.为了让脚本可以同时(但不一定是并发)履行,将运行时环境独立出来也就显得必要了.
3、语法解析器.语法解析器用于将代码转换成等价的代码数据构造,并在发现代码出错的时刻输出符合的错误信息.
4、插件.插件是脚本与外部环境交互的途径之一.有了插件系统,我们可认为脚本引擎增添额外的、跟脚本引擎无关的功效,比方文件操作、屏幕输入输出等.假如必要的话,插件系统可以将脚本引擎与范畴信息彼此断绝,系统将变得越发简单利用.
5、虚拟机.虚拟机用于履行代码并返回呼应的后果.我们在利用脚本引擎时直接跟虚拟机举行交互,虚拟机则调和上述4个部件的彼此合作.
在知道了这些之后,我们便可以开始开辟一个基于号令的脚本引擎了.为了越发具体以及明确地报告开辟历程以及原理,在这里将构造一门简单的基于号令的语言.一门语言至少还是要有分支和循环的.但是为了简化,我们将分支和循环分化成判断与跳转.语言可以安闲增添标号,标号将作为跳转的目标而呈现.这门语言利用以下语法:
<值>:值可以是整数、小数、字符串或名字.
<名>:名可以是变量名大概标号等,利用字母与下划线开始,后接不定数目的字母、下划线与数字.
<名>::名字后接冒号代表一个标号.这个标号代表着一个指令的位置,用于指定跳转目标.
goto <名>:goto用于直接跳转到一个位置持续履行.
set <名> <值>:set用于将一个值赋值给一个指命名字的变量.这个变量不存在则成立.
opcode <名> <值> <值>:opcode可以是add、minus、mul、div、idiv或mod.这6个号令将两个值举行加、减、乘、除、整除及求余,并将后果赋值给一个指命名字的变量.这个变量不存在则成立.
if <值>[ opcode <值>] goto <名>:if用于判断一个条件并在条件满意被满意的时刻跳转到指定的地方.条件可以是一个值,这个值必须是整数,并且在这个值不为0的时刻条件被满意.条件也可以是一个对比,这个时刻opcode可以是is、is_not、less_than、greater_than、less_equal或greater_equal,辨别在第一个值等于、不等于、小于、大于、小于或等于、大于或等于第二个值的时刻满意条件.
exit:完毕履行
<名> <值>*:假如号令名称不是上面的5种的此中一种的话,那么这个号令将被传送给插件举行履行.这个时刻,号令可以有肆意的参数.
在这种语法下,我们可以假定宿主程序给了我们write、writeln和read号令用于输入输出,并得到一个判断输入的数字能否质数的程序:
write "请输入一个数字:"
read Number
if Number less_then 2 goto FAIL
if Number is 2 goto SUCCESS
set Divisor 2
LOOP_BEGIN:
if Number is Divisor goto SUCCESS
mod Remainder Number Divisor
if Remainder is 0 goto FAIL
add Divisor Divisor 1
goto LOOP_BEGIN
SUCCESS:
writeln Number "是质数."
exit
FAIL:
writeln Number "不是质数."
以上是“手把手教你写脚本引擎(二)——号令脚本[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |