【问题标题】:Left-Linear and Right-Linear Grammar for a simple Regular Expression简单正则表达式的左线性和右线性语法
【发布时间】:2015-10-12 23:28:17
【问题描述】:

我无法为以下正则表达式提出左线性和右线性语法。

0(0+1)*+10^+

我也很困惑 plus-closure 的作用。

这是我得到的左线性语法,但我不确定这是否正确:

    P: S--> 0A | 1A
       A--> A0|A1|0S|0| epsilon

谢谢!

【问题讨论】:

  • “plus-closure”类似于“star-closure”,但不是重复“0次或多次”,而是重复“1次或多次”。
  • ^ 表示什么?
  • 您的加号和星号关闭的范围是什么?
  • 我的意思是 (^+) 是 (10) 的加号闭包
  • 其他加号是“或”?我假设第一个只是“0或1”;另一个涵盖什么?

标签: grammar regular-language computation-theory


【解决方案1】:

查找左线性和右线性语法的一般好方法是找到与您的正则表达式具有相同语言的 NFA,然后使用以下机械变换将该 NFA 转换为左线性或右线性语法:

  • 对于每个状态 q,引入一个非终结符 Tq
  • 对于字符 a(或其中 a = ε)上的每个转换 (q, r),添加产生式 Tq → aTr(用于左线性文法)和 Tr → Tqa(用于右线性文法)。

那么,对于左线性语法:

  • 对于每个接受状态 q,添加产生式 Tq → ε
  • 对于起始状态为 q0 的左线性文法,将起始符号设为符号 Tq0

那么,对于右线性文法:

  • 在产生式 S → 中添加一个开始符号 S每个接受状态 q 的 Tq
  • 添加产生式 Tq0 → ε 表示起始状态 q0

尝试在这里应用这个想法,您最终会为您的语言生成左右线性语法。它们可能不是最有效的语法,但它们会起作用。

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 2014-12-01
    • 2012-12-03
    • 1970-01-01
    • 2012-03-16
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多