语音识别的语法定义了语音识别所支持的命令词的集合, Aitalk 4.0 产品利用巴科斯范式(BNF)
描述语音识别的语法。语法文档被编译成识别网络后,将被送往语音识别器。语音识别器提取输
入语音的特征信息并在识别网络上进行路径匹配,最终识别出用户说话的内容。因此语法是语音
识别系统的输入之一,它是现阶段语音识别得以应用的必要条件。
例如,开发一个简单的语音拨号应用,可以定义一个如下的语法:

该语法使识别引擎可以支持以下说法:

凡是用户说出这个范围中的任意一句话,均可以被识别系统识别。如果用户说的话不在上述范围
之内,识别系统可能拒绝识别。可见语法使用一种结构描述了用户可能说出的语言范围和构成模
式。
Sementic,表示用户说法所对应的用户所关心的内容,在应用开发中,Aitalk 语法文档包含两个部分,文档首部(Header)和文档主体(Body)。
文档首部定义了文档的各种属性,而文档的主体则具体定义了用户说话的内容和模式,其由若干
个规则组成。
Aitalk 支持块注释及行注释,表示对诧法内容的注释,诧法编译器将忽略注释。如:

文档首部必须出现在文档的开头部分,也就是说一旦出现了第一个规则定义, 即宣告文档首部的
结束, 出现在文档主体中的文档首部声明, 作为文档主体(规则扩展)看徃, 造成语法编译失败。
Aitalk 语法文档以半角分号”;“作为每个定义的分隔符。每个分号表示某个定义结束。

Aitalk语法规范定义的所有的操作符及关键词均为半角字符,而不支持全角字符。
Aitalk 可以使用关键词及操作符定义诸如规划名、语法名等变量名, Aialk 仅支持英文字符及数
字的组合,对于其它字符将会导致编译错误。

Aitalk 定义的最大变量名长度为 15 个英文字符,超过该长度将会导致编译错误。
Aitalk 语法规范使用一系列操作符及内置关键词描述语法内容。
语法支持的操作符详见下表:


支持的内置关键词见下表:

文档首部定义了文档的各种属性,包含以下几个组成部分:
BNF 文档自标识头(Self-Identifying Header,强制)
BNF 文档必须在其第一行包含一个形式如下的自标识头,其中的留空必须为一个半角空格字符。
文档自标识头定义了文档的版本和编码格式。其中:

BNF 文档需要在文档首部定义语法的名称,借助于语法名称,应用程序可以在特定的业务节点使
用特定的语法。用户使用 Aitalk SDK 提供的识别接口,可以指定每次调用使用的语法名称。
语法名称的定义形式如下:

槽为支持劢态修改诧法内容的槽。Aitalk 支持诧法编译完成后劢态修改诧法的内容,以劢态支持
新的说法。用户通过在诧法首部声明槽规则,指定用户可劢态更改的规则。形式如下:

用户可以在文档主体定义规则, 也可以通过开发接口中定义规则,即用户可以在语法中声明某个
槽而无须在文档文体中定义,而是程序运行过程中通过 Aitalk SDK 进行动态添加不删除槽中所
含的条目。Aitalk 要求定义为槽的规则必须满足为一系列的词表的并列结构,否则会导致编译失
败。

语法文档内容定义为的一系列的规则,用户必须在文档首部定义语法的初始规则。形式如下

语音识别语法是通过规则定义(Rule Definition)和规则引用(Rule Reference)来组成语法主体
(Body)的。规则引用的各种组合通称为规则扩展(Rule Expansion)。
一个规则定义用赋值操作符“:”把规则名称和规则内容联系起来,规则名称左右需要被包含在
“<>”中,而规则内容就是所谓的规则扩展。规则扩展的最基本的结构是顺序、选择和循环。
规则的定义形式如下:

其中表示规则名称,而 ruleExpansion 表示规则内容,其是一系列的规则及词的组合,均不能为空。
每个规则都必须保证其定义的唯一性,也就是规则名在同一个语法中不能够被定义两次。在定义
规则时,要注意规则名称不能是 VOID、NULL 和 GARBAGE,这三个规则名称被作为保留关键词
为后续功能扩展使用。
记号定义了单词或者其它可以被说出的实体。任何记号都是合法规则扩展。因此识别系统最终识
别出的是记号。如下所示,规则 rule 定义为三个可选的记号:中国、美国、德国。

可以通过关键词!id 定义了记号所对应的语义。语义只能支持数字, 其它数字将会导致编译错误。
语义支持的数字范围为 32 位有符号整形,也就是-2^(32-1) ~ 2^(32-1) -1(其中^表示幂操作),
当定义的数字操作不在此范围时,会导致编译错误或者被截断。
注意,语义不能支持规则的语义。

在文档首部声明槽时,可以在文档主体中进行槽的定义,也可以丌进行定义,而是在识别过程中
通过 SDK 动态定义。
槽必须定义为一系列记号的并列组合。如下所示,

也可以为其中的记号标识语义。

注意,如果记号中出现空格、制表符等分隔符,需要用成对的双引号进行标识。如

规则引用是指引用本文档中所定义的规则。如下所示,在规则中引用了的规则。

Aitalk 系统可以支持引用未定义的槽。未被定义为槽的规则未定义时,语法编译器将会返回编译
错误的信息。
规则引用是上下文无关的,即用户可以预先引用规则,而在后面定义规则,如下所示,
规则预先引用规则,而在规则后再定义规则:

一个规则定义可以连续引用多个规则名,记号名以及它们的各种组合。序列相当于程序设计中的
顺序结构。如

将规则名、记号及其组合以左右小括号括起可以使之作为一个整体参与规则的定义。如,以下两
条规则的等同的。

在规则扩展中选择结构表示说话时只可能覆盖其中的一条路径,它相当于程序设计语言中的选择
结构。选择结构以”|”来分隔每个可能的分支。如

不同的操作符之间具有不同的优先级。以下为不同操作符由高到低的排序。