Compiler construction 上下文无关语法嵌套括号,以可能的';]结尾';

Compiler construction 上下文无关语法嵌套括号,以可能的';]结尾';,compiler-construction,context-free-grammar,Compiler Construction,Context Free Grammar,我对CFG比较陌生,不知道你们中是否有人能帮我确定我目前的解决方案是否正确。我被要求生成上下文无关语法,它接受嵌套括号的语言,这样,如果最后一个标记是右方括号,它将关闭所有剩余的左括号 接受这些字符串的一些示例是:(((])、(()(])(()) 不接受这些字符串的一些示例是:(]),(,()) 目前我的语法如下: S->epsilon S->() S->(] S->(S) S->(S) S->(S) S->SS 从我尝试过的所有示例中,包括上面列出的已接受和未接受状态,我认为我的CFG是正

我对CFG比较陌生,不知道你们中是否有人能帮我确定我目前的解决方案是否正确。我被要求生成上下文无关语法,它接受嵌套括号的语言,这样,如果最后一个标记是右方括号,它将关闭所有剩余的左括号

接受这些字符串的一些示例是:(((])、(()(])(()) 不接受这些字符串的一些示例是:(]),(,())

目前我的语法如下:

  • S->epsilon
  • S->()
  • S->(]
  • S->(S)
  • S->(S)
  • S->(S)
  • S->SS
从我尝试过的所有示例中,包括上面列出的已接受和未接受状态,我认为我的CFG是正确的。我想知道是否有任何方法可以比简单地随机尝试大量可能性更具体地检查这一点,或者你们中是否有人可以发现任何错误

提前谢谢

更新:

我相信我已经找到了理想的解决方案,尽管我可能还是错了。从我遇到的问题的基本情况开始:

  • S->(]
  • S->(())
  • S->()(]
从我的归纳步骤

  • S->(一)
  • S->(I()]
  • S->((I)]
  • S->(()I]
  • S->(I)(]
  • S->()I(]
  • S->()(I)

  • I->()

  • 一->二
  • I->(
  • I->(I)

由于第一个产品,第二个和第三个产品是多余的(因此第四个和第五个产品将分别派生
()
(]


但是,您的语法将派生,例如,
((
(重复使用产品6,然后使用产品1),因此它不仅能识别所需的语言。

如果我删除第一个产品,会怎么样。然后,第三个和第四个产品仍然是必需的,并且不是多余的,此外,
ccc
将不再被语法识别?是的,但是
()将被接受。您需要找到语言的递归特征。您不能用随机添加和删除产品来解决这样的问题。因此,如果我只考虑嵌套括号的情况,我可以得到以下产品:-s>()-s>(s)。-S->SS我的主要问题是如何解释开放括号是允许的,但必须用一个方括号“]”封闭的可能性。也许你可以帮助我开发这种情况下的递归特征?一个简单的特征是它由一个不平衡字符串和一个闭合括号组成。这里,由不平衡的I表示打开多于关闭。请注意,每个不平衡字符串都有一个唯一的第一个不匹配的圆括号。这应该是足够的提示。顺便说一下,要生成平衡字符串:
S->ε
S->(S)S
,这是确定的。这对本练习来说并不重要,但值得考虑的是:第一个打开有一个唯一的关闭。您的语法也接受
(])
,这应该被禁止,因为]已经关闭了所有(.CFGs允许使用多个不同的非终端。你可能会发现这很有用。@JakeMitchell你能解释一下或提供一个小例子吗?@user3277807他说你可以使用非终端而不是
s
。比如
s->(X),X->…