如何设计一门新的脚本语言?

来源:互联网 发布:淘宝店铺设置优惠券 编辑:程序博客网 时间:2024/05/16 20:28
在项目开发中,有时候我们需要设计一种属于自己的脚步语言来自动化地执行一些业务逻辑。这篇文章和大家一起探讨一下如何设计一门新的脚本语言?

一. 定义语法
我们这里举个最简单的支持for循环的功能:
<script>      : [<command>...]
<command>     : <commandname> [<argument> ...]
<commandname> : for|next|break|continue|
                let|print
<argument>    : <literal>|<variable>
<literal>     : "<string>"
<variable>    : $<name>$

当然我们可以在这基础上扩充,比如:
<commandname> : for|next|break|continue|
                if|else|endif|let|print|
                while|endwhile|SetTestStatus

二. 举例
let $iMax$ "2"
for "i" "1" $iMax$ "1"
   print "Test script"
next "i"

三. 类关系图和伪代码
下面列出包含的类:
* ConfigParser(parse())
打开脚本文件,并将所有行存放到一个数组里

* ScriptEngine(m_cmdArray, m_varMap, Execute())
解析来自ConfigParser返回的数组里所有脚本命令行的主要类
m_cmdArray: 包含所有脚本命令行的数组
m_varMap: 变量名及对应值的映射

* Tokenizer(ParseCommandArgs())
词法分析器,返回某脚本行对应的命令类型,文字数组和变量符号数组

* CmdBase(m_cmdType, m_argArray, m_varArray, m_pScriptEngine, Execute(), AssignFromVariables(), AssignToVariables())
所有命令的基类
m_cmdType: 传入的命令类型
m_argArray: 传入的文字数组
m_varArray: 传入的变量符号数组
m_pScriptEngine: 指向ScriptEngine实例的指针

* CmdLet((AssignFromVariables(), AssignToVariables())
执行let命令的CmdBase子类

* CmdFor
执行for命令的CmdBase子类

* CmdNext
执行next命令的CmdBase子类

* CmdPrint
执行print命令的CmdBase子类

* LoopBase(m_loopCmdInd, m_endOfLoopCmdInd, VarIncrement())
执行循环体的基类(可以作为for, while等循环的基类)

* LoopFor(m_endValue, m_stepValue, Increment(), IterationNeeded())
执行for循环的LoopBase子类

4. 流程图





原创粉丝点击