解析顺序一被引入就涉及到不受限制的标识符 。如 foo(),foo=1,foo.field等这些是表达式(第5章)。特别是最后一个包括类似 haxe.ds.StringMap的模块路径,haxe是一个绝对的标识符。
> Resolution order comes into play as soon as unqualified identifiers are involved. These are expressions(5)intheformoffoo(),foo = 1andfoo.field. The last one in particular includes module paths such as haxe.ds.StringMap, where haxe is an unqualified identifier.
我们描述解析顺序的算法,取决于以下的状态:
> We describe the resolution order algorithm here, which depends on the following state:
* 声明的局部变量(第5.10节)(包括函数参数)
* 导入(第3.7.2节)的模块,类型和静态字段
* 可用的静态扩展(第6.3节)
* 当前字段的种类(static或者成员)
* 当前类及其父类声明的成员字段
* 当前类声明的静态字段
* 预期的类型(第3.6.1节)
* untyped或者不是untyped的表达式
> * the declared local variables (5.10) (including function arguments)
> * the imported (3.7.2) modules, types and statics
> * the available static extensions (6.3)
> * the kind (static or member) of the current field
> * the declared member fields on the current class and its parent classes
> * the declared static fields on the current class
> * the expected type (3.6.1)
> * the expression being untyped or not
给定一个标识符 i ,算法规则如下:
> Given an identifier i, the algorithm is as follows:
1. 如果i 是true,false,this,super或者null,解析到匹配的 常量并停止
2. 如果一个局部变量命名为 i为可访问的,解析它并停止
3. 如果当前的字段是静态的,跳到6
4. 如果当前的类或者任何它的父类有一个字段命名为 i,解析到它并停止
5. 如果一个静态扩展带有第一个当前类类型的参数可用,解析到它并停止
6. 如果当前的类有一个静态字段命名为 i,解析到它并停止
7. 如果一个枚举构造函数命名为i声明在一个导入的枚举,解析到它并停止
8. 如果一个静态方法 i 被显式导入,解析到它并停止
9. 如果i通过一个小写字母开始,跳到11
10. 如果类型名为 i 是可用的,解析到它并停止
11. 如果表达式不是 untyped模式,跳到14
12. 如果i和这个相等,解析到这个常量并停止
13. 产生一个局部变量命名为 i,解析到它并停止
14. 失败
> 1. If i is true, false, this, super or null, resolve to the matching constant and halt.
> 2. If a local variable named i is accessible, resolve to it and halt.
> 3. If the current field is static, go to 6.
> 4. If the current class or any of its parent classes has a field named i, resolve to it and halt.
> 5. If a static extension with a first argument of the type of the current class is available,resolve to it and halt.
> 6. If the current class has a static field named i, resolve to it and halt.
> 7. If an enum constructor named i is declared on an imported enum, resolve to it and halt.
> 8. If a static named i is explicitly imported, resolve to it and halt.
> 9. If i starts with a lower-case character, go to 11.
> 10. If a type named i is available, resolve to it and halt.
> 11. If the expression is not in untyped mode, go to 14
> 12. If i equals __this__, resolve to the this constant and halt.
> 13. Generate a local variable named i, resolve to it and halt.
> 14. Fail
对于第10步,也需要定义类型的解析顺序:
> For step 10, it is also necessary to define the resolution order of types:
1. 如果一个类型名为 i 被导入(直接或者作为模块的部分导入),解析到它并停止
2. 如果当前的包包含一个模块名为 i和类型名为i,解析到它并停止
3. 如果一个类型名为i在顶层可用,解析到它并停止
4. 失败
> 1. If a type named i is imported (directly or as part of a module), resolve to it and halt.
> 2. If the current package contains a module named i with a type named i, resolve to it and halt.
> 3. If a type named i is available at top-level, resolve to it and halt.
> 4. Fail
对于这个算法的第一步,和之前的第5部第7步,导入决议的顺序很重要:
> For step 1 of this algorithm as well as steps 5 and 7 of the previous one, the order of import resolution is important:
* 导入的模块和静态扩展从底部到头部检查,第一个匹配的被采用
* 在一个给定模块,类型从头至尾检查
* 对于导入,如果名字相同则为匹配
* 对于静态扩展(第6.3节),如果名字相同并且第一个参数统一(第3.5节)则为匹配。在一个给定类型中被用作静态扩展的字段从头至尾进行检查。
> * Imported modules and static extensions are checked from bottom to top with the first match being picked.
> * Within a given module, types are checked from top to bottom.
> * For imports, a match is made if the name equals.
> * For static extensions (6.3), a match is made if the name equals and the first argument unifies (3.5). Within a given type being used as static extension, the fields are checked from top to bottom.
![](https://box.kancloud.cn/2016-07-30_579cc0b6b85bd.png)
- 空白目录
- 1.Haxe介绍
- 1.1.Haxe是什么
- 1.2.关于本文档
- 1.2.1.作者及贡献者
- 1.2.2.License
- 1.3Hello World
- 1.4.Haxe的历史
- 2.类型
- 2.1.基本类型
- 2.1.1.数值类型
- 2.1.2.溢出
- 2.1.3.数值运算符
- 2.1.4.Bool类型
- 2.1.5.Void类型
- 2.2.为空性
- 2.2.1.可选参数和为空性
- 2.3.类实例
- 2.3.1.类的构造函数
- 2.3.2.继承
- 2.3.3.接口
- 2.4.枚举实例
- 2.4.1.Enum构造函数
- 2.4.2.使用枚举
- 2.5.匿名结构
- 2.5.1.结构值的JSON形式
- 2.5.2. 结构类型的类记法
- 2.5.3.可选字段
- 2.5.4.性能影响
- 2.6.函数类型
- 2.6.1.可选参数
- 2.6.2.默认值
- 2.7.动态类型
- 2.7.1.Dynamic使用类型参数
- 2.7.2.实现Dynamic
- 2.8.抽象类型
- 2.8.1.隐式类型转换
- 2.8.2.运算符重载
- 2.8.3.数组访问
- 2.8.4.选择函数
- 2.8.5.枚举抽象类型
- 2.8.6.转发抽象类型字段
- 2.8.7.核心类型抽象
- 2.9.单形
- 3.类型系统
- 3.1.Typedef
- 3.1.1.扩展
- 3.2.类型参数
- 3.2.1.约束
- 3.3.泛型
- 3.3.1.泛型类型参数解释
- 3.4.变异
- 3.5.统一
- 3.5.1.类/接口 之间
- 3.5.2.结构子类型化
- 3.5.3.单形
- 3.5.4.函数返回
- 3.5.5.通用基本类型
- 3.6.类型推断
- 3.6.1.由上而下推断
- 3.6.2.局限
- 3.7.模块和路径
- 3.7.1.模块子类型
- 3.7.2.Import
- 3.7.3.解析顺序
- 4.类字段
- 4.1.变量
- 4.2.属性
- 4.2.1.常见访问标识符组合
- 4.2.2.对类型系统的影响
- 4.2.3.getter和setter的规则
- 4.3.方法
- 4.3.1.重写方法
- 4.3.2.变异和访问修饰符的影响
- 4.4.访问修饰符
- 4.4.1.可见性
- 4.4.2.Inline
- 4.4.3.Dynamic
- 4.4.4.Override
- 4.4.5.Static
- 5.表达式
- 5.1.块
- 5.2.常量
- 5.3.二元操作符
- 5.4.一元操作符
- 5.5.数组声明
- 5.6.对象声明
- 5.7.字段访问
- 5.8.数组访问
- 5.9.函数调用
- 5.10.var
- 5.11.局部函数
- 5.12.new
- 5.13.for
- 5.14.while
- 5.15.do-while
- 5.16.if
- 5.17.switch
- 5.18.try/catch
- 5.19.return
- 5.20.break
- 5.21.continue
- 5.22.throw
- 5.23.类型转换
- 5.23.1.不安全转换
- 5.23.2.安全转换
- 5.24.类型检查
- 6.语言特性
- 6.1.条件编译
- 6.2.Externs
- 6.3.静态扩展
- 6.3.1.标准库中的静态扩展
- 6.4.模式匹配
- 6.4.1.介绍
- 6.4.2.枚举匹配
- 6.4.3.变量捕获
- 6.4.4.结构匹配
- 6.4.5.数组匹配
- 6.4.6.Or 模式
- 6.4.7.守护
- 6.4.8.多个值的匹配
- 6.4.9.提取器
- 6.4.10.穷尽性检查
- 6.4.11.无效的模式检查
- 6.5.字符串插值
- 6.6.数组推导
- 6.7.迭代器
- 6.8.函数绑定
- 6.9.元数据
- 6.10.访问控制
- 6.11.内联构造函数
- 7.编译器用法
- 7.1.编译器标记
- 8.编译器功能
- 8.1.内建编译器元数据
- 8.2.无用代码消除
- 8.3.编译器服务
- 8.3.1.概述
- 8.3.2.字段访问完成
- 8.3.3.调用参数完成
- 8.3.4.类型路径完成
- 8.3.5.使用完成
- 8.3.6.位置完成
- 8.3.7.顶级完成
- 8.3.8.完成服务
- 8.4.资源
- 8.4.1.嵌入资源
- 8.4.2.检索文本资源
- 8.4.3.检索二进制资源
- 8.4.4.实现细节
- 8.5.运行时类型信息
- 8.5.1.RTTI 结构
- 8.6.静态分析仪
- 9.宏
- 9.1.宏上下文
- 9.2.参数
- 9.2.1.ExprOf
- 9.2.2.常数表达式
- 9.2.3.其它的参数
- 9.3.具体化
- 9.3.1.表达式具体化
- 9.3.2.类型具体化
- 9.3.3.类具体化
- 9.4.工具
- 9.5.类型构建
- 9.5.1.枚举构建
- 9.5.2.@:autoBuild
- 9.5.3.@:genericBuild
- 9.6.限制
- 9.6.1.Macro-in-Macro
- 9.6.2.静态扩展
- 9.6.3.构建顺序
- 9.6.4.类型参数
- 9.7.初始化宏
- 10.标准库
- 10.1.字符串
- 10.2.数据结构
- 10.2.1.数组
- 10.2.2.向量
- 10.2.3.列表
- 10.2.4.GenericStack
- 10.2.5.Map
- 10.2.6.Option
- 10.3.正则表达式
- 10.3.1.匹配
- 10.3.2.分组
- 10.3.3.替换
- 10.3.4.分割
- 10.3.5.Map
- 10.3.6.实现细节
- 10.4.Math
- 10.4.1.特殊数值
- 10.4.2.数学错误
- 10.4.3.整数数学
- 10.4.4.扩展
- 10.5.Lambda
- 10.6.模板
- 10.7.反射
- 10.8.序列化
- 10.8.1.格式化序列化
- 10.9.Xml
- 10.9.1.开始使用Xml
- 10.9.2.解析Xml
- 10.9.3.编码Xml
- 10.10.Json
- 10.10.1.解析JSON
- 10.10.2.编码JSON
- 10.10.3.实现细节
- 10.11.Input/Output
- 10.12.Sys/sys
- 10.13.远程处理
- 10.13.1.远程连接
- 10.13.2.实现细节
- 10.14.单元测试
- 11.Haxelib
- 11.1.Haxe编译器使用库
- 11.2.haxelib.json
- 11.2.1.版本控制
- 11.2.2.依赖关系
- 11.3.extraParams.hxml
- 11.4.使用Haxelib
- 12.目标平台细节
- 12.1.JavaScript
- 12.1.1.开始使用Haxe/JavaScript
- 12.1.2.使用外部JavaScript库
- 12.1.3.注入原生JavaScript
- 12.1.4.JavaScript untyped函数
- 12.1.5.调试JavaScript
- 12.1.6.JavaScript目标元数据
- 12.1.7.为JavaScript暴露Haxe类
- 12.1.8.使用 require函数加载外部类
- 12.2.Flash
- 12.2.1.开始使用Haxe/Flash
- 12.2.2.嵌入资源
- 12.2.3.使用外部Flash库
- 12.2.4.Flash目标元数据
- 12.3.Neko
- 12.4.PHP
- 12.4.1.开始使用Haxe/PHP
- 12.4.2.PHP untyped函数
- 12.5.C++
- 12.5.1.Using C++定义
- 12.5.2.Using C++ 指针
- 12.6.Java
- 12.7.C#
- 12.8.Python