Giter VIP home page Giter VIP logo

mbat's Introduction

MBat 脚本解释器

1. 这是什么?

这是我 C++ 程序设计 这门课的课程设计,简单实现了一个具有简单语法的脚本的解释器并额外增加了编译至不可读状态的功能(虽然其实只是简单的异或操作)。
如果对程序有任何想法和建议的都欢迎前往我的博客评论或者 github 上留言交流~
闲的无聊的话也可以扫描二维码关注一下我的个人公众号!感谢! mpwx_qrcode

2. 它的基本功能是什么?

  • 自己简单定义了一个具有简单功能的脚本语言,程序实现了解释运行该脚本语言
  • 基本实现了输入输出、变量定义、分支判断和跳转的功能
    • 但因为自己没有仔细接触过编译原理,所以实现方法较为朴素,没有实现较为复杂的语法,也没有构造语法树。
  • 实现了命令行命令的简单解析以支持
    • 帮助信息输出
    • 拖入文件执行脚本
    • 编译脚本至不可读状态
  • 使用该脚本语言编写了几个简单的程序,均放置在 scripts 目录下,除特殊说明均为 UTF8 编码,包括:
    • 简单的语法演示 demo script.mb
    • 输出斐波那契数列 fibonacci.mb
    • 输出九九乘法表 mulTable.mb
    • 输入数字并进行冒泡排序 sort.mb
    • 上述冒泡排序脚本的加密版 crypted_sort.mb
    • 用于演示脚本能力的微型文字冒险游戏 mbworld.mb (GB2312)

3. 程序的大体设计是怎样的?

请参见当时的课程设计文档(report.pdf),其中报告书封面未包含至该文件

4. 如何编译运行?

编译

  • 程序只使用了标准库的内容,不依赖任何平台特性,因此可在任何平台下使用标准 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
  • 也可直接将脚本文件拖进可执行文件执行,但是执行结束后程序不会自动暂停

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.