模块
就类似与写了个实现某周功能的类
基本格式
<模块名>DEFINITIONS::=
BEGIN END
模块定义,EXPORTS ,输出给别的模块用,例如是多个类型只有这两个供外部使用
不写exports是都可以引用
写exports ;都不能引用
imports比输出多了个from,声明来自那个模块
RFC1155实例
在ASH.1编译器中可以使用AUTOMATIC TAGS来自动补上tag
宏定义
给原有类型加上了标签,就是一个新类型(标签类型)
Number的实质就是INTEGER
而实际的BNF产生式,定义出来的标签类型还不是真正的全新类型
想要创造出新的类型,所以就引入了宏定义的概念
BNF产生式的格式就是类型符号与值符号。我宏定义就是新的类型符号与值符号,来创造新的类型
打造类型的模板,即为宏定义
类似于模块的,不同关键字,begin,end,有了一个bnf才有的支持产生式
写出类型表示
值表示
支持产生式
用已有类型代替宏定义的变量参数,就产生宏实例
在不使用宏定义的时候可以这样实现某种功能
标准格式中这块类似于bnf的终结符,要加“”,同时TYPE-X是之前定义好的
这两个地方实际上就是宏定义的位置。挖出来的两个洞
这个就是宏实例的位置
这个就是一个宏实例
<>等效为已有ASN.1的编码规则
可以看到类型表示不光可以填类型,还可以填一段字符串
同时类型表示和值表示可以不相关
Revsion定义了一个新的支持产生式
由生成支持产生式+类型定义才能确定有多少个类型(洞的个数)
这里ACCESS与STATUS是两个非终结符,由底下的两个支持产生式生成
之前可能会有疑问,为什么type不是非终结符可以已被替代,这个表后五个所表示的都不会被替代
由表可知,不能再type加type。所以这种写法是错的。。。(国际标准也有错的)