版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、GxScript 3.0 语法说明何咏, Graphixer本文档详细描述了GxScript 3.0的全部语法以及注意事项。目录1词法21.1大小写21.2标识符21.3字面常量31.3.1整数31.3.2浮点数31.3.3字符串常量31.3.4布尔常量31.4关键字31.5注释32基本语法42.1表达式42.1.1构成元素42.1.1.1数组定义42.1.1.2函数定义42.1.2操作符62.1.2.1算数运算符62.1.2.2逻辑运算符62.1.2.3比较运算符62.1.2.4连接运算符62.1.2.5索引运算符72.1.2.6成员运算符72.1.2.7调用运算符72.1.2.8赋值运算符
2、72.1.2.9自增/自减运算符72.1.2.10new 运算符72.1.2.11运算符优先级72.2基本语句82.2.1语句格式82.2.2变量/常量声明82.2.3条件语句92.2.4选择语句92.2.5循环语句92.2.5.1for循环92.2.5.2for each 语句102.2.5.3while语句102.2.5.4do语句102.2.6跳转语句102.2.7结构化异常处理112.2.7.1try-catch 语句112.2.7.2throw 语句112.2.7.3结构化异常处理示例112.3面向对象编程122.3.1类的定义122.3.2构造函数122.3.3操作符重载132.3
3、.4迭代142.3.5继承和多态142.4数组163反射163.1使用_prototype成员获得和修改对象的类型信息163.2通过字符串访问对象的成员173.3获得某一名称的类的构造函数174运行时代码注入181 词法1.1 大小写GxScript 对大小写敏感。1.2 标识符在GxScript中,标识符由字母或下划线开头,后面可接一个或多个字母、数字或下划线。例如:ab _a5但是,5a是非法的标识符,因为标识符不能以数字开头。1.3 字面常量GxScript中字面常量可以是整数、浮点数字符串或者布尔值。1.3.1 整数整数由一连串数字组成。整数的范围应介于-232 232-1之间。1.3
4、.2 浮点数定义:FloatingPoint à Numeral+.Numeral+例如,1.2 23.5 0.31.3.3 字符串常量字符串常量出现在两个双引号 “ 之间,可为任意的Unicode字符。另外可以在字符串常量中使用下面的转移符表示特殊的字符:n 换行符s 空白符t 制表符r Windows换行符” 双引号 注意两个双引号之间不能包含换行。1.3.4 布尔常量布尔常量可为true 和 false1.4 关键字GxScript 3.0保留一下关键字。不能使用任何一个关键字作为变量名或类名。break case catch class const constructor c
5、ontinue default destructor do downto each else exception false for function handle host if in new operator overloads private property protected public return switch throw this to true try uses var while xor 1.5 注释GxScript 3.0中的注释可以是由双斜杠”/”开头的单行注释,也可为”/*”和”*/”包括起来的嵌入式注释。例如 abc = 5; / 单行注释从这里开始,到这里结束或
6、者 /*嵌入式注释从这里开始 到这里结束*/ abc = 5;2 基本语法2.1 表达式2.1.1 构成元素GxScript 3.0中,构成表达式的元素可以为:标识符,字面常量,数组定义,函数定义2.1.1.1 数组定义GxScript 3.0允许直接在表达式中定义数组。语法是:Element1,Element2,.数组中的各项元素可以为不同类型。例如:1,2,3,4,5 4,1.2,”abc”,true2.1.1.2 函数定义可在GxScript 3.0定义普通函数和重载函数包。重载函数包在表达式中与普通函数定义表现出相同的特性。函数定义语法:FunctionDef àfuncti
7、on(ArgumentList)Statements函数的参数表ArgumentList是一个由逗号”,”隔开的参数定义ArgumentList àType-Specifier ArgumentName1, Type-Specifier ArgumentName2 , 通过在参数之间添加类型限定符,可以允许GxScript虚拟机在函数调用时对参数进行类型检查,或者允许虚拟机选择合适的重载函数。GxScript 3.0的类型限定符可为:int : 限定或将参数转换为整数类型float : 限定或将参数转换为浮点类型bool : 限定或将参数转换为布尔类型numeral : 限定或将参数
8、转换为数字string : 限定或将参数转换为字符串function : 限定参数为函数array : 限定参数为数组或者任何已定义的类名,限定参数为指定类型的实例。一般地,通过将函数定义赋值给一个对象,然后对该对象应用调用操作符实现函数的调用。例如:var f = function(int a)return a*a;var result = f(5); / result = 25当然,函数定义可以直接被调用:var result = function(int a)return a *a;(5); / result = 25作为构成表达式的因子,函数定义可以出现在表达式的任何地方,包括数组定义
9、和函数的参数表中。下面的例子演示了函数定义作为函数参数:var Applier = function(array a, function f)var i;for (i=0; i<a.Size; i+)ai = f(ai);var SampleArray = 1,2,3,4,5;Applier(SampleArray, function(int x)return x*x;);writeln(SampleArray);程序的结果为:2,4,9,16,25此外,可以定义函数重载包。语法:OverloadPack àoverloadsFunctionDef1FunctionDef2例如
10、,下面的代码定义了一组重载函数:overloadsfunction (int a, int b)function (string a, string b)在运行时,虚拟机按照如下规则选择重载函数:1. 如果重载函数包中有一个或多个完全匹配传入参数类型的函数,则调用第一个出现的满足此条件的函数2. 如果规则1失效,查找第一个能通过类型转换匹配传入参数类型的重载函数,若找到,则调用3. 如果规则1和2失效,抛出运行时异常2.1.2 操作符2.1.2.1 算数运算符GxScript 3.0 支持的算数运算符有:+加法运算-减法或取负*乘法运算/除法运算%求模运算求幂运算2.1.2.2 逻辑运算符Gx
11、Script 3.0的逻辑运算符包括:&&逻辑与|逻辑或xor逻辑异或!逻辑非2.1.2.3 比较运算符GxScript 3.0的比较运算符包括:>大于<小于>=大于或等于<=小于或等于=等于!=不等于对于基本类型,比较运算符比较其操作数的值的大小。对于数组、函数、对象等引用类型,比较运算符仅比较两个变量是否引用同一个对象,除非所比较的对象重载了比较运算符。2.1.2.4 连接运算符连接运算符”&”用于连接一组数字或字符串,构成一个新的字符串。例如:52.5 & “abc” 结果是 “52.5abc”此外,连接运算还用于合并两个数组或者向
12、数组尾部添加新的对象。例如:1,2,3 & 4,5 = 1,2,3,4,5“abc” & “bcd” = “abc”, “bcd”2.1.2.5 索引运算符索引运算符”用于从数组中索引成员。对于数组索引,中括号中的索引键值应为整数。对于对象成员索引,键值可为字符串。例如:a5object“MemberName” / object是一个对象,包含名为”MemberName”的成员。2.1.2.6 成员运算符成员运算符”.”用于索引对象的成员。例如:object.MemberName与object“MemberName”等价。2.1.2.7 调用运算符调用运算符用于调用函数对象或者
13、对象的调用运算符重载函数。例如:a(5,3)2.1.2.8 赋值运算符赋值运算符包括 = += -= /= *= %= =赋值运算的结果是赋值后赋值号左侧表达式的值。2.1.2.9 自增/自减运算符自增运算符 +自减运算符 用于将运算符左侧的变量加1或减1。GxScript 3.0不支持前缀自增/自减。2.1.2.10 new 运算符new运算符用于分配数组空间和创建对象的实例。GxScript 3.0的堆空间由虚拟机内部的垃圾回收机制维护,GxScript 3.0会自动回收不再使用的资源。语法:new Lengthnew ClassName(ArgumentList)例如:var a = n
14、ew 5; / 分配大小为5的数组var a = new MyObject(1,2); / 用参数1,2构造MyObject类型对象有关面向对象编程,参见2.3节。有关数组的使用,参见2.4节2.1.2.11 运算符优先级GxScript 3.0运算符优先级如下表所示。表格中同一行的操作符优先级相同。操作符意义优先级结合性 () .数组索引,调用操作符和小括号,成员索引1左结合- ! + -一元取负 逻辑取反,自增自减2右结合指数运算3左结合/ % *除法 求模 乘法4左结合+ -加法 减法5左结合&&逻辑与6左结合| xor逻辑或 逻辑异或7左结合&连接8左结合<
15、; > <= >= = !=比较运算符9左结合= += -= *= /= = %= 赋值和自赋值运算符10右结合2.2 基本语句2.2.1 语句格式所有语句以分号”;”结尾。由大括号”包含的一组语句在该级别上视为一条语句。大括号可以嵌套使用。2.2.2 变量/常量声明语法:var VarName1=InitialValue, VarName2 const ConstantName = IntialValue, Constant2 = InitialValue2 例如:var a;const b = 5;var a,b;var a =5,b,c=”abc”;常量是定义后不能修改
16、的运行时变量。常量的其他语义和一般变量相似,其占用的内存空间在定义常量时分配并赋予初始值。常量的初始值可以为任意表达式。注意:GxScript 3.0不强制要求声明变量。在GxScript 3.0的虚拟机架构中,不存在堆栈空间,一切资源均动态从一个带有垃圾收集机制的堆空间中分配,并自动回收。当虚拟机遇到变量引用时,现在当前函数闭包中搜索变量,若找到,则引用此对象,否则,沿着当前的环境闭包链向上寻找,直至查找到变量。若变量未找到,则创建一个新的变量。然而,仍然建议养成声明变量的习惯。这是由于GxScript 3.0闭包链的机制,可能导致变量的误用。请参考下面的例子。var r = 123;var
17、 f = function(int x, int y) r = x * y; / 注意:这将改变主函数中的r变量 return r;在编写f时,您可能希望使用变量r存储中间计算结果,而并非希望改变上层函数中的r变量,这时如果不强制声明变量r,则不会出现任何运行时异常,然而主函数中的r却被意外地改变,从而可能得到错误的运行结果。这样的错误有一定的隐蔽性,通常较难调试。因此建议使用前声明变量。2.2.3 条件语句语法:if (Bool-Expression)TrueStatements else FalseStatements当Bool-Expression为真时,执行TrueStatements
18、,否则执行FalseStatements。2.2.4 选择语句语法:switch(Expression) case Value1:Statements1; case Value2:Statements2; . default:DefaultStatements;2.2.5 循环语句2.2.5.1 for循环语法:for (InitialExpression; BoundaryExpression; SideEffectExpression)Statement;for语句在执行前,先计算InitialExpression的值。然后计算BoundaryExpression的值,若其值为true,执
19、行Statement语句,每执行一次循环后计算SideEffectExpression。例如:var i,sum;for (i=1; i<=100; i+)sum += i;计算了1至100的累加和。2.2.5.2 for each 语句for each语句用于快速遍历访问数组中的每一个元素或对象中的迭代函数。语法:for each IteratorVariable in ArrayOrObjectStatementfor each语句遍历集合ArrayOrObject中的每一个可迭代元素,每次迭代时,IteratorVariable被赋值为对当前迭代的对象的引用。例如:var arr
20、= 1,2,3,4;var sum, iter;for each iter in arrsum += iter;writeln(sum);输出:10注意:若迭代集合为对象,则要求该对象中必须有成员函数_GetLength和_GetItem的定义。请参见2.3.4节。2.2.5.3 while语句语法:while (Bool-Expression)Statement执行Statement,直至Bool-Expression中的值为false2.2.5.4 do语句语法:doStatementwhile (Bool-Expression);先执行一次Statement,重复执行直至Bool-Exp
21、ression为false。2.2.6 跳转语句GxScript 3.0中的跳转语句包括break continue和return。语法:break;continue;return Expression;在循环中,break语句终止当前循环并跳转到外层语句继续执行,continue语句终止当前迭代并跳转到下一次迭代。return语句可出现在函数中的任何位置,用于终止当前函数并返回一个值。2.2.7 结构化异常处理2.2.7.1 try-catch 语句GxScript 3.0 支持结构化异常处理。当代码出现系统异常或用户抛出异常时,将执行上一层try-catch语句中的catch部分。若找不到
22、异常处理模块,虚拟机提示未处理的运行时异常,并结束脚本的运行。语法:tryProtectedStatementcatchHandleStatement执行ProtectedStatement,若没有发生异常或异常已被下一层的try-catch语句处理,则跳过此try-catch 语句中的HandleStatement部分并继续执行下一条语句。若在ProtectedStatement中发生了异常,则跳转到HandleStatement执行。若HandleStatement中抛出异常,则此语句抛出异常。该异常可能由更高级别的try-catch语句处理。在HandleStatement中,使用exc
23、eption关键字访问异常对象。2.2.7.2 throw 语句throw语句用于抛出异常。语法:throw Expression;将Expression赋值给异常对象并引发该异常。2.2.7.3 结构化异常处理示例下面的例子演示了异常处理的机制。trytrythrow “This is an exception”;catchif (_IsString(exception) / 判断异常的类型writeln(exception);throw exception&”(rethrown)”; /再次抛出catchwriteln(exception);运行结果:This is an exce
24、ptionThis is an exception(rethrown)2.3 面向对象编程2.3.1 类的定义语法:class ClassName : BaseClass1,BaseClass2, private:PrivateDefinitionsprotected:ProtectedDefinitionspublic:PublicDefinitions类的引用可以出现在类的定义之前。一旦所有代码被编译和加载,可以在任何位置使用代码中所定义的类。类的成员定义必须使用强制变量声明语句(var或const语句),代码中只能对声明过的类的成员进行引用,否则会引发MemberNotExists运行时
25、异常。使用成员操作符(.)或者索引操作符()索引对象的成员。2.3.2 构造函数语法:constructor (ArgumentList)Statement可以为一个类定义多个构造函数,在创建类的实例时,GxScript根据重载函数匹配原则选择相应的构造函数。例子:class CtorTestpublic:constructor(int a, int b)writeln(a+b);constructor(int a)writeln(a);constructor()writeln(0);var a = new CtorTest(1,2);new CtorTest(5);new CtorTest(
26、);输出:3502.3.3 操作符重载语法:operator Operator(OperatorArgList)StatementGxScript 3.0 允许重载的操作符及其参数表见下表。操作符参数表+ - * / % & | xor && < > <= >= = !=(Type-Specifier rhsObj)! - + -()()任意可以为一个操作符定义参数表不同的多个重载。示例:class OpTestpublic: operator +(int b) writeln(b); operator +(string str) writeln
27、(str & " string"); var a = new OpTest();a + 5;a + "abc"运行结果:5abc string2.3.4 迭代GxScript 3.0提供将某一类型实现为容器对象的途径。任何实现了_Getlength和_GetItem方法的类都可以成为for each语句中的容器项被迭代。下面的例子说明了这一特性的使用。class Setprivate:var arr = 1,2,3,4,5;public:var _GetLength = function()return arr.Size;var _GetItem
28、 = function(int i)return arri;var s = new Set();for each val in swriteln(val * val);运行结果:14916252.3.5 继承和多态语法:class ClassName : BaseClass1,BaseClass2 派生类拥有基类的所有成员。若派生类中出现了与基类同名的成员,则通过派生类的引用访问此成员时,将得到派生类中的成员。但在派生类的定义中,可通过BaseClassName.MemberName访问基类中的任何成员。示例:class Basepublic:var A;class Derived : Bas
29、epublic:var A;var MemberFunc = function()A = 5;Base.A = 10;var GetBaseA = function()return Base.A;var d = new Derived();d.MemberFunc();writeln(d.A);writeln(d.GetBaseA();运行结果:510此处,Base和Derived中均定义了名为A的对象,虽然名称相同,但它们在内存堆上为两个不同的变量。通过Derived类的引用(d)访问的成员A永远是Derived类中定义的A。只有在Derived类的内部,才能通过Base.A的形式访问到基类
30、中的成员A。然而,若Derived中未定义与Base同名的成员A,那么通过引用访问到的成员即是Base中的成员A。GxScript 3.0中,派生类中定义的成员总是覆盖基类中的成员。在派生类内部,可以通过基类名.基类成员方式访问基类中的成员。GxScript 3.0是一个动态语言,大多数情况下不需要使用共同的基类统一对象的接口。即使是两种不同的对象,如果他们具有相同的成员,依然可以使用同一个变量进行引用和索引。下面的示例代码体现了这种动态特性。示例:class Apublic:var DoSomething=function()writeln(“A:DoSomething Invoked”);
31、class Bpublic:var DoSomething=function()writeln(“B:DoSomething Invoked”);var obj = new A();obj.DoSomething();obj = new B();obj.DoSomething();运行结果:A:DoSomething InvokedB:DoSomething Invoked2.4 数组在GxScript 3.0中,数组是一类特殊的对象。GxScript 3.0虚拟机直接提供了数组类的函数用于对数组进行常规修改。任何数组都具有如下属性/方法:Size 属性: 设置/返回数组的大小Insert(a
32、rray|variable, pos=end): 插入数组或单个对象Delete(pos,count) : 删除Subset(pos,count) : 取子集Clone():复制3 反射GxScript 3.0提供了完整的反射机制。通过GxScript 3.0的语法,可以获得关于代码本身的信息。3.1 使用_prototype成员获得和修改对象的类型信息所有的对象内部存在一个名为_prototype的公有成员。_prototype对象由系统保留,用户不能自己定义名为_prototype的对象。通过_prototype对象,用户可以访问到关于类的所有信息。_prototype包含的成员有:Cla
33、ssName : 类的名称字符串Members : 提供访问类的成员列表的接口Ancestors: 提供访问类的祖先列表的接口其中,Members和Ancestors成员均包含如下方法:Count : 列表中的对象数量Add(String) : 向列表中添加成员Exists(String) : 返回某一名称的成员是否存在Remove(String) : 移除指定名称的成员operator i: 返回第i个成员信息。Membersi提供了以下字段:Name : 成员名称Visiblity: 成员可见性。(0=public, 1=protected, 2=private)Ancestorsi提供了
34、以下字段:ClassName : 类型名Object: 基类对象的实例注意:使用_prototype对成员或祖先列表作出的修改仅对当前对象有效,不影响类的定义和其他已创建的该类型的对象。以下示例演示了_prototype对象的使用。class TestClassprivate: var m_Length, m_Width;public: constructor() m_Length = m_Width = 10; var obj = new TestClass;writeln(obj._prototype.ClassName);obj._prototype.Members.Add
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年企业云计算服务合同
- 2024家庭解体标准分割合同书版
- 2024年度住宅区围墙修建工程协议版B版
- 2024年度公司员工餐厅就餐服务协议版B版
- 2024年度分手后品牌使用权分配协议
- 2024年度二手汽车买卖合同及质保服务条款3篇
- 2024发起人协议书及公司章程
- 2024年专业食用菌菌种交易协议版B版
- 2024年居间服务协议法律解释要点
- 2024年城市绿化苗木供应合同
- 9.1-电荷-课件(共22张PPT新版高中物理教材)
- 《音乐治疗》课程教学大纲
- 《民航法律法规(第2版)》项目三
- 初中九年级心理健康讲座课件
- LED外延基础知识课件
- 土壤污染隐患排查制度
- 采购需求调查报告
- 多能工管理办法
- 中医护理-知识考试试题及答案
- 乐理(一)知到章节答案智慧树2023年丽水学院
- 工商银行全国地区码
评论
0/150
提交评论