构造语言的语法

时间:2017-05-04 12:41:15

标签: grammar context-free-grammar automata context-free-language

我对这个问题有疑问:

L =空,字母为{a,b}

如何为此创建语法?怎么可能是生产规则? 提前谢谢

1 个答案:

答案 0 :(得分:1)

语法G是有序的4元组{S,N,E,e,P}其中:

  1. N是一组非终端符号
  2. E是一组终端符号
  3. N和E是不相交的
  4. E是L(G)
  5. 字母的超集
  6. e是空字符串
  7. P是一组有序的元素对(N U E U e);也就是说,P是(N U E U e) X(N U E U e)*的子集。
  8. S,起始符号,在N
  9. G中的推导是(N U E U e)*的元素序列,使得:

    1. 第一个元素是S
    2. 相邻元素w [i]和w [i + 1]可以写成w [i] = uxv和w [i + 1] = uyv,使得(x,y)在P
    3. 如果G中有一个推导,其最后一个元素是一个字符串w [n] over(E U e)*,我们说G生成w [n];也就是说,w [n]在L(G)中。

      现在,我们要定义一个语法G,使L(G)为空集。我们修复了字母E = {a,b}。我们仍然必须定义:

      1. N,非终结者集
      2. S,起始符号
      3. P,制作
      4. 我们不妨把S作为我们的开始符号。所以N至少包含S; N是{S}的超集。如果我们确定需要它们,我们只会添加更多非终结符。让我们把注意力转向L(G)为空的条件。

        如果L(G)为空,则意味着G中没有导出仅一串终端符号的推导。我们可以很容易地完成这一任务,确保我们的所有作品都能在任何终端上产生至少一个非终端产品。或者根本不生产终端。所以下面的语法都可以工作:

        S := S
        

        S := aSb
        

        S := aXb | XXSSX
        X := aabbXbbaaS
        

        等。所有这些语法都有L(G)为空,因为它们都不能派生出一串非终结符。