Compiler construction 上下文无关语法嵌套括号,以可能的';]结尾';
我对CFG比较陌生,不知道你们中是否有人能帮我确定我目前的解决方案是否正确。我被要求生成上下文无关语法,它接受嵌套括号的语言,这样,如果最后一个标记是右方括号,它将关闭所有剩余的左括号 接受这些字符串的一些示例是:(((])、(()(])(()) 不接受这些字符串的一些示例是:(]),(,()) 目前我的语法如下: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是正
- S->epsilon
- S->()
- S->(]
- S->(S)
- S->(S)
- S->(S)
- S->SS
- 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->…
。