Compiler construction 编译器:为0和1的所有字符串集设计语法,使每个0后面紧跟至少一个1

Compiler construction 编译器:为0和1的所有字符串集设计语法,使每个0后面紧跟至少一个1,compiler-construction,context-free-grammar,Compiler Construction,Context Free Grammar,我想这可能是s->(0*1)*,但我不太明白,无法确定。 这个问题来自《编译器龙书》。您的语法定义不正确。例如,字符串011显然满足给定的属性,但是语法无法识别它。此外,语法可以识别像001这样的字符串,这显然不满足给定的属性,因为第一个0后面紧跟着一个0,而不是1 正则表达式011*确保0后面紧跟着至少一个1,因此接受所有具有所需属性的二进制字符串的语言可以用正则表达式1*(011*)*表示 等效CFG如下所示: S → AB A → ε | 1A B → ε | CB C → 01A 在上

我想这可能是
s->(0*1)*
,但我不太明白,无法确定。
这个问题来自《编译器龙书》。

您的语法定义不正确。例如,字符串
011
显然满足给定的属性,但是语法无法识别它。此外,语法可以识别像
001
这样的字符串,这显然不满足给定的属性,因为第一个
0
后面紧跟着一个
0
,而不是
1

正则表达式
011*
确保
0
后面紧跟着至少一个
1
,因此接受所有具有所需属性的二进制字符串的语言可以用正则表达式
1*(011*)*
表示

等效CFG如下所示:

S → AB
A → ε | 1A
B → ε | CB
C → 01A

在上述CFG定义中,
A
对应于回答我问题的
1*
B
对应于
(011*)*
C
对应于
011*

。感谢您的快速回复。
(0?1)*
可以说更简单。(
A→ 0 1 | A 1 |ε
)@rici确实是非常好的简化