如何在字母{a,b}上找到以下正则表达式的语言?
aUb*
(ab*Uc)
ab*Ubc*
a*bc*Uac
编辑:在我疯狂地投票之前,如果有人能告诉我解决这些问题的步骤,我会很感激,而不仅仅是解决方案。也许甚至可以让我通过一个,所以我可以自己完成剩下的工作。
谢谢!
答案 0 :(得分:6)
编辑:简短回答,*
表示几乎所有正则表达式/语法语法中的“零次或多次重复”包括perl5和RFC 5234. *
通常比连接和交替更紧密地绑定。
您说您想要一种超过字母表的语言(a,b),但在表达式中包含c
和U
。我假设你想要一个像BNF这样的形式的字母表(a,b,c)的语言语法给定一个正则表达式,其中U
是一个低优先级联合运算符,类似于{{1在perl re。
在那种情况下,
|
相当于BNF:
a|b*
L := a
| <M>
M := epsilon
| b <M>
运算符表示零或更多,因此*
中的第一个子句是基本情况,第二个子句是M
的递归使用,包括终端{{ 1}}。
L只是单个终端M
或非终结b
。
a
M
M的推导方式与上述相同,其余部分是自解释的。
(ab*|c)
L ::= a <M>
| c
M ::= epsilon
| b <M>
N的推导方式与上述M相同。
ab*|bc*
大多数正则表达式语言中的L ::= a <M>
| b <N>
M ::= epsilon
| b <M>
N ::= epsilon
| c <N>
绑定比连接更紧密,因此这与
a*bc*|ac
归结为
*
通常,要将正则表达式转换为BNF,只需在正则表达式中使用邻接来表示BNF中的邻接,而正则表达式中的(a*b(c*))|(ac)
或L ::= <M> b <N>
| a c
M ::= epsilon
| a <M>
N ::= epsilon
| c <N>
表示在BNF中表示U
。 / p>
如果您定义了非终结|
,那么您可以处理|
:
<X> ::= x
使用相同的非终结x*
,您可以处理L ::= epsilon
| <X> <L>
:
<X> ::= x
这会让你获得离开x+
的重复运算符L ::= <X>
| <L> <X>
和*
。 +
只是
?
答案 1 :(得分:2)
虽然Mike给出了生成正则表达式表示的语言的语法,但是你的作业本身会请求语言。因为您正在处理正则表达式,所以您的答案必须是常规集。
回想一下字母表中常规集的定义:
Let Σ be an alphabet. The class of regular sets over Σ is the smallest class
containing ∅, {λ}, and {a}, for all a ∈ Σ, and closed under union, concatenation,
and Kleene star.
现在回想一下字母表中正则表达式的定义:
Let Σ be an alphabet. The class of regular expressions over Σ is the smallest
class containing ∅, λ, and a, for all a ∈ Σ, and closed under union, concat-
enation, and Kleene star.
因此,翻译应该是直截了当的。实际上,它包括在每个字母周围插入大括号!例如:
a ∪ b* denotes {a} ∪ {b}*
ab* ∪ c denotes {a}{b}* ∪ {c}
...
如果要在集合构建器表示法中表达每个正则表达式的语言,则可以恢复到常规集上的操作定义。召回:
Let A and B be regular sets. Then
1 A ∪ B = {x : x ∈ A ∨ x ∈ B}
2. AB = {xy : x ∈ A ∧ y ∈ B}
3. A* = ∪[i = 0 -> ∞]A^i
通过替换常规集合操作的定义,可以将常规集转换为集合构建器表示法。为了避免引入嵌套的集合构建器表示法,我使用了与并置定义相关的等式来表示常规集合的连接。
{a} ∪ {b}* = {w : w ∈ {a} ∨ w ∈ ∪[i = 0 -> ∞]{b}^i}
{a}{b}* ∪ {c} = {w : (w = xy ∧ (x ∈ {a} ∧ y ∈ ∪[i = 0 -> ∞]{b}^i)) ∨ w ∈ {c}}
...
您现在应该能够毫无困难地找到剩余表达式所表示的语言。
答案 2 :(得分:1)
如果你知道明星,联合和连接意味着什么,这些应该很容易。第一个是工会b明星。根据操作顺序,这意味着一个联盟(b星)。联盟表示左侧语言中的任何内容或右侧语言中的任何内容。 a表示由长度为一的字符串a组成的语言; b star表示由任意字符串组成的语言,该字符串由零个或多个b符号组成,不包含任何其他内容。所以这个语言是{empty,a,b,bb,bbb,bbbb,...}。在第二个中,ab *表示由a后跟零个或多个b符号组成的所有字符串。首先是星形,然后是连接,然后是联合,遵守给定的明确括号。