MBat脚本解释器 -《C++程序设计》课程设计项目分享
最近刚好在整理自己之前折腾过的乱七八糟的小东西,稍微能看的内容会大致写个说明并附上当时的课程设计报告传到 github 上,另外如果对程序有任何想法和建议的都欢迎在评论或者 github 上留言交流~
代码其实写的也都一般,如果能给一些人提供一些参考和帮助是再好不过了,当然如果觉得我哪里写的不太对也都希望指教~
代码和本 readme 以及当时的课程设计报告都托管在了 github 页面上,可以点击这里前往。
MBat 脚本解释器
1. 这是什么?
这是我 C++ 程序设计
这门课的课程设计,简单实现了一个具有简单语法的脚本的解释器并额外增加了编译至不可读状态的功能(虽然其实只是简单的异或操作)。
代码和本 readme 以及当时的课程设计报告都托管在了 github 页面上,可以点击这里前往。
2. 它的基本功能是什么?
- 自己简单定义了一个具有简单功能的脚本语言,程序实现了解释运行该脚本语言
基本实现了输入输出、变量定义、分支判断和跳转的功能
- 但因为自己没有仔细接触过编译原理,所以实现方法较为朴素,没有实现较为复杂的语法,也没有构造语法树。
实现了命令行命令的简单解析以支持
- 帮助信息输出
- 拖入文件执行脚本
- 编译脚本至不可读状态
使用该脚本语言编写了几个简单的程序,均放置在
scripts
目录下,除特殊说明均为UTF8
编码,包括:- 简单的语法演示 demo
script.mb
- 输出斐波那契数列
fibonacci.mb
- 输出九九乘法表
mulTable.mb
- 输入数字并进行冒泡排序
sort.mb
- 上述冒泡排序脚本的加密版
crypted_sort.mb
- 用于演示脚本能力的微型文字冒险游戏
mbworld.mb
(GB2312)
- 简单的语法演示 demo
3. 程序的大体设计是怎样的?
请参见当时的课程设计文档(report.pdf),其中报告书封面未包含至该文件
4. 如何编译运行?
编译
- 代码和本 readme 都托管在了 github 上,可以点击这里前往。
- 程序只使用了标准库的内容,不依赖任何平台特性,因此可在任何平台下使用标准
C++
编译器编译 - 程序使用了
C++11
的标准故需要使用支持C++11
标准的编译器进行编译,下面的编译指令以g++
为例。
git clone https://github.com/tamce/mbat.git
cd mbat/code/src
g++ *.cpp -o mbat.exe
执行
# Show help message
mbat help
# Run script
mbat script.mb
# Compile script
mbat compile script.mb crypted.mb
- 也可直接将脚本文件拖进可执行文件执行,但是执行结束后程序不会自动暂停
5. 为什么执行会乱码?如何解决?
为什么会乱码?
- 由于解释器读脚本内容输出时会原样输出,因此如果脚本内存在中文的话,需要 终端编码 与 脚本文件编码 一致才不会乱码。
- 而
cmd
以及其他的一些终端在中文环境下默认是GBK
编码,因此这里提供的大部分UTF-8
编码的脚本直接打开会乱码。
如何解决?
设置终端的编码与脚本文件一致(
UTF-8
)再打开脚本- 如果是
cmd
的话可以首先执行chcp 65001
来切换至UTF-8
编码
- 如果是
- 将脚本文件编码转换至终端编码后再运行脚本
6. 脚本语法预览(script.mb)
# MBat 语法演示
# 以 # 开头的行为注释行
# 在除了命令的任何位置均可以使用变量,格式为 ${variableName}
# 设置变量值
set var = 0
set MAX = 20
# 输出然后换行
echol var=${var}
# 定义一个标签
:tag start
# 输出但不换行
echo 输入一个数字来累加:
# 输入一个值到变量中
input i
# 计算一个表达式,结果保存到变量中,支持加减乘除和求模运算
calc var = ${var} + ${i}
echol var=${var}
# if 语句,支持 `=,>,<` 三种比较,忽略比较符号前后的空白符
if [${var} > ${MAX}] goto tooBig
echo 要继续累加吗?(y/n)
input i
if [${i} = y] goto start
echol Bye!
# 跳转语句,其中 eof 标签保留为文件末
goto eof
:tag tooBig
echol 累加值已经超过预设值了~
echol Bye!
goto eof
代码和本 readme 以及当时的课程设计报告都托管在了 github 页面上,可以点击这里前往。
我的博客: https://blog.tamce.cn
我的个人公众号: