天天看点

ODL VS ONOS中YANG转化对比

Yang(A Data Modeling Language for the Network Configuration Protocol)是一种用于模型配置和状态数据建模的语言。      
作为一门语言有其自身的规则语法(参考RFC6020),而证明一个句子,是否为YANG语言这个命题自然就涉及到编译原理的内容。      

    编译原理的主要内容包括:语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。

    幸运的是开源工具ANTLR(Another Tool for Language Recognition)是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器,则可以帮助开发人员完成语句到语法树的自动构建。

   工具基础入门参考http://blog.csdn.net/sunquan291/article/details/71541553

   ODL与ONOS中的YANG模型代码转换功能,都有使用ANTLR。下面通过示例YANG文件比较两者的差别:

示例YANG定义文件:

module network6 {
     yang-version 1;
     namespace "http://zte.com";
     prefix Ant;
     description "Interval before a route is declared invalid";
 
     container interface {
          leaf ifType {
                type string;
          }
     }
}
           

ONOS定义的文法产生的语法树:

ODL VS ONOS中YANG转化对比

ODL定义的文法产生的语法树:

ODL VS ONOS中YANG转化对比

从图上可以直观的看出,ONOS要比ODL生成的语法树节点类更多、结构更复杂。ODL中所有的句子,都由同一条产生式进行语法校验

statement : SEP* keyword SEP* (argument)? SEP* (SEMICOLON | LEFT_BRACE SEP* (statement)* SEP* RIGHT_BRACE SEP*) SEP*;

而ONOS的G4方法则根据RFC6020 的ABNF范式完整的描述了YANG的语法规则。从这个角度看,ONOS完整校验了YANG的词法、语法,而ODL则根本没有这个功能。不信,看个例子:

container interface {

          leaf ifType {

                type string;

          }

sunquan interface {

          love ifType {

                who string;

          }

     }

右边的句子由左边修改而来,熟悉YANG语法的同学知道,右边肯定是非法的,对于sunquan love who标识符YANG中没有此类定义。如下,ODL与ONOS对于这个句子的词语法校验:

ODL语法分析通过,并生成语法树:

ODL VS ONOS中YANG转化对比

ONOS语法分析出错,实际上词法分析都通不过。

ODL VS ONOS中YANG转化对比

自此ONOS的YAGN模型代码生成工具至此就返回了,而ODL呢,通过语法分析后,来到语义分析,语义分析过程中,加入了大量的校验规则,此时检测到句子的不合法,程序返回。最简单的,他定义了在产生式statement中的keyword不能为sunquan。其大量的校验都硬编码到了代码中:

ODL VS ONOS中YANG转化对比

很明显这就带来问题:

1、开发过程中,大量这种校验工具,故障多,易出错,难调试。

2、针对YANG后序升级后规则的变化调整,修改牵一发而动全身,复杂且不易控制。

总结一下:就是ODL使用了ANTLR这把牛刀,但却用来切菜去了,而ONOS则用的恰如其分。

继续阅读