我使用的是https://github.com/sylvainhalle/Bullwinkle/,一个BNF解析器。但是它只能识别单个整句的BNF模式,如何在段落中找到BNF匹配呢?我在试着识别人类说话中的某些命令。以BNF为例:
<S>: <lightcmd>;
<lightcmd>: <do> <obj> | <do> <a> <obj>;
<do>: turn on | turn off;
<a>: a | an | the;
<obj>: light;我可以通过说“打开灯”来解析正确的命令,但是我不能从“请打开灯”解析它。
发布于 2021-08-11 11:59:34
当你试图对语法解析“请打开灯”时,解析器将试图解析整个话语.因为解析器就是这么做的。但你想要的是与部分话语相匹配。
现在,您可以处理如下问题:
<S>: <words> <lightcmd> <words>;
<lightcmd>: <do> <obj> | <do> <a> <obj>;
<do>: turn on | turn off;
<a>: a | an | the;
<obj>: light;
<words>: <word> | <words> <word>
<word>: // one or more letters 但你开始陷入歧义的问题。
我认为一个更好的方法是尝试解析单词流的子序列。所以如果用户说
please turn on a light and make a cup of tea您尝试以“请”开始解析。当失败时,你试着从“转身”开始。然后,当你到达“光”时,你会忽略剩下的单词。
我不知道布尔温克尔能不能这样用。如果不是,请寻找另一种解析器生成器。
但是,也应该注意到,像这样简单的语法也可以写成正则表达式,其中单词被视为基本符号。您只需要一个简单的正则表达式引擎来处理这个问题。(如果这种语法是典型的,则只需要分组和交替。它应该只需要几个小时的工作就可以从头开始实现。)
https://stackoverflow.com/questions/68735902
复制相似问题