Computer science 上下文无关语法——计算理论
我正在准备期末考试&我正在读维基百科上的上下文无关语法文章,遇到了下面的例子Computer science 上下文无关语法——计算理论,computer-science,context-free-grammar,Computer Science,Context Free Grammar,我正在准备期末考试&我正在读维基百科上的上下文无关语法文章,遇到了下面的例子 S → SS- (1st production rule) S → (S) - (2nd production rule) S → () - (3rd production rule) 我很清楚左右派生。当我试图解决这个问题时,我从开始符号开始 S-> SS -> (S)S-> ()S-> ()(S) -> ()() 但当我看到答案时,是这样的 S → SS → SSS → (S
S → SS- (1st production rule)
S → (S) - (2nd production rule)
S → () - (3rd production rule)
我很清楚左右派生。当我试图解决这个问题时,我从开始符号开始
S-> SS -> (S)S-> ()S-> ()(S) -> ()()
但当我看到答案时,是这样的
S → SS → SSS → (S)SS → ((S))SS → ((SS))S(S)
→ ((()S))S(S) → ((()()))S(S) → ((()()))()(S)
→ ((()()))()(())
我不确定我的答案出了什么问题?是否需要两次使用第一个产生式规则?谁能帮我一下吗
当我试图解决这个问题时,我从开始符号开始
什么问题?维基百科的文章没有带来任何问题。它只是展示了一个语法,描述了匹配良好的括号中的语言,并给出了该语言中一个单词的示例以及如何派生它
这是一个完全正确的推导
但当我看到答案时,是这样的
S → SS → SSS → (S)SS → ((S))SS → ((SS))S(S)
→ ((()S))S(S) → ((()()))S(S) → ((()()))()(S)
→ ((()()))()(())
这不是答案(毫无疑问)。这只是一个例子
我不确定我的答案出了什么问题
你的推导没有错。
()
和(()())(())(())
都是该语言中的有效单词
是否需要两次使用第一个产生式规则
您可以根据需要频繁地应用产生式规则(当然,假设术语中存在您要替换的非终端),并且可以按照您想要的任何顺序应用产生式规则。这一切都取决于你想派生哪个词。你的方法没有“错”——你只是在维基百科的文章中派生了不同的符号序列
关键的一点是,可以使用语法派生任何匹配的嵌套括号序列,但不能派生像
(()
或)()(
这篇文章只是给出了一个可能的字符串,可以用该语法表示……您给出了另一个可能的字符串。您可以使用派生来证明这些字符串根据该语法是有效的(即反向)
EDIT:beattothepunch:p在上面的问题中,S是非终结符,(,)是终结符。我知道我们在使用递归,但它是如何工作的?所以我们可以根据需要多次应用规则,以在结尾实现终结符?@cool:是的,但通常(在考试中,或编写解析器时)你正在走另一条路-使用规则来显示特定序列(例如,
(())
)是有效的。和@Simon-好的,这是有意义的。谢谢。