SwordScript - 使用C#开发脚本语言(一)基础设定

676 阅读5分钟

引言

脚本语言,一般是指解释执行的语言。在程序开发过程中,有些部分因为有实时修改、降低开发难度、隔离主要代码的需求,故使用脚本语言来作为辅助性质的语言。

并且作为程序员,相信很多人都有着自己开发一门语言的想法,这好比作为创世神想要能够亲自开天辟地一般。而开发一门脚本语言则是不错的入门途经。

笔者也是抱有这样的想法,并阅读了《两周自制脚本语言》一书,该书使用Java作为开发语言,而此时笔者想,与Java类似的C#语言是否也可以用于开发脚本语言。因此有了该尝试。

使用C#开发脚本语言,相较C语言等,好处在于脚本语言可以使用面向对象的开发方式,且GC部分可直接借助宿主语言的GC功能,缺点则是性能会相对较差。

在此篇文章中,笔者将使用C#与Sprache库开发一门简单且现代的脚本语言:SwordScript

本文章所有代为放于GitHub仓库:github.com/magicskyswo…

SwordScript预计将具有以下功能:

  • 基本的赋值、表达式计算
  • if、while等流程控制
  • 定义函数、调用函数
  • lambda、函数闭包
  • 调用原生函数(此处指C#函数)功能

由于个人水平限制,文中部分实现可能并非最优实现,关于代码纰漏之处,欢迎各位读者指出。

语言设计

在一门脚本语言的开始阶段,首先需要设计语言的基础语法、基础类型等。 让我们从最基础的部分开始:

基础类型:

在语言设计之初,先不考虑复杂的面向对象类型。因此,笔者在这先选择几种最常用的类型作为语言的基础类型:

  • 整形数字
  • 浮点数字
  • 字符串
  • 布尔值
  • 空值 为方便脚本语言中进行大数值计算,在此处整形类型使用long、浮点类型使用double。而字符串类型则是使用默认的string

整形数字

整形的定义较为简单,我们将连续的数字统一定义为整形数字(不考虑负号)

0
123
987654321

浮点数字

浮点数字与整形的区别在于,浮点数字可以指代极大或极小的含小数数字。因此,我们将整形定义为数字(可省略).数字的格式

0.0
.2
.99
3.1415926
99999.99999

字符串

字符串是语言之中表示文本的类型。在字符串之中,我们定义字符串为"文本",以引号包裹的内容为字符串,且在字符串之中,支持"表示引号,\表示\号,\n表示换行等

布尔值

布尔值在程序中代表真与假,定义则相对较简单,只需要truefalse两种即可。

空值

空值一般代表没有对应的值或引用,使用null来代表空值。

标识符

标识符是标识某一实体的符号,在编程语言中,通常用于指代变量、常量、函数、类型等。 而标识符的定义规则也代表着变量的取名规则。 一般C语言当中,对标识符的定义为: 以字母或下划线开头、包含字母、下划线、数字的非保留字符

  • 非保留字符:一般指if、else、while等已有定义的字符 在脚本语言中,我们可以对其进行扩展,使其支持中文或其他语言的文字。 在扩展后,标识符的定义为: 以Unicode字符或下划线开头、包含Unicode字符、下划线、数字的非保留字符
  • Unicode字符:指Unicode编码中,在字符类型里的文字,包括字母、中文、日文、俄语等等语言文字

基础语法:

语句

在脚本语言中,语法可以尽可能的简略,因此,我们定义是一行语句由一条有效语句加上可选的分号构成

Statement

Statement;

而一句空语句,则是由单个分号组成

;

语句块

语句块本身也是一种语句,通常,在语句块中定义的变量无法被语句块外的语句使用,而语句块可以使用语句块外定义的变量。 在C类语言中,语句块为用大括号{ }包裹的多个语句,因此我们也使用类似的定义:

{
  Statement
  Statement
  ......
}

赋值语句

变量与赋值一般是脚本语言中必不可少的部分:

Variable = Expression

表达式

表达式一般指算术表达式,此外还有函数表达式等。不过此处具体的内容到对应内容时再写。 我们先将形如(a+b)*6/2的式子视为表达式

流程分支控制语句 - if

为了处理分支,我们引入基础的if语句,if语句如下:

if (Condition)
  Statement

而为了处理多分支,if-else的语句定义如下

if (Condition)
  Statement
else
  Statement

由于if语句本身也是一种语句,因此可以有如下嵌套定义:

if (Condition)
  Statement
else
  if (Condition)
    Statement

或写做如下格式:

if (Condition)
  Statement
else if (Condition)
  Statement

流程循环语句 - while

while循环是最简单的循环,但是几乎所有的循环模式都可以用while循环替代,因此我们在这先定义while循环

while (Condition)
  Statement

满足Condition的情况下,会循环执行Statement语句

注释

为了方便我们记录脚本的功能,注释也是必不可少的功能。 按照C语言定义注释的方式,有以下定义

// 单行注释
/* 多行注释 */

本章结语

此时我们完成了一个简单的脚本语言定义 其他的定义待后续章节进行补充定义。