将模糊语法转移到明确的语法时感到困惑

时间:2015-02-10 15:43:58

标签: 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是不正确的,因为它根本不生成任何字符串,C是不正确的,因为它只匹配字符串' a'和' b'。

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

  1. 为什么给定的语法不明确?

  2. 为什么A不正确而B是正确的?

1 个答案:

答案 0 :(得分:0)

原始语法是模糊的,因为对于至少三个字母的任何字符串,多个最右边(或最左边)的派生是可能的。例如:

S -> SS -> SSS -> SSa -> Saa -> aaa
S -> SS -> Sa  -> SSa -> Saa -> aaa

粗略地说,第一个对应于解析a(aa),而第二个对应于解析(aa)a

没有其他选择是正确的。 A错误地匹配ε而B与任何内容都不匹配(例如D)。例如,B

S  -> SS' | S'
S' -> a | b

这是正确的。 (这个语法是左联想的。)