首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与BNF解析器进行BNF匹配?

如何与BNF解析器进行BNF匹配?
EN

Stack Overflow用户
提问于 2021-08-11 04:08:26
回答 1查看 120关注 0票数 0

我使用的是https://github.com/sylvainhalle/Bullwinkle/,一个BNF解析器。但是它只能识别单个整句的BNF模式,如何在段落中找到BNF匹配呢?我在试着识别人类说话中的某些命令。以BNF为例:

代码语言:javascript
复制
<S>: <lightcmd>;
<lightcmd>: <do> <obj> | <do> <a> <obj>;
<do>: turn on | turn off;
<a>: a | an | the;
<obj>: light;

我可以通过说“打开灯”来解析正确的命令,但是我不能从“请打开灯”解析它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-11 11:59:34

当你试图对语法解析“请打开灯”时,解析器将试图解析整个话语.因为解析器就是这么做的。但你想要的是与部分话语相匹配。

现在,您可以处理如下问题:

代码语言:javascript
复制
<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 

但你开始陷入歧义的问题。

我认为一个更好的方法是尝试解析单词流的子序列。所以如果用户说

代码语言:javascript
复制
please turn on a light and make a cup of tea

您尝试以“请”开始解析。当失败时,你试着从“转身”开始。然后,当你到达“光”时,你会忽略剩下的单词。

我不知道布尔温克尔能不能这样用。如果不是,请寻找另一种解析器生成器。

但是,也应该注意到,像这样简单的语法也可以写成正则表达式,其中单词被视为基本符号。您只需要一个简单的正则表达式引擎来处理这个问题。(如果这种语法是典型的,则只需要分组和交替。它应该只需要几个小时的工作就可以从头开始实现。)

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

https://stackoverflow.com/questions/68735902

复制
相关文章

相似问题

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