鉴于这个语法:
<Program> ::= <Stmt> | <Program>; <Stmt>
<Conditional> ::= If <Bool> then <Program>
<Bool> ::= true | false
<Stmt> ::= <Conditional> | s1 | s2
我如何证明它含糊不清?
答案 0 :(得分:2)
如果你可以为同一个句子绘制两个解析树(或者等效地,写两个最左边的派生词),那么语法是不明确的。没有通用算法可以做到这一点(歧义是一个不可判定的问题),但对于许多语法来说并不难。
@rici给出的例子就足够了。
If true then s1; s2
一个解析树
<Program>
/ | \
<Program> ; <Stmt>
| |
<Stmt> s2
/|\__________
/ | \ \
If <Bool> then <Program>
| |
true <Stmt>
|
s1
我会让你解决另一个。