如何设计一门新的脚本语言?
来源:互联网 发布:淘宝店铺设置优惠券 编辑:程序博客网 时间: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返回的数组里所有脚本命令行的主要类
打开脚本文件,并将所有行存放到一个数组里
* 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
* CmdNext
* CmdPrint
* LoopBase(m_loopCmdInd, m_endOfLoopCmdInd, VarIncrement())
执行循环体的基类(可以作为for, while等循环的基类)
* LoopFor(m_endValue, m_stepValue, Increment(), IterationNeeded())
执行for循环的LoopBase子类
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. 流程图
- 如何设计一门新的脚本语言?
- 脚本语言的分析和设计
- cst脚本语言的设计【1】设计背景
- CST脚本语言的设计【2】规划
- CST脚本语言的设计【3】适用范围
- CST 脚本语言的设计【4】LINQ
- 设计随想--脚本语言
- 自制脚本语言(1) 词法、语法、虚拟机的设计思路
- 自制脚本语言(2) LR(1) parser generator的设计
- 如何实现一个脚本语言?
- 如何使我们的COM对象可以被脚本语言调用
- 如何使我们的COM对象可以被脚本语言调用
- 简易模式脚本语言(PS)设计
- 领域知识--脚本,脚本语言,常见的脚本语言,脚本语言分类
- 脚本语言的定义。
- 脚本语言的应用
- 脚本语言的概述
- 无效的默认脚本语言
- 广州传智播客.net训练营加新课了
- iOS如何判断当前网络的运营商
- Java WEB安全问题及解决方案
- 短歌行
- ffmpeg 常用命令行
- 如何设计一门新的脚本语言?
- UML中关联、依赖、聚集等关系的异同
- 内盘外盘
- windowphone在任何页面点返回退出
- Java泛型得到T.class
- 16进制颜色代码
- Apache服务器 + PHP + MySQL
- GIT仓库如何恢复到前一次提交
- VC的MFC中重绘函数的使用总结(整理)