如何从正则表达式中找到语言?

时间:2011-10-03 02:53:12

标签: regex context-free-grammar regular-language formal-languages

如何在字母{a,b}上找到以下正则表达式的语言?

aUb*
(ab*Uc)
ab*Ubc*
a*bc*Uac
编辑:在我疯狂地投票之前,如果有人能告诉我解决这些问题的步骤,我会很感激,而不仅仅是解决方案。也许甚至可以让我通过一个,所以我可以自己完成剩下的工作。

谢谢!

3 个答案:

答案 0 :(得分:6)

编辑:简短回答,*表示几乎所有正则表达式/语法语法中的“零次或多次重复”包括perl5和RFC 5234. *通常比连接和交替更紧密地绑定。

您说您想要一种超过字母表的语言(a,b),但在表达式中包含cU。我假设你想要一个像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符号组成的所有字符串。首先是星形,然后是连接,然后是联合,遵守给定的明确括号。