【问题标题】:Left-Linear and Right-Linear Grammars左线性和右线性语法
【发布时间】:2012-11-28 18:44:07
【问题描述】:

在为以下语言构建左线性和右线性语法方面需要帮助吗?

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 & c 方面的帮助。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    从正则表达式构造等效的正则语法

    首先,我从一些简单的规则开始,从正则表达式 (RE) 构造正则语法 (RG)。
    我正在为右线性语法编写规则(作为练习为左线性语法编写类似规则)

    注意:大写字母用于变量,小写用于语法中的终结符。 NULL 符号是^。术语'任意数字'表示零次或多次是*星闭包。

    [基本思想]

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

    • 联合操作: 如果 RE 的形式为 e + f,其中两个都是 e and f are terminals,我们可以写成 G,有两个生产规则 S --> e | f,是等效 RG。

    • CONCATENATION:如果RE的形式是ef,其中两个e and f are terminals,我们可以写成G,有两个生产规则S --> eA, A --> f,是等价的RG。

    • STAR CLOSURE:如果RE的形式是e*,其中e is a terminal* Kleene star closure运算,我们可以在G,@987654348中写两条产生式规则@, 是等价的 RG。

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

    • STAR CLOSURE ON UNION: 如果 RE 的形式为 (e + f)*,其中两个都是 e and f are terminals,我们可以在 G 中编写三个产生式规则,@ 987654355@,是等效的 RG。

    • PLUS CLOSURE ON UNION:如果 RE 是 (e + f)+ 的形式,其中两个 e and f are terminals,我们可以写四个产生式GS --> eS | fS | e | f 中的规则是等效的 RG。

    • STAR CLOSURE ON CONCATENATION: 如果 RE 的形式为 (ef)*,其中两个都是 e and f are terminals,我们可以在 GS --> eA | ^, A --> fS 中编写三个产生式规则, 是等价的 RG。

    • PLUS CLOSURE ON CONCATENATION: 如果 RE 的形式为 (ef)+,其中两个都是 e and f are terminals,我们可以在GS --> eA, A --> fS | f 是等效的 RG。

    请确保您了解上述所有规则,以下是汇总表:

    +-------------------------------+--------------------+------------------------+
    | 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 |
    +-------------------------------+--------------------+------------------------+
    

    注意:符号ef是终结符,^是NULL符号,S是开始变量

    [回答]

    现在,我们可以来解决您的问题。

    a) (0+1)*00(0+1)*

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

    • 正确的线性语法:

      S --> 0S | 1S | 00A
      A --> 0A | 1A | ^

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

    • 左线性语法:

      S --> S0 | S1 | A00
      A --> A0 | A1 | ^

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

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

    • 正确的线性语法:

      S --> 0S |一个 | ^
      A --> 1B
      B --> 0A | 1A | 0 | 1

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

      其他替代的右线性语法可以是

      S --> 0S |一个 | ^
      A --> 10A | 11A | 10 | 11

    • 左线性语法:

      S --> A | ^
      A --> A10 | A11 |乙
      B --> B0 | 0

      另一种形式可以是

      S --> S10 | S11 |乙| ^
      B --> B0 | 0

    c) (((01+10)*11)*00)*

    语言描述: 首先是语言包含 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, 10100111000101100 } ....

    • 左线性语法:

      S --> A00 | ^
      A --> B11 |小号
      B --> B01 | B10 |一个

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

    • 正确的线性语法:

      S --> A | 00年代 | ^
      A --> 01A | 10A | 11S

    你问题的第二部分

    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 无法生成。 右线性语法是错误的因为字符串1000 是不可能生成的。尽管两者都是由问题(a)的正则表达式生成的语言。

    编辑
    为每个正则表达式添加 DFA。以便人们发现它很有帮助。

    a) (0+1)*00(0+1)*

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

    c) (((01+10)*11)*00)*

    为这个正则表达式绘制 DFA 既复杂又复杂。
    为此我想添加 DFA

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

    (((01+10)*11)* 00 )*
    (          a*   b )*
    

    其实在上面的表达式中a它本身就是(a*b)*的形式 那是((01+10)*11)*

    RE (a*b)* 等于 (a + b)*b + ^。 (ab) 的 DFA 如下:

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

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

    尝试找出以上三个DFA的构造相似之处。不理解第一个就不要继续前进

    【讨论】:

    • 感谢您的出色回答,对我帮助很大 +1。有没有什么工具或程序可以用来画图或者验证语言描述。另外,如果你推荐一本书,我会很感激的。
    • @berkay 谢谢!绘制图表我使用dia:。在comments: to my answer 中,我建议了一些学习形式理论的资源。要绘制 ASCII 图表,我使用 ascii-flow
    • @JIXIang "正则表达式(0+1) 表示如果0 要出现,那么1 也必须同时出现。" 表示 01 ,在正式语言中,二元运算符 + 代表联合。
    • @denis631 如果即使在给出描述之后事情对您来说还是不干净,您应该选择一本好书并分别阅读“正则表达式”和“语法”和“有限自动机”然后尝试理解这一点回答。 - 是的,这只是一个问题的答案,而不是一本书 .......我猜你是在错误的地方,而不是选择一本关于正式语言的好书
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2013-10-02
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多