Parsing 困惑于将模棱两可的语法转换为明确的语法

Parsing 困惑于将模棱两可的语法转换为明确的语法,parsing,compiler-construction,grammar,context-free-grammar,ambiguous-grammar,Parsing,Compiler Construction,Grammar,Context Free Grammar,Ambiguous Grammar,给出了一个模棱两可的语法,我被要求重写语法,使其明确无误。事实上,我不知道为什么给定的语法是模棱两可的,更不用说重写成一个明确的语法了 给定的语法是S->SS | a | b,我有四个选择: A: S -> Sa | Sb | epsilon B: S -> SS’ S’-> a | b C: S -> S | S’ S’-> a | b D: S -> Sa | Sb. 对于每个选择,我已经知道D是不正确的,因为它根本不生成字

给出了一个模棱两可的语法,我被要求重写语法,使其明确无误。事实上,我不知道为什么给定的语法是模棱两可的,更不用说重写成一个明确的语法了

给定的语法是S->SS | a | b,我有四个选择:

A: S -> Sa | Sb | epsilon  

B: S -> SS’
   S’-> a | b  

C: S -> S | S’
   S’-> a | b 

D: S -> Sa | Sb. 
对于每个选择,我已经知道D是不正确的,因为它根本不生成字符串,C是不正确的,因为它只匹配字符串“a”和“b”

然而,我认为答案是A,而正确答案是B。我认为B是错误的,因为它只是一次又一次地生成S,而B不能处理空字符串

  • 为什么给定的语法不明确

  • 为什么A不正确而B正确


  • 原始语法是不明确的,因为对于任何至少包含三个字母的字符串,都可能有多个最右边(或最左边)的派生。例如:

    S -> SS -> SSS -> SSa -> Saa -> aaa
    S -> SS -> Sa  -> SSa -> Saa -> aaa
    
    粗略地说,第一个对应于parse
    a(aa)
    ,而第二个对应于parse
    (aa)a

    没有一个选择是正确的<代码>A与ε不匹配,而
    B
    与任何东西都不匹配(如
    D
    )。例如,如果
    B

    S  -> SS' | S'
    S' -> a | b
    
    这是正确的。(此语法是左关联的。)