Spoofax语言工作台学习笔记——命名的定义和声明
2014-04-01 16:10
190 查看
今天在使用名称绑定语言NaBL的时候,解决了命名定义和声明的命名校验的问题。
语言场景是这样的,一个源文件定义了app(应用),具有唯一id。定义诺干个dataset(数据集)并且声明对应的app id,但是dataset可以在多个文件中,dataset无id,dataset下有诺干data model(entity、webpage),data model在app的命名范围下具有唯一id。
关键语法定义的SDF片段:
先贴出正确的NaBL解决方法:
查阅了NaBL的官方文档,本来以为会有直接的方法,但是为了实现应用定义和应用下属页面和数据集定义在不同的文件(不同解析树),不能直接使用scopes子句定义应用的子命名空间。因此,我的解决方案是定义一个AppRef临时的命名空间,重点在于以下片段:
详细解释一下三个从句,第一句,表示从App命名空间中引用命名appId;第二句,定义新的命名空间AppRef,虽然功能实现了,但这句有一点非常令我费解,使用unique和non-unique并无区别, 都可以重复引用(符合当前需求);第三句,和官方文档上用法一致,使得 DataModel, Page在AppRef的命名空间下,这句从句必须紧跟defines 从句之后,表示在AppRef命名空间下。
问题解决了,回顾解决思路,引入AppRef命名空间,在AppRef下定义命名空间,引入中个中级命名空间最主要的原因是app id定义和声明在不同的解析树中(跨文件)。
语言场景是这样的,一个源文件定义了app(应用),具有唯一id。定义诺干个dataset(数据集)并且声明对应的app id,但是dataset可以在多个文件中,dataset无id,dataset下有诺干data model(entity、webpage),data model在app的命名范围下具有唯一id。
关键语法定义的SDF片段:
"app" ID Dataset -> AppDecl{"AppDecl"} "app" ID Page -> AppDecl{"AppDecl"}
先贴出正确的NaBL解决方法:
module names imports include/SmartX namespaces App AppRef DataModel DataModelProperty Page rules App(appId, pageId) : defines unique App appId refers to Page pageId in AppRef appId AppDecl(appId, _) : refers to App appId//声明定义 defines unique AppRef appId//声明临时引用命名空间 scopes DataModel, Page//DataModel,Page在App命名空间作用范围下 Entity(e, _): defines unique DataModel e Webpage(w, _, _, _): defines unique DataModel w scopes DataModelProperty Property(_, x, _, _): defines unique DataModelProperty x Page(pageId, _, _, _, _, _, _, _): defines unique Page pageId
查阅了NaBL的官方文档,本来以为会有直接的方法,但是为了实现应用定义和应用下属页面和数据集定义在不同的文件(不同解析树),不能直接使用scopes子句定义应用的子命名空间。因此,我的解决方案是定义一个AppRef临时的命名空间,重点在于以下片段:
AppDecl(appId, _) : refers to App appId//声明定义 defines unique AppRef appId//声明临时引用命名空间 scopes DataModel, Page//DataModel,Page在App命名空间作用范围下
详细解释一下三个从句,第一句,表示从App命名空间中引用命名appId;第二句,定义新的命名空间AppRef,虽然功能实现了,但这句有一点非常令我费解,使用unique和non-unique并无区别, 都可以重复引用(符合当前需求);第三句,和官方文档上用法一致,使得 DataModel, Page在AppRef的命名空间下,这句从句必须紧跟defines 从句之后,表示在AppRef命名空间下。
问题解决了,回顾解决思路,引入AppRef命名空间,在AppRef下定义命名空间,引入中个中级命名空间最主要的原因是app id定义和声明在不同的解析树中(跨文件)。
相关文章推荐
- Go语言学习笔记 --- 常量、变量、批量定义与声明、数据类型、类型别名、类型转换
- c++ primer 学习笔记21类的定义和声明、隐含的this指针、类作用域
- Objective-C学习笔记(十八)——对象方法和类方法的声明,定义及调用
- 学习笔记之C++为什么将函数声明或者类的定义放在.h文件中,而将其实现放在原文件中
- JAVA学习笔记:注释、变量的声明和定义、
- Go语言学习笔记 --- 常量的定义详解
- 定义与声明的区别--学习笔记
- c++primer学习笔记-----3.1命名空间的using 声明
- Objective-C的.h与.m文件中公有和私有函数的声明和定义方式[学习笔记]
- C++ Primer学习笔记6 标准库类型(命名空间的using声明、标准库string类型)
- c++学习笔记之声明和定义的关系
- C语言学习笔记(6)-如何从变量声明的表面上来区分指针数组和数组指针
- Golang学习笔记:语言规范之声明与作用域
- C++ Primer学习笔记 之 变量的声明与定义
- c++ Premier 学习笔记(unit2 变量和基本类型 -声明与定义
- C语言学习笔记----伊能C语言学习笔记----如何在一个文件中使用另一个文件中定义的变量呢??
- C++ Primer 学习笔记_47_类与数据抽象 --类的定义和声明
- [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)
- [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组
- spring学习笔记(3)Bean命名、定义与配置