我有以下问题。这个语法含糊不清:
stmt - >如果是expr那么stmt stmt'|一个
stmt' - >别的stmt | EPSILON
expr - > B'/ P>
我试图修改它,结果是:
stmt - >如果是expr那么stmt''|一个
stmt'' - > stmt |语句”
stmt' - > B else stmt
expr - > B'/ P>
但这不会生成相同的语言。
有人可以帮我修改含糊不清的语法,使其明确无误并接受相同的语言吗?
答案 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'
之后,节点的顺序发生变化,从而影响了树的结构。因此,给定的语法是模棱两可的。