首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GrammarBuilder对象奇怪行为中附加选择

在GrammarBuilder对象奇怪行为中附加选择
EN

Stack Overflow用户
提问于 2016-11-15 20:26:04
回答 2查看 94关注 0票数 2

假设我想在一个选项对象total_choice中匹配这个正则表达式,这个正则表达式将是一个更好的语法的一部分:值( 3-9 \ 1-7 ),我就是这样构建它的:

代码语言:javascript
复制
Choices total_choice= new Choices(); 
Choices all_digits = new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" });

// value [3-9][0-9]
gb_aux = new GrammarBuilder("value");
gb_aux.Append( new Choices(new string[] { "3", "4", "5", "6", "7", "8", "9" }));
gb_aux.Append(all_digits);
total_choice.Add(gb_aux);

// value  [1-7][0-9]
gb_aux = new GrammarBuilder("value");
gb_aux.Append(new Choices(new string[] { "1", "2", "3", "4", "5", "6", "7" }));
gb_aux.Append(all_digits);   ///// <------
total_choice.Add(gb_aux);

这个问题出现在带有箭头的句子中。如果我取消评论,程序就会崩溃。我以前做过同样的几行,我不明白为什么现在有问题,而不是以前。

注意:我知道这不是构建语法的最佳方法,我只是简化了问题的重点。

为了回答尼古拉的建议,让我说得更具体些。问题是,我需要识别“飞行水平”,然后是数字30,700。但是飞行员不会说“四十”,他们说“四零”,这就是为什么我把数字分开的原因。我知道Nikolay建议我建立一个更简单的语法(三个连续数字),并将范围控制在另一个层次上。我喜欢这个主意。所以我想:

代码语言:javascript
复制
// flight level [0-9][0-9][0-9]
   gb_aux = new GrammarBuilder("flight level");
   gb_aux.Append(new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }));
   gb_aux.Append(new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }));
   gb_aux.Append(new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }));
   level_choices.Add(gb_aux);

但是,当我附加第二组数字时,就会出现和以前一样的问题。它不会崩溃,实际上界面从来没有启动过。意识到现在我不再重复使用all_digits对象了,我每次都创建一个新的对象。

另一次尝试,当我说第二个数字(然后崩溃)时,这个方法跳转到拒绝的方法:

代码语言:javascript
复制
  gb_aux = new GrammarBuilder("flight level");
  Regex reg = new Regex(@"^\d\d\d?$"); //also tried "^\s?\d\s\d\s\d?\s?$"
  Choices chose = new Choices();
  chose.Add(reg.ToString());
  gb_aux.Append(chose);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-16 16:48:13

明白了!虽然我仍然不知道为什么我尝试过的一些东西不起作用。

代码语言:javascript
复制
   GrammarBuilder level = new GrammarBuilder();
   level.Append("flight level", 0, 1); //"flight level" is optional
   Choices digits = new Choices(new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" });
   level.Append(digits, 2, 3); //minimum 2 digits, maximum 3 digits
票数 1
EN

Stack Overflow用户

发布于 2016-11-15 21:36:03

您不能追加all_choices两次,您必须创建新的选择。

总之,您不应该设计非常复杂的语法。用户永远不会跟踪他们,识别器将有困难的时间。允许用户说出任意的数字序列,并使用正则表达式解析语音识别结果。如果数字序列不匹配,只需警告用户。这允许您在识别了部分字符串时也可以等待输入。

通过执行严格而复杂的语法,您就失去了识别和处理用户错误的能力。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40619066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档