Welcome

首页 / 软件开发 / C++ / 手把手教你写脚本引擎(三)——简单的高级语言(1,基本原理)

手把手教你写脚本引擎(三)——简单的高级语言(1,基本原理)2010-06-24 C++博客 陈梓瀚这一篇文章开始讲述如何实现一个高级语言的脚本引擎了。由于工程量较为庞大,因此将分开几篇文章讲。学习做脚本还是要从简单的东西做起的。上一篇文章介绍的命令脚本为实现高级语言的原理做了铺垫。首先,高级语言和低级语言脚本的架构是一致的。其次,为了具有较大的优化的空间,我们将把高级语言转换成低级语言,并配合一个低级语言的脚本引擎来实现高级语言的脚本引擎。当然,习惯上,在这种情况下我们把低级语言叫『指令』。

在这个阶段,我们实现的这门语言是非惰性计算的、弱类型的、仅支持基本类型、数组和函数指针的语言。作为扩展,隐式类型转换和函数重载也将包含在这几篇文章的主题中。好了,开始介绍语法吧。

为了免去分析C语言函数指针声明的一堆麻烦问题,在这里我借用了pascal的语法。我们将构造出一门非常类似pascal的语言出来。

文件结构:

我们将实现的高级语言脚本是支持多文件的。脚本引擎总是需要外部函数的。为了方便的让宿主程序提供外部函数的声明,因此我们做成了多文件的脚本引擎。也就可以有类似C语言#include那样子的东西了。pascal有一个奇怪的注释规则:使用大括号注释。

结构如下:

unit 单元名;

uses 单元名1,单元名2,……;

type
新类型名称=类型声明;
……

var
变量名组:类型;
……

interface
公开的函数声明;

implementation
公开和非公开的函数实现(非公开函数不需要声明)
end.

对于语言本身来说,type和uses最好应该属于interface和implementation的。不过我们为了方便,姑且就这么做吧。不然的话,既不能揭示更多的原理,又给自己添麻烦。

类型声明:

类型声明有普通类型、数组类型和函数指针。

普通类型有boolean、integer、real、char和string。

数组类型的声明方法是array of 类型。

函数指针的声明方法跟函数声明一致,唯一的区别是函数指针不可出现函数名。譬如我们需要一个输入两个整数输出一个整数的函数指针,我们写:

type MyPointer=function(a,b:integer):integer;