Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 语言{a^ib^jc^i}的上下文无关语法_Compiler Construction_Context Free Grammar_Context Free Language - Fatal编程技术网

Compiler construction 语言{a^ib^jc^i}的上下文无关语法

Compiler construction 语言{a^ib^jc^i}的上下文无关语法,compiler-construction,context-free-grammar,context-free-language,Compiler Construction,Context Free Grammar,Context Free Language,在练习过程中,我应该为以下语言编写上下文无关语法: 我不确定我是否完全理解这种方法,但以下是我得到的 由于我们需要至少1个c被任何数量相等的a和b包围(可能为零),因此我得出了以下结果: T --> aCb | aTb | C C --> cS | cC S --> empty 例如,从上面可以看出,如果字符串中至少没有1c,我就永远不会创建字符串。但是我可以创建一个只有ac的字符串,而没有a或b。类似地,我可以创建带有aa..c..bb(带有任意数量的a,和b,中间只有1

在练习过程中,我应该为以下语言编写上下文无关语法:

我不确定我是否完全理解这种方法,但以下是我得到的

由于我们需要至少1个c被任何数量相等的ab包围(可能为零),因此我得出了以下结果:

T --> aCb | aTb | C
C --> cS | cC
S --> empty
例如,从上面可以看出,如果字符串中至少没有1c,我就永远不会创建字符串。但是我可以创建一个只有ac的字符串,而没有ab。类似地,我可以创建带有aa..c..bb(带有任意数量的a,和b,中间只有1个c)的字符串,以及与前面类似但带有任意数量的c的字符串

然而,我觉得这个CTF比需要的要复杂一些。有谁能告诉我如何改进,如果,或者在这种情况下,它是错误的-我错过了什么

编辑:在从rici获得一些好的输入之后,我现在得到的是:

T --> aTb | cC
C --> cC | empty
通过删除任何冗余(如通过
aTb
C
可以实现的
aCb
)以及非终端
S

  • 消除
    S
    。除了领工资支票,它什么也没做

  • T→ C b是多余的,因为您已经有了T→ a T b
    T→ C
    ,它显然可以做同样的事情(按顺序应用它们)


  • 谢谢你的反馈。但是,我不确定我是否认为不需要使用S。由于语言要求至少有一个“c”,我必须以某种方式强制CFG生成这个“c”,然后它才能生成空结果(通常以epsilon表示)。因此,如果我删除S,我将不得不在其他地方添加空的,在这种情况下,我如何确保表达式中至少有一个“c”?不过,你说的aCb是多余的,这是完全正确的(谢谢!)
    S
    仅出现在语法中的一个位置,在该位置它将扩展为零。(ε只是一种不写任何东西以使其可见的方法。)因为你总是可以用它的派生词替换非终结符,你可以重写
    C→ cS
    与精确等效的
    C→c
    。因此,
    S
    没有任何贡献。不要把这些东西复杂化了。它们被称为重写规则,因为它们只是一种表达“你可以用那个代替这个”的方式。这只是一个有符号的游戏而已我明白你的意思,因此,如果我重写表达式,使
    T
    产生
    aTb
    cC
    ,然后让
    C
    产生
    cC
    |
    empty
    ,它就更干净了,而且我还有一个属性,那就是我必须至少产生一个
    C
    。@ComSciStu:你为什么如此执着于C产生空的结果<代码>T→aTb | C;C→cC | c可以正常工作。但是如果愿意,您可以将
    c
    c
    的基本情况移动到
    T
    的基本情况;在这里,它没有什么区别。我认为这可能是由于我到目前为止所学到的,在这里,以某种方式包含空字符串似乎很重要。但是我明白你的观点,就是让
    c
    生成一个
    c
    ,而其他任何东西都是无效的,并且生成的结果与我刚才生成的
    cC
    空的
    一样。