如何从此正则表达式派生常规语法?

时间:2016-01-29 02:34:41

标签: regex

如何从这个正则表达式派生常规语法?

(a or b)*ba(ba)*

我坚持最后一部分 所以

S -> A | B | C
A -> aA | bA
B -> bC
C -> cD
D->bE ?
E->af | ^ ?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

  • S (a + b)* b a (b a)*

最初的(a + b)*提供了三种可能性:它可以扩展为a (a + b)*,也可以扩展为b (a + b)*,或者可以为空:

  • S a (a + b)* b a (b a)* = aS
  • S b (a + b)* b a (b a)* = bS
  • S b a (b a)* = A

对于 A ,初始b a完全受约束,所以我们必须写一下:

  • A b a (b a)* = bB
  • B a (b a)* = aC

对于 C (b a)*提供了两种可能性:它可以扩展为b a (b a)*,也可以为空:

  • C b a (b a)* = bB
  • C →ε

(使用a (b a)*与我们已经定义的非终端匹配的事实。如果失败了,我们可以写一下:

  • C b a (b a)* = bD
  • D a (b a)* = aC
  • C →ε

把它放在一起:

  • S aS
  • S bS
  • S A
  • A bB
  • B aC
  • C bB
  • C →ε