这是我 C++ 程序设计
这门课的课程设计,简单实现了一个具有简单语法的脚本的解释器并额外增加了编译至不可读状态的功能(虽然其实只是简单的异或操作)。
如果对程序有任何想法和建议的都欢迎前往我的博客评论或者 github 上留言交流~
闲的无聊的话也可以扫描二维码关注一下我的个人公众号!感谢!
- 自己简单定义了一个具有简单功能的脚本语言,程序实现了解释运行该脚本语言
- 基本实现了输入输出、变量定义、分支判断和跳转的功能
- 但因为自己没有仔细接触过编译原理,所以实现方法较为朴素,没有实现较为复杂的语法,也没有构造语法树。
- 实现了命令行命令的简单解析以支持
- 帮助信息输出
- 拖入文件执行脚本
- 编译脚本至不可读状态
- 使用该脚本语言编写了几个简单的程序,均放置在
scripts
目录下,除特殊说明均为UTF8
编码,包括:- 简单的语法演示 demo
script.mb
- 输出斐波那契数列
fibonacci.mb
- 输出九九乘法表
mulTable.mb
- 输入数字并进行冒泡排序
sort.mb
- 上述冒泡排序脚本的加密版
crypted_sort.mb
- 用于演示脚本能力的微型文字冒险游戏
mbworld.mb
(GB2312)
- 简单的语法演示 demo
请参见当时的课程设计文档(report.pdf),其中报告书封面未包含至该文件
- 程序只使用了标准库的内容,不依赖任何平台特性,因此可在任何平台下使用标准
C++
编译器编译 - 程序使用了
C++11
的标准故需要使用支持C++11
标准的编译器进行编译,下面的编译指令以g++
为例。
cd 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
- 也可直接将脚本文件拖进可执行文件执行,但是执行结束后程序不会自动暂停
- 由于解释器读脚本内容输出时会原样输出,因此如果脚本内存在中文的话,需要 终端编码 与 脚本文件编码 一致才不会乱码。
- 而
cmd
以及其他的一些终端在中文环境下默认是GBK
编码,因此这里提供的大部分UTF-8
编码的脚本直接打开会乱码。
- 设置终端的编码与脚本文件一致(
UTF-8
)再打开脚本- 如果是
cmd
的话可以首先执行chcp 65001
来切换至UTF-8
编码
- 如果是
- 将脚本文件编码转换至终端编码后再运行脚本
# 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