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定義的文法産生的文法樹:
從圖上可以直覺的看出,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文法分析通過,并生成文法樹:
ONOS文法分析出錯,實際上詞法分析都通不過。
自此ONOS的YAGN模型代碼生成工具至此就傳回了,而ODL呢,通過文法分析後,來到語義分析,語義分析過程中,加入了大量的校驗規則,此時檢測到句子的不合法,程式傳回。最簡單的,他定義了在産生式statement中的keyword不能為sunquan。其大量的校驗都寫死到了代碼中:
很明顯這就帶來問題:
1、開發過程中,大量這種校驗工具,故障多,易出錯,難調試。
2、針對YANG後序更新後規則的變化調整,修改牽一發而動全身,複雜且不易控制。
總結一下:就是ODL使用了ANTLR這把牛刀,但卻用來切菜去了,而ONOS則用的恰如其分。