【发布时间】:2017-04-29 00:05:17
【问题描述】:
我的任务是编写基于正则表达式的正则语法。
给定正则表达式a*b可以写成S -> b | aS
ba* 作为正则文法是S -> b | Sa 不正确吗?
我被告知正确答案实际上是S -> bA, A -> ^| aA,但我自己看不出有什么区别。
非常感谢您的解释!
【问题讨论】:
我的任务是编写基于正则表达式的正则语法。
给定正则表达式a*b可以写成S -> b | aS
ba* 作为正则文法是S -> b | Sa 不正确吗?
我被告知正确答案实际上是S -> bA, A -> ^| aA,但我自己看不出有什么区别。
非常感谢您的解释!
【问题讨论】:
IIRC,您的答案和被称为“正确”的答案都是正确的。见this。您构建的是“左正则语法”,而“正确”答案的支持者显然更喜欢“右正则语法”。还有其他任意规则可能或多或少有些迂腐,例如“无空产生式”规则,但它们并不会真正影响常规语言的类别,只会影响您用于特定语言的语法的紧凑性,如您的示例突出显示 - 具有两个替代方案的单个产品与两个产品,一个具有单个子句,一个具有两个替代方案,其中一个是空的。
【讨论】: