问题描述
如何将正则表达式(ab*)*b
转换为上下文无关的语法?
当我查找示例时,我在表达式中总是看到加号,但是我没有。那只是一种不同的书写方式吗?
解决方法
您可以递归应用以下规则,每个规则都将单个正则表达式运算符更改为非终结符。 (为每个运算符使用不同的非终结符名称。)以下,R
和S
是正则表达式运算符的操作数的转换。 N
是该运算符转换成的非终结符。终端只是通过不变地传递。
-
串联:
R S ⇒ N → R
-
替代:
R | S ⇒ N → R N → S
-
Kleene星:
R* ⇒ N → ε N → N R
-
Kleene plus:
R+ ⇒ N → R N → N R
-
可选:
R? ⇒ N → ε N → R
例如,
Regex Transform Productions
(a b* )*b 3. b* ⇒ N1 N1 → ε
N1 → N1 b
( aN1 )*b 1. aN1 ⇒ N2 N2 → a N1N2* b 3. N2* ⇒ N3 N3 → ε
N3 → N3 N2N3b 1. N3b ⇒ N4 N4 → N3 b