上下文无关语法 BNF

Context Free Grammar BNF

需要非扩展 BNF 语法方面的帮助:

Σ = {a,b,c}

L = {ω ɛ Σ^* | such that all a's (if any) comes before all c's(if any)}

例如,字符串 aba、cbc 和 abacbc 在该语言中,但字符串 abcabc 不是。

这是我目前所知道的(正确吗?如果我错了请指正):

s->asbsc|bsasc|ascsb|ɛ

a'sc's的数量需要一样吗?如果不是,那么您就错过了它们不同的情况,例如:aac。我认为这样的事情应该可行:

S -> AC
A -> aA | bA | ε
C -> bC | cC | ε

A 产生式用于推导不是 c 的字符序列,C 产生式用于推导不是 a

您的评论说您希望 a 和 c 的数量相等,因此请从实现这一点的简单语法开始:

S -> aSc | ε

并添加任意数量的 b before/after/between 那些:

S -> BaScB | B
B -> Bb | ε

请注意,上面的内容没有歧义(甚至是 LR(1))。

如果要允许不同数量的 a 和 c,可以使用相同的方法来避免歧义。仅从 a 和 c 开始:

S -> AC
A -> Aa | ε
C -> Cc | ε

并在每个字符的开头和后面添加 b:

S -> BAC
A -> AaB | ε
C -> CcB | ε
B -> Bb | ε