使语法明确无误?

时间:2015-06-01 12:26:42

标签: compiler-construction grammar context-free-grammar ambiguity context-free-language

我有以下问题。这个语法含糊不清:

  

stmt - >如果是expr那么stmt stmt'|一个

     

stmt' - >别的stmt | EPSILON

     

expr - > B'/ P>

我试图修改它,结果是:

  

stmt - >如果是expr那么stmt''|一个

     

stmt'' - > stmt |语句”

     

stmt' - > B else stmt

     

expr - > B'/ P>

但这不会生成相同的语言。

有人可以帮我修改含糊不清的语法,使其明确无误并接受相同的语言吗?

1 个答案:

答案 0 :(得分:2)

使用给定的语法,字符串if b then if b then a else a有两个最左边的派生,如下所示。

派生1:

if expr then stmt stmt'
if b then stmt stmt'
if b then if expr then stmt stmt' stmt'
if b then if b then stmt stmt' stmt'
if b then if b then a stmt' stmt'
if b then if b then a stmt'
if b then if b then a else stmt
if b then if b then a else a

派生2:

if expr then stmt stmt'
if b then stmt stmt'
if b then if expr then stmt stmt' stmt'
if b then if b then stmt stmt' stmt'
if b then if b then a stmt' stmt'
if b then if b then a else stmt stmt'
if b then if b then a else a stmt'
if b then if b then a else a

解析树在大多数情况下保持不变。但是在导出if b then if b then a stmt' stmt'之后,节点的顺序发生变化,从而影响了树的结构。因此,给定的语法是模棱两可的。