需要帮助找到这些语言的上下文无关语法

need help finding the context free grammar of these languages

我需要帮助来查找这些语言的语法。 我觉得我对这些解决方案一无所获

1) {a^h b^k a^m b^n | h + k = m + n}

2) {a^i b^j a^k | (i = j and k ≥ 0) or (i ≥ 0 and j > k)}

任何帮助将不胜感激

我假设您正在寻找上下文无关语法。我将使用 S 是根产生式规则并且大写单词是规则(如 SABA 等)的约定,空产生式写成 empty ,文字写成 'a''b'.

第一个语法是:

S := AB
AB := 'a' AB 'b' | AA | BB
AA := 'a' AA 'a' | BA
BB := 'b' BB 'b' | BA
BA := 'b' BA 'a' | empty

这里的诀窍是要认识到要使两半的长度保持相同,必须定义在任一侧添加一个符号的文法产生式。然后要注意,我们首先在左侧添加 'a',在右侧添加 'b',然后从那里我们继续向两侧添加 'a',或向两侧添加 'b'双方,最后继续向左侧添加 'b',向右侧添加 'a'。

第二种语法是:

S := AB A | A B BA
AB := 'a' AB 'b' | empty
A := 'a' A | empty
B := 'b' B | 'b'
BA := 'b' BA 'a' | empty

这比第一个更容易:根产生式已经作为两个事物的选择给出,所以在规则中表达它是很自然的。第一个选择是生成一定数量的 'a',然后是相同数量的 'b',然后是任意数量的 'a'。第二种选择是生成一些 'a's,然后是一些正数的 'b's,然后是相等数量的 'b's 和 'a's。这保证了 "j>k" 在该选择的描述中。

这里的语法都不是明确的,尽管消除歧义只是稍微复杂一点。