QScript语法构想(0.13版)

QScript做为一门规划中的解释性语言,我并不希望其是现有语言的直接翻版,因此,重新设计规划其语法。因为是解释性语言,要方便解释器解析识别。

注意本文只是一个构想,并不代表最终一定会实现。

1、变量定义

QScript中变量定义设想声明形式是和C++类似,随用随声明,而不是像Delphi一样,需要在前面声明。如for循环:

for(int i=0;i<100;i++)
   {
   }

变量的声明时,多个同一类型的变量声明可以用逗号分隔,不同类型的变量必需使用分号分隔写到下一句。

2、函数声明

QScript的函数声明设想是参数JavaScript和Delphi的语法,支持匿名函数,声明大概如下:

function 函数名称(参数列表) 返回值类型 修饰规则
{
函数代码
}

返回值类型可以用()包括起来,以便返回多个参数值,语法大概如下:

(类型 [名称][,类型2 [名称2]..])

举个简单的例子:

function fun(int x,y) (int dx,dy) stable
{
return (x,y);
}
...
a=fun(1,2);

则后面访问a的值时,可以按数组的规则a[0]、a[1]这样子,也可以像对象一样a.dx,a.dy这样子。

修饰规则支持三种:

immutable – 对于相同的参数值,其返回值始终是固定的,而不论其上下文内容。

stable – 对于相同的参数值和上下文内容,其返回值是固定的。

mutable  – 易变的,默认规则,即使参数相同,每次执行其返回值也不是固定的。

QScript同时计划支持匿名函数,匿名函数可以直接赋值给一个变量或者做为参数传递给函数。

function a=function(int x,y){return x+y;}

象上面的代码,就可以直接将a在后面做为一个函数来调用。

int b=a(1,2);

QScript的函数不管有没有参数,用于包含参数列表的()都不能省略(这点和C++一致,主要目的是方便解释器解析)。

3、操作符

操作符我的设想是支持引用C/C++中的各种操作符和规则,而不再重新设计。另外,引入Delphi的部分关键词 (暂时考虑 and、or 、 xor 、not、in) 。

4、模块化

复杂的脚本肯定需要模块化以简化维护操作,只是这里需要在C++的#include、Delphi的use和Java的import之间选择一个,我个人倾向于Delphi中的use关键字,简短易记。

5、预声明

如果两个函数中相互引用就会引入预声明的问题,预声明的函数直接没在函数声明完成后没有实现部分即可。类型也是一样。示例如下:

function a();
class b ['{B3EE8BCD-33F8-423F-9AE8-36893E43E8D1}'];
class c;

6、调试及日志

直接内置Assert、DebugBreak、DebugOut三个函数以及__DEBUG__全局变量,这三个函数直接在运行只在__DEBUG__启用时会被执行,如果不启用,自动忽略掉。DebugBreak支持条件输出。

7、异常处理

提供try/except/finally语法支持,以便提供异常处理。

8、数据类型

8.1、简单类型

简单类型提供整数(8、16、32、64位有符号和无符号)、浮点(单精度、双精度、扩展精度、货币和BCD编码)、布尔、日期时间(日期、时间、日期时间、时间间隔)、字符串(ANSI、UTF8和Unicode三种)、GUID编码、变体类型、枚举、集合、二进制、数组。

8.2、复合类型

复合类型一般语言提供记录(结构体)、联合(共同体)、接口、类。实质上,它们并没有本质的区别,QScript将不再区分的那么细,只有一种类型class,然后可以为class定义属性、函数和唯一编码(使用GUID编码),提供唯一编码的目的是为类型提供唯一内部标志,以便跨库访问。继承上支持多重继承,对于重名冲突,除非子类重载,否则调用者必需指定父类型的名称,这样子就可以避免多重继承的冲突。

QScript的类型定义可以出现在代码的任何位置,而不象C++、Delphi等必需在前面声明。如下面的类型声明是合法的:

function MyFunction1()
{
...
class
  {
  int Age;
  String Name;
  } Baby;
Baby.Age=10;
Baby.Name="Jone";
...
}

fuction MyFunction2()
{
...
...
class TBaby
  {
  int Age;
  String Name;
  };
TBaby Baby1,Baby2;
Baby1.Age=10;
Baby1.Name="Jone";
Baby2.Age=12;
Baby2.Name="Deny";
...
}

 

分享到: