【问题标题】:Context free grammar- theory of computation上下文无关文法-计算理论
【发布时间】:2011-05-24 02:00:09
【问题描述】:

我正在为我的期末考试而学习,我正在阅读来自维基百科的上下文无关语法文章,并遇到了以下示例。

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 是非终结符,(, ) 是终结符。我知道我们正在使用递归,但它是如何工作的?

标签: computer-science context-free-grammar


【解决方案1】:

您的方法没有任何“错误” - 您只是从维基百科文章中导出了不同的符号序列。

关键点是可以使用语法导出任何匹配、嵌套括号序列,但不能导出像(())()( 这样的序列。

【讨论】:

    【解决方案2】:

    当我试图解决这个问题时,我从开始符号开始

    什么问题?维基百科文章没有任何问题。它只是显示了描述匹配括号的语言的语法,并给出了该语言中单词的示例以及如何派生它。

    S-> SS -> (S)S-> ()S-> ()(S) -> ()() 
    

    这是一个完全有效的推导。

    但是当我看答案时,它是这样的

    这不是 答案(没有问题)。这只是一个例子。

    我不确定我的回答有什么问题?

    你的推导没有错。 ()()((()()))()(()) 都是该语言中的有效词。

    第一个产生式规则需要使用两次吗?

    您可以根据需要以任意顺序应用生产规则(当然,假设您要替换的非终端出现在术语中)。这完全取决于您要派生哪个词。

    【讨论】:

    • 所以我们可以多次应用规则来获得终端符号?
    • @cool: 是的,但通常(在考试中,或者在编写解析器时)你会采用另一种方式——使用规则来显示一个特定的序列(例如(()()))是有效。
    • 和 @Simon - 好吧,这很有道理。谢谢。
    【解决方案3】:

    这篇文章只是给出了一个可以使用该语法表示的可能字符串......您正在给出另一个可能的字符串。您可以使用推导来证明这些字符串根据语法是有效的(即反向进行)。

    编辑:被打败了:P

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 1970-01-01
      • 2014-05-09
      • 2017-04-19
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      相关资源
      最近更新 更多