考虑以下BNF语法:
<S> ::= a <S> c <B> | <A> | b
<A> ::= c <A> | c
<B> ::= d | <A>
好的,所以我给了各种各样的字符串,一个是:
aabccd
如果字符串可以从BNF语法派生,那么我应该提供一个派生。
所以我从一个非终端开始(据我所知):
<S> ::= a <S> c <B> -> a a <S> c <B> c <B> -> a a b c <B> c <B> ->
a a b c <A> c <B> -> a a b c c c <B> -> a b c c c d
这是对的吗?因此无法衍生出来?因为我有三个C?或者我做错了。在BNF方面总计n00b。
编辑:好的,从更“自由”的方法看它。在字符串中将称为“c”的终端/令牌与非终端&lt; A&gt;,换句话说“c&lt; A&gt;”转换为简单的“c”是否有效/合法?鉴于“c A”是“A”?因此允许我将它们转换为简单的“c”。然后,这将允许我获取所请求的字符串:
<S> ::= a <S> c <B> -> a a <S> c <B> c <B> -> a a b c <B> c <B> ->
a a b c <A> c <B> -> a a b c c <B> -> a a b c c d
有效吗?
编辑:我不知道如何使小于和大于符号出现,尝试使用美元符号,但我想它在这里不起作用。
答案 0 :(得分:1)
由于您的语法是无上下文的,您可以将其转换为Chomsky Normal Form (CNF)并应用CYK (Cooke-Young-Kasemi)算法来检查该单词是否是L(G)的一部分,以便无猜测,确定性方法。
答案 1 :(得分:1)
你的第一个推导是正确的,并且&#39; aabccd&#39;没有用这个语法解析。你需要第三个&#39; c&#39;因为它可以解析 - 所以&#39; aabcccd&#39;可以解析,但不能解析&#39;
。祝你好运。