收藏 分享(赏)

谷歌simple框架中文文档.doc

上传人:buyk185 文档编号:6988207 上传时间:2019-04-29 格式:DOC 页数:48 大小:2.53MB
下载 相关 举报
谷歌simple框架中文文档.doc_第1页
第1页 / 共48页
谷歌simple框架中文文档.doc_第2页
第2页 / 共48页
谷歌simple框架中文文档.doc_第3页
第3页 / 共48页
谷歌simple框架中文文档.doc_第4页
第4页 / 共48页
谷歌simple框架中文文档.doc_第5页
第5页 / 共48页
点击查看更多>>
资源描述

1、 Simple语言定义草案2009年 6月作者: Herbert Czymontek翻译: Janeky(阿健)Email:注意:此翻译版本可能不是最新的。详细信息参阅官方网站或发邮件查询Simple语言定义-by Janeky语法Simple语言采用“扩展巴克斯格式”(Extended Backus-Naur Form EBNF).以下一些标志将会被用到:y | 用于分开一个个可供选择 的对象,即“或”。y ()定义一个组合y 指定一个选择(或者次)从里面定义的对象中选择个或者个y 指定重复对象(或者次)词法标志都将用黑体和蓝色突出显示,例如,数字:。词法结构源文件是纯文本文件。缺省的字符编

2、码是 。跟其他编程语言不同,语言是区分大小写的。行尾结束字符Simple 语言由“行”(line)构成。所有的 语法都由“行结束字符”区分开。以下的“行尾结束字符”能够被识别:yyyUnicode字符 u000D (回 车)。Unicode字符 u000A (换行)。Unicode字符 u000D (回 车) 后面跟着u000A ( 换行)(-译者注:Windows环境)EndOfLine := (CR | LF | CR LF)可以用一个“行连续符”(Unicode u005F (_下划线) )放在行 结束字符前面取消换行功能。(注意,合法标识符的第一位不能是“_”)空白符以下的字符被称为空

3、白符,用以区分一个个 token:yyUnicode u0009 (TAB-tab制表符 )Unicode u000B (VT 纵向制表符)Simple语言定义-by JanekyyyUnicode u000C (FF-换页符号)Unicode u0020 (SP-空白键符)Whitespace := (TAB | VT | FF | SP)Tokens 从源文件读入的字符串被分成一系列的 tokens。Tokens是语法的终结符。编译器总是先尝试寻找可能存在的最长字符串来定义一个 token。例如,输入字符串“a | = | | | & | + | - | | * | / | | .类型和值

4、(Types and Values)基本类型Type := NonArrayType | ArrayTypeNonArrayType := Boolean | Byte | Short | Integer | Long | Single | Double | String |Date | Variant | ObjectType | ArrayTypeBoolean类型Boolean类型用来表示两个逻辑值: true和 false。Simple语言中定义为 True 和 FalseByte类型Byte类型表示 8位的有符号整数值,在 -128 到 127之间Short类 型Short类型表示

5、16位的有符号整数 值,在-32768到 32767之间Integer类型Integer类 型表示 32位的有符号整数值,在-2147483648到 2147483647之间Simple语言定义-by JanekyLong类型Long类型表示 64位的有符号整数值,从-9223372036854775808到 9223372036854775808Single类型Single类型代表 32位的单精度浮点数,遵循 IEEE 754 标准Double类型Double类型代表 64位的双精度浮点数,同样遵循 IEEE 754标准String类 型String类 型表示一系列的字符串(可能是空)Dat

6、e类型Date类型跟 Java中的 java.util.Calendar类相匹配Variant类型Variant类型是一种分解的集合(disjoint union ),可以表示任何 顺序的其他数据类型(基本类型、数组,对象类型等)Array 类型ArrayType := NonArrayType ( Expression , Expression | , )Array类型表示相同类型元素的集合,可以通过下标来访问。一个 Array可以有一维或者多维(最多 256)Simple语言定义-by JanekyArray可以先确定每维的元素个数,或者不确定(动态决定 size)Object类型Obje

7、ct := Object | IdentifierObject类型的值是其引用的 object实例,或者表示没有任何实例,Nothing。继承(Inheritance)被认为是设计阶段(design time)的性质,意味着没有外在的语法来确定 object的关系。除此之外的信息存储在源文件的一个特定区域(更多关于源文件格式的信息见附录)。Simple支持接口的继承和实现。一个接口 Interface对象只能定义常量和没有函数体的函数声明。Object(接口除外)有两个预先定义的事件 eventyy当 Object的任何成员被第一次引用时,Load 事件会发生当配置一个 object实例时(属

8、于 New运算符的一个执行 阶段),Initialize 事件会发生缺省值下面展示了各种类型的缺省值,变量总是隐式地被预先分配缺省值(根据类型不同而不同)BooleanByte Short Integer Long Single Double String Date Variant Array ObjectFalse 0 0 0 0 0.0 0.0 “” Nothing any Nothing Nothingdefaultvalue类型转换下表展示了类型之间转换的效果Simple语言定义-by JanekySimple语言定义-by JanekySimple语言定义-by JanekyWide

9、r类 型和 Narrow类型对于数值和类型而已,一个 wider类型比一个 narrower类型拥有更大的值域范围。Narrower类型转成 wider类型,可能会被截断,造成精度缺失。当 Single和 Double转成 Long或者Integer,小数部分被截成 0。Boolean类型可以看做是表示-1和 0,是一个范围最小的数值类型Narrow WideBoolean Byte Short Integer Long Single Double对于 object类型,一个基本的 object可以认为是 wider类型,而一个派生 object却是 narrow类型。程序构成单元 Progr

10、am Units(aka源文件)SimpleProgramUnit := Aliasdeclaration Declaration PropertiesSection一个 Simple程序单元由一系列的声明构成。声明别名(alias declarations )仅限制在每个程序单元的开始处。所有的程序单元都以一个属性区域(如附录中描述)结束。这个熟悉区域由特定的工具维护,不能直接修改。Simple共有 3种不同的程序单元,他们的区别在于各自的属性区域存储的内容不同yyyObject程序单元可以定义对象 object或者从基类派生Interface程序单 元用于定义一个接口,不能包含任何的 实现

11、Form程序单元用于定义一个用 户接口 UI的表单所有的程序单元必须定义在一个包(package)内。一个 package就是一个命名空间,用于区分相同名字的程序单元。包可以嵌套。一个嵌套包的包名由最外层的包名加上被嵌套的包名,它们之间用点“”分隔开。Simple语言定义-by Janeky声明 Declaration Declaration :=VariableDeclaration | ConstantDeclarationPropertyDeclaration| FunctionDeclaration| EventDeclaration|ProcedureDeclaration |Eve

12、ntHandlerDeclaration不存在隐式的声明变量声明 Variable Declaration VariableDeclaration := Static Dim Identifier As Type , Identifier As Type 变量可以使一个对象数据成员,或者是局部变量。它们都将被初始化为各自类型的缺省值。对象数据成员可以声明为静态 Static,所有的该对象实例共同引用一个静态数据成员。而非静态(实例)成员都各自分配一个对象实例正确例子:变量声明Dim data1 As Integer 实例数据成员Static Dim data2 As Integer , dat

13、a3 As Integer 对象数据成员Sub Foo( )Dim localData As Integer 局部 变量End Sub错误例子:变量声明Sub Foo ( )Static Dim localData As Integer 编译时期错误:不能有 静态局部变量End SubSimple语言定义-by Janeky常量声明ConstantDeclaration :=Const Identifier As Type = ConstantExpression , Identifier As Type =ConstantExpression 常量必须是一个对象数据成员,必须在声明的时候初始

14、化赋值。正确例子:常量声明Const ZERO As Integer = 0Const ONE As Integer = ZERO + 1 , TWO As Integer = ONE +1错误例子:常量声明Dim Zero As IntegerConst ZERO As Integer = Zero 编译时期错误:需要常量值Sub Foo ( )Const LOCAL_ZERO As Integer = 0 编译时期错误:不存在局部常量End Sub函数 Functions 和过程 Procedure 声明FunctionDeclaration := Static Function Iden

15、tifier ( FormalArguments ) As TypeStatementsEnd FunctionProcedureDeclaration := Static Sub Identifier ( FormalArguments )StatementsEnd SubSimple语言定义-by JanekyFormalArguments := FormalArgument , FormalArgument FormalArgument := ByRef | ByVal Identifier As Type函数和过程都是对象成员,都是可嵌套的。两者之间的不同在于:函数有一个返回值而过程没

16、有。函数隐式声明一个局部变量来保存返回值,该局部变量命名跟函数名相同。当函数结束时,该变量的值就是函数的返回结果值。除非特别声明,参数默认是按值传递。关键字 ByVal是可选的。当参数被关键字 ByRef修饰时,就变成按引用传递。此时,当一个 l-value 按引用传递给 参数时候,所有被调用实参的修改都将反映到 l-value的 值。如果一个 r-rvalue 按引用传递给参数,它将被当做按值传递函数和过程声明例子Sub ParenthesizedExpressionExamples ( )Dim par1 as Integer , par2 As Integer , par3 As Int

17、egerpar1 = 1par2 = 2par3 = 3TestProcedure ( par1 , par2 , par3 , TestFunction ( ) ) par1还是 1,par2还是 2,但是 par3变成 4,第四个 实际参数不是一个 lvalue-所以没有变化End SubSub TestProcedure ( par1 As Integer , ByVal par2 As Integer , ByRef par3 As Integer ,ByRef par4 As Integer )par1 = 2par2 = 3par3 = 4par4 = 5End SubFuncti

18、on TestFunction ( ) As IntegerTestFunction = 4 会返回 4End FunctionSimple语言定义-by Janeky属性声明 Property Declaration PropertyDeclaration :=Property Identifier As Type GetStatementsEnd Get SetStatementsEnd Set End Property属性是对象成员。一个属性声明可以定义一个 getter 函数和 /或一个 setter函数。如果没有什么 setter函数,那么该属性是只读的,不能放在一个赋值语句的左边被

19、引用。如果不定义getter,就变成只写的,只能在一个 赋值语句的左边被引用getter函数隐式声明一个跟属性同名的局部 变量。当 getter函数结束时,该变量的值就是属性的值。setter函数同样也有一个类似的局部变量。当 setter开始执行时,这个变量值就被赋值成属性的值。一个属性的 getter 和 setter函数不能再声明任何正式的参数属性声明例子Dim currentStatus As String Backing storage for Status propertyProperty Status As StringGetStatus = currentStatus 返回 s

20、tatusEnd GetSetcurrentStatus = Status 保持 statusStatusLabel.Text = Status 更新 StatusLabelEnd SetEnd PropertySimple语言定义-by JanekySub SomeProcedure ( )Status = “Greate!”将 currentStatus 赋值“Greate !”,同时显示 StatusLabel的文本End Sub事件声明EventDeclaration :=Event Identifier ( FormalArguments )End Event事件属于对象成员。事件声

21、明定义一个事件,该事件可以被 RaiseEvent语句触发声明一个事件的例子Event TestEvent ( str As String )End Event事件处理声明EventHandlerDeclaration :=Event Identifier . Identifier ( FormalArguments ) Statements End Event事件处理声明同样属于对象成员。一个对象处理器跟一个过程(procedure)类似,但是不能被直接触发。事件处理器都是由定义该事件的对象的 RaiseEvent语句调用。一个事件处理器定义了一个对象实例数据成员(第一个 Event关键字前

22、面标识符)和一个事件(第二个标识符)。实例数据成员必须在 event handler所在的对象中声明。 实例数据成员必须定义相关的事件。定义事件处理器的相关例子Simple语言定义-by JanekyDim Obj As ObjectWithEvent 该变量包括了已定义一个 TestEvent 的对象Event Obj . TestEvent ( str As String )StatusLabel = “Status : “ & strEnd Event别名声明 Alias声明AliasDeclaration :=Alias Identifier = QualifiedIdentifier

23、别名声明为一个已经存在的名字重新定义了别名。后面使用这个别名就等同于使用全名。别名声明只能在变量,函数,过程,属性,事件声明前面出现。不能重定义一个别名,否则出现编译错误。所有来自 com.google.devtools.simple.runtiom 或者它的任何子包包的对象自动使用已经定义的别名正确例子你不仅可以用别名声明来什么较短的名称,也可以用来消除重名Alias FirstObjectType = com.google.devtools.example1.ObjectTypeAlias SecondObjectType = com.google.devtools.example2.Ob

24、jectTypeDim data1 As FirstObjectTypeDim data2 As SecondObjectType错误例子重复定义别名是不允许的Alias Form = com.google.devtools.example1.objectType 编译时期错误Simple语言定义-by JanekyAlias ObjectType = com.google.devtools.example1.ObjectTypeAlias ObjectType = com.google.devtools.example2.ObjectType 编译时期错误作用域在一个包(package)中定

25、义的对象是全局可访问的。一个对象可以与其他包的对象同名,但是不能与同一个包的对象重名。对象成员(数据成员,函数,过程,属性和事件)声明是全局可访问,可能只定义在 object范围内。另外的同名对象成员不能定义在同一对象里。为此,函数,过程,属性和事件都不允许重载。派生类可以允许覆盖基类的函数(过程,属性和事件)。数据成员也是不允许在派生类中重复定义。函数,过程和事件参数在其所在的函数作用域有效。不能在参数系列重复定义相同的参数。局部变量可以在一个函数,过程,属性和事件的任何地方声明。它们的作用域从开始声明的地方,延续到其他能被继续访问的区域。同一个 statement block不能重复声明局

26、部变量。一个局部变量将会屏蔽掉所有外部的同名变量,包括 statement block外的和对象的数据成员等。作用域例子Static Dim var1 As StringStatic Dim var2 As IntegerStatic Dim var3 As ObjectEvent ScopeTest . Load ( )var1 = “Not a number”var2 = 0var3 = NothingEnd EventSimple语言定义-by JanekyStatic Sub TestProcedure ( var1 As Integer )Dim var2 As StringDoDi

27、m var2 As ObjectDim var3 As Stringvar1 = com.google.devtools.simple.smoketest.scopes.ScopeTest.var2var2 = ScopeTest . var3While FalseEnd Sub表达式 Expressions 操作符优先级操作符必须按照他们的优先级顺序使用。拥有高优先级的操作符先执行运算。操作符优先级(从高到低)yyyyyyyyyyyyy幂运算+ - 正数和负数运算/乘法和除法整除Mod求模+ -加法和减法& 字符串连接运算位移运算= = 二元操作符则是带符号右移。如果需要,操作数在运算之前将

28、会被转换成数值类型(Byte ,Short , Integer , Long , Single orDouble)。如果两个操作数的类型不同,narrower 类型将会被 转成 wider 类型。运算结果的类型跟操作数的 common 类型相同。除了类型转换的错误,该操作符不产生任何运行时错误位移操作符表达式例子Sub BitShiftExpressionExamples ( )Dim result As Integerresult = &H12348080result =result 16 结果是 &HFFFF8080End Sub比较,Is, IsNot , Like And TypeOf

29、 Is操作符ComparisonExpression := BitShiftExpression | BitShiftExpression ComparisonOperatorComparisonExpresionComparisonOperator := OrderedComparisonOperator | Is | IsNot | Like | TypeOfPrimaryExpression Is TypeOrderedComparisonOperator := | = | Simple语言定义-by Janeky二元运算符, =操作符功能类似。如果需要,操作数在运算前将会被转成一个 i

30、nteger类型(Byte,Short ,Integer or Long)或者 String类型。如果两个操作数的类型不同,narrower类 型将会被转成 wider类型。如果两个操作数的类型都是 String ,那么它们将按照词典编纂顺序比较(根据 Java方法 java.lang.SpareTo()).=比较两个操作数在数值上是否相等。比较两个操作数在数值上是否不同。如果两个操作数的类型不同,narrower 类型将会被转成 wider类型。Is比较左操作数是否等于右操作数。 IsNot比较左操作数不等于右操作数。注意,操作数必须是 Object或者 Array类型。Like表示左操作数

31、是否符合右操作数给出的正则表达式。正则表达式跟 Java中定义的java.util.regex.Pattern相同。如果需要,操作数在运算之前会被转换成 String类型TypeOf。Is比较左操作数是否跟右操作数类型相同操作符的结果是 Boolean。除了转换错误,该操作符不会产生任何运行时错误比较操作符表达式例子Sub ComparisonExpressionExamples ( )Dim result As Booleanresult = “bar” True TrueEnd SubSub IsExpressionExample ( )Dim result As BooleanDim o

32、bj1 As Object , obj2 As ObjectSimple语言定义-by Janekyobj1 = SomeObjectobj2 = SomeObjectresult = obj1 Is obj2 Trueobj2 = DifferentObjectresult = obj1 Is obj2 FalseEnd SubSub LikeExpressionExamples ( )Dim result As Booleanresult =”foof “ like “f.*f”result = “goof” like “f.*f”TrueFalseEnd SubSub TypeOfExp

33、ressionExamples ( )Dim result As BooleanDim obj As ObjectDim var As Variantobj=Nothingvar=1result = obj TypeOf Integer Falseresult = obj TypeOf Integer() Falseresult = obj TypeOf Objectresult = obj TypeOf FooTrueTrueobj = SomeObjectresult =obj TypeOf Foo True当 obj 是 Foo类型或者 Foo 的基类result = var TypeOf Integerresult = var TypeOf StringTrueresult is True

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报