規則定義は、正当な規則展開を規則名と結びつける。規則定義はまた、規則定義の範囲を定義している:ただし、定義される文法中でローカルであるか否か、あるいは他の文法の範囲内で参照されているかどうかに無関係である。規則定義はさらに文書コメントと意味タグを含む。
規則名は、文法の範囲内で一意でなければならない。同一の規則名は、それぞれの規則定義を一意に同定する方法を定義している規則名決定仕様に基づいて、複数の文法にわたって使用できる。
規則定義の主目的は、正当な規則展開を規則名と結びつけることである。
正当な規則名とは、Extensible Markup Language(XML)1.0仕様によって定義された正当なIDでなければならない。IDの制約は、文法のXML形式とABNF形式の両方に適用される。
正当な規則名は、ピリオド文字'.'、コロン文字':'、またはハイフン文字'-'を(いずれもXML IDの正当な文字であるが)含むことができない。この制約は、文法仕様と厳密に結び付けられる"音声認識のための意味解釈"仕様のための一貫した構文を許可する。この制約は、文法のXML形式とABNF形式の両方に適用される。
規則名は、XML文法とABNF文法において大文字と小文字の区別ができる。正確な文字列比較が、分析された規則名参照に使われる。
正当な規則名は、特殊な規則ではない:すなわち、"NULL"、"VOID"または"GARBAGE"。
ABNF形式
規則定義は、正当な規則名に従う任意の範囲指定している宣言(次の節で説明)、等号、正当な規則展開、そして終了のセミコロンからなる。規則定義は、次の正当な書式のうちの1つを含む:
$ruleName = ruleExpansion; public $ruleName = ruleExpansion; private $ruleName = ruleExpansion;
例えば:
$city = Boston | "New York" | Madrid; $command = $action $object;
特殊なケース
空の規則定義は不当である。
空の括弧と$NULL(等価の形式)に展開する規則を定義することは、正当である。1つのタグに展開する規則を定義することは、正当である。
// Legal $rule = (); $rule = $NULL; $rule = {tag}; // ILLEGAL $rule = ;
XML形式
規則定義は、rule要素で表される。要素の"id"属性は規則の名前を示し、文法の範囲内で一意でなければならない(これは、XMLによって強制される)。rule要素の内容は、2節で定義されたいくつかの正当な規則展開である。scope属性は、次の節で説明される。
<rule id="city"> <one-of> <item>Boston</item> <item>"San Francisco"</item> <item>Madrid</item> </one-of> </rule> <rule id="command"> <ruleref uri="#action"/> <ruleref uri="#object"/> </rule>
特殊なケース
空の規則要素または空白CDATAだけを含む規則要素を定義することは、正当でない。
空のアイテムまたはNULLの1つの規則参照に展開する規則を定義することは、正当である。
1つのタグ要素に展開する規則を定義することは、正当である。
<!-- Legal --> <rule id="rule"><item/></rule> <rule id="rule"><ruleref special="NULL"/></rule> <rule id="rule"><tag>content</tag></rule> <!-- ILLEGAL --> <rule id="rule"/> <rule id="rule"></rule> <rule id="rule"> </rule>
規則定義は文法でローカルとして定義されるか、もしくは外部に対して参照可能で動作可能である。ローカルな範囲での規則は、プライベートである。外部に参照可能である規則は、パブリックでなければならない。範囲が規則定義で明確に述べられない限り、規則はプライベートにデフォルト設定する。
パブリックに範囲指定された規則は他の文法の規則定義に参 照される(プライベートに範囲指定された規則は参照されることができない)。4節は、規則参照の便利な表記をサポートするエイリアスの機構とnamespace分析を説明する。エイリアスは、単に略記された参照構文であって、規則の範囲指定している動作を変えない。
1つの例外は、ルートとして宣言された規則はたとえそれがプライベート規則であるとしても外部に参照されるということである。詳細は4.1.4節を参照。
パブリックな範囲による規則は、認識のために動作する。すなわち、それらは口語的な入力に対するトップレベルの構文を定義する。例えば、VoiceXML文法動作は1つのパブリック規則または複数のパブリック規則を明確に参照する。
範囲指定する意味は、文法立案者が動作規則を別の場所での使用を目的として輸出された規則と区別することができるようにするということである。ここで定義される範囲指定のメカニズムは、Java(TM)プログラミング言語のそれに最も近い。
ABNF形式
規則定義は、"public"または"private"によって注釈がつけられる。範囲が与えられないならば、デフォルトは"private"である。
$town = Townsville | Beantown; private $city = Boston | "New York" | Madrid; public $command = $action $object;
XML形式
"rule"要素の"scope"属性は、規則定義の範囲を定義する。定義された値は、"public"、そして"private"である。省略されるならば、デフォルトの範囲は"private"である。
<rule id="town"> <one-of> <item>Townsville</item> <item>Beantown</item> </one-of> </rule> <rule id="city" scope="private"> <one-of> <item>Boston</item> <item>"San Francisco"</item> <item>Madrid</item> </one-of> </rule> <rule id="command" scope="public"> <ruleref uri="#action"/> <ruleref uri="#object"/> </rule>
定義とともに規則定義にマッチするフレーズの例を含めることは、望ましい。0、1または多くの例フレーズが、いくつかの規則定義のために用意されている。例が明確に指定されるので、自動ツールが回帰テストのため、そして文法文書の生成のために使われる。
ABNF形式
文書コメントは、関連した規則定義に先行するキャラクタシーケンス/**から始まるC/C++/Javaコメントである。0以上の"@example"タグは、文書コメントの終端にはさまれる。例のtokenizationは、2節で定義されるtokenizationとシーケンス規則に従う。
/** * A simple directive to execute an action. * * @example open the window * @example close the door */ public $command = $action $object;
XML形式
"rule"要素の範囲内の最初の内容として、何個かの"example"要素が与えられる。例のtokenizationは、2節で定義されるtokenizationとシーケンス規則に従う。
<rule id="command" scope="public"> <!-- A simple directive to execute an action. --> <example> open the window </example> <example> close the door </example> <ruleref uri="#action"/> <ruleref uri="#object"/> </rule>