引言
脚本语言,一般是指解释执行的语言。在程序开发过程中,有些部分因为有实时修改、降低开发难度、隔离主要代码的需求,故使用脚本语言来作为辅助性质的语言。
并且作为程序员,相信很多人都有着自己开发一门语言的想法,这好比作为创世神想要能够亲自开天辟地一般。而开发一门脚本语言则是不错的入门途经。
笔者也是抱有这样的想法,并阅读了《两周自制脚本语言》一书,该书使用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表示换行等
布尔值
布尔值在程序中代表真与假,定义则相对较简单,只需要true与false两种即可。
空值
空值一般代表没有对应的值或引用,使用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语言定义注释的方式,有以下定义
// 单行注释
/* 多行注释 */
本章结语
此时我们完成了一个简单的脚本语言定义 其他的定义待后续章节进行补充定义。