给出了一个含糊不清的语法,我被要求重写语法以使其明确无误。事实上,我不知道为什么给定的语法是模棱两可的,更不用说将其重写为明确的语法。
给定的语法是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是正确的?
答案 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
这是正确的。 (这个语法是左联想的。)