我正在尝试创建无上下文语法,它在{a,b}上生成所有正则表达式,至少有一个Kleene星。到目前为止我所做的是:
S ::= A + S | A
A ::= B . A | B
B ::= T | B* | (S)
T ::= a | b | eps
我想这可以生成所有正则表达式,但我无法理解的是如何定义它以便至少有一个Kleene星需要在该表达式中。
答案 0 :(得分:1)
问题是状态机的典型问题,其中存在初始状态,并且通过"传递"州。解决方案是使右侧对应于每个状态。我将使用数字2表示代表传递状态的规则。
S ::= S2
S2 ::= A + S2 | A2 + S1 | A2
A2 ::= B2 . A | B . A2 | B2
B2 ::= B* | (S2)
S1 ::= A + S1 | A
A ::= B . A | B
B ::= T | B* | (S1)
T ::= a | b | eps
传递表达式是根据传递子表达式定义的。因此,语法将始终在表达式的左侧或右侧生成闭包。