这两个常规语法不同是错误的吗?如果是的话,为什么?

Is it, and if so why, wrong that these two regular grammars are different?

我的任务是编写基于正则表达式的正则语法。

给定正则表达式 a*b 可以写成 S -> b | aS

ba*作为常规文法是S -> b | Sa不正确吗?

有人告诉我正确答案实际上是 S -> bAA -> ^| aA,但我自己看不出有什么不同。

如有解释,将不胜感激!

IIRC,您的答案和被称为 "correct" 的答案都是正确的。参见 this。您构造的是 "left regular grammar",而 "correct" 答案的支持者显然更喜欢 "right regular grammar"。还有其他一些或多或少迂腐的规则,比如 "no empty productions" 规则,但它们并没有真正影响常规语言的 class,只是你使用的语法的紧凑性特定语言,正如您的示例所强调的那样 - 一个作品有两个备选方案与两个作品,一个只有一个子句,一个有两个备选方案,其中一个是空的。