左线性和右线性语法

时间:2012-12-11 08:38:27

标签: grammar regular-language computation-theory formal-languages

我需要帮助为下面的语言构建左线性和右线性语法?

a)  (0+1)*00(0+1)*
b)  0*(1(0+1))*
c)  (((01+10)*11)*00)*

对于a)我有以下内容:

Left-linear
S --> B00 | S11
B --> B0|B1|011

Right-linear
S --> 00B | 11S
B --> 0B|1B|0|1

这是对的吗?我需要帮助b&角

2 个答案:

答案 0 :(得分:79)

从正则表达式

构造等效的正则语法

首先,我从一些简单的规则开始,用正则表达式(RE)构造正则语法(RG) 我正在为Right Linear Grammar编写规则(留下练习为Left Linear Grammar编写类似的规则)

注意:大写字母用于变量,小写用于语法终端。 NULL符号为^。术语'任何数字' 表示*星形闭合的零次或多次。

[ BASIC IDEA ]

  • 单一终端:如果RE只是e (e being any terminal),我们可以编写G,只有一个生产规则S --> e(其中S is the start symbol 1}}),是一个等价的RG。

  • UNION OPERATION:如果RE的格式为e + fe and f are terminals,我们可以写G两个生产规则S --> e | f,是一个等效的RG。

  • 加强:如果RE的格式为efe and f are terminals,我们可以使用两个生产规则G S --> eA, A --> f { {1}},是一个等价的RG。

  • STAR CLOSURE:如果RE的格式为e*,其中e is a terminal* Kleene star closure操作,我们可以编写两个生产规则GS --> eS | ^,是一个等效的RG。

  • PLUS CLOSURE:如果RE的格式为e + ,其中e is a terminal+ Kleene plus closure操作,我们可以写GS --> eS | e中的两个生产规则是等效的RG。

  • 联盟上的星球关闭:如果RE的格式为(e + f)*,e and f are terminals,我们可以在{{1}中编写三个生产规则},G,是一个等价的RG。

  • 关联联盟:如果RE的格式为(e + f) + ,两者都是S --> eS | fS | ^,我们可以写e and f are terminals中的四个生产规则G是等效的RG。

  • 明星关闭会话:如果RE的格式为(ef)*,S --> eS | fS | e | f,我们可以在e and f are terminals中编写三个制作规则,G,是一个等价的RG。

  • 加上关闭:如果RE的格式为(ef) + ,两者都是S --> eA | ^, A --> fS,我们可以写三个生产e and f are terminals中的规则G是等效的RG。

请确保您理解以上所有规则,以下是摘要表:

S --> eA, A --> fS | f
  

注意:符号+-------------------------------+--------------------+------------------------+ | TYPE | REGULAR-EXPRESSION | RIGHT-LINEAR-GRAMMAR | +-------------------------------+--------------------+------------------------+ | SINGLE TERMINAL | e | S --> e | | UNION OPERATION | e + f | S --> e | f | | CONCATENATION | ef | S --> eA, A --> f | | STAR CLOSURE | e* | S --> eS | ^ | | PLUS CLOSURE | e+ | S --> eS | e | | STAR CLOSURE ON UNION | (e + f)* | S --> eS | fS | ^ | | PLUS CLOSURE ON UNION | (e + f)+ | S --> eS | fS | e | f | | STAR CLOSURE ON CONCATENATION | (ef)* | S --> eA | ^, A --> fS | | PLUS CLOSURE ON CONCATENATION | (ef)+ | S --> eA, A --> fS | f | +-------------------------------+--------------------+------------------------+ e是终端,^是NULL符号,f是起始变量

<强> [ANSWER]

现在,我们可以找你问题。

a) S

  

语言描述:所有字符串均由0和1组成,至少包含一对(0+1)*00(0+1)*

  • 右线性语法:

    S - &gt; 0S | 1S | 00A
    A - &gt; 0A | 1A | ^

    字符串可以以000的任意字符串开头,这就是为什么包含规则1而且因为至少有一对s --> 0S | 1S,所以没有空符号。包含00因为S --> 00A0可以在1之后。符号00负责A之后的0&1和1。

  • 左线性语法:

    S - &gt; S0 | S1 | A00
    A - &gt; A0 | A1 | ^

b) 00

  

语言描述:任意数字0,后跟任意数字10和11         {因为1(0 + 1)= 10 + 11}

  • 右线性语法:

    S - &gt; 0S | A | ^
    A - &gt; 1B
    B - &gt; 0A | 1A | 0 | 1

    字符串以任意数量的0*(1(0+1))*开头,因此包含规则0,然后使用S --> 0S | ^生成1011的规则任意次数。

    其他替代权利线性语法可以

    S - &gt; 0S | A | ^
    A - &gt; 10A | 11A | 10 | 11

  • 左线性语法:

    S - &gt; A | ^
    A - &gt; A10 | A11 |乙
    B - &gt; B0 | 0

    另一种形式可以是

    S - &gt; S10 | S11 | B | ^
    B - &gt; B0 | 0

c) A --> 1B and B --> 0A | 1A | 0 | 1

  

语言描述:首先是语言包含null(^)字符串,因为在()内部存在的每个东西外面都有*(星号)。此外,如果语言中的字符串不为null,则以00结尾为止。可以简单地以(((A)* B)* C)*的形式认为这个正则表达式,其中(A)*是(01 + 10) *这是01和10的任意重复次数。   如果在字符串中有一个A实例,那么肯定会有一个B,因为(A)* B和B是11   一些示例字符串{^,00,0000,000000,1100,111100,1100111100,011100,101100,01110000,01101100,0101011010101100,101001110001101100 ....}

  • 左线性语法:

    S - &gt; A00 | ^
    A - &gt; B11 |小号
    B - &gt; B01 | B10 |一个

    (((01+10)*11)*00)*因为任何字符串都为null,或者如果它不为null,则以S --> A00 | ^结尾。当字符串以00结尾时,变量00与模式A匹配。同样,此模式可以为null,也可以以((01 + 10)* + 11)*结尾。如果为null,则11再次与A匹配,即字符串以S之类的模式结束。如果模式不为空,则(00)*B匹配。当(01 + 10)*尽可能匹配时,B会再次开始匹配字符串。这会关闭A中的最多*。

  • 右线性语法:

    S - &gt; A | 00S | ^
    A - &gt; 01A | 10A | 11S

问题的第二部分

((01 + 10)* + 11)*

(的 答案
由于以下原因,您的解决方案是错误的,

左线性语法错误因为字符串For a) I have the following: Left-linear S --> B00 | S11 B --> B0|B1|011 Right-linear S --> 00B | 11S B --> 0B|1B|0|1 无法生成。 右线性语法错误因为字符串0010无法生成。虽然两者都是由问题(a)的正则表达式生成的语言。

修改
为每个正则表达式添加DFA。这样人们就会发现它很有帮助。

a) 1000

DFA

b) (0+1)*00(0+1)*

DFA

c) 0*(1(0+1))*

为这个正则表达式绘制DFA既诡计又复杂 为此,我想添加DFA&#39>

为了简化任务,我们应该考虑RE的种类形成 对我而言,RE (((01+10)*11)*00)*看起来像(((01+10)*11)*00)*

(a*b)*

实际上在上面的表达式(((01+10)*11)* 00 )* ( a* b )* 中,它以a的形式自我表达 那是(a*b)*

RE ((01+10)*11)*等于(a*b)*。 (a b)的DFA如下:

DFA

(a + b)*b + ^的DFA是:

DFA

((01+10)*11)*的DFA是:

DFA

尝试找到上述三种DFA构造的相似性。不要先行,直到你不理解第一个

答案 1 :(得分:2)

将正则表达式转换为左或右线性常规语法的规则 Cheat sheet