GxScript 3.0 語法說明_第1頁
GxScript 3.0 語法說明_第2頁
GxScript 3.0 語法說明_第3頁
GxScript 3.0 語法說明_第4頁
GxScript 3.0 語法說明_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論