我正在尝试了解编译器构造中的解析器。到目前为止,我了解到生产规则中存在我们需要注意的歧义问题。
我不明白的一个例子如下:
如果e1则为e2则为s1否则为s2
我在这里了解到,如果悬挂if,我们会有一个歧义问题。例如:
if(e1)
{
if (e2)
{
s1
}
else
{
s2
}
}
所以else需要进入内部if而不是外部if。但是具有:
stmt::= if expression then stmt
|if expression then stmt else stmt
|other
会造成歧义,因为它可能会将外部if与内部if的else连接起来。
现在的解决方案是使用匹配和不匹配的语句:
>stmt:: = matched | unmatched
>matched:: = ?
>unmatched:: = ?
我还了解到,match是指if,而notmatched是指悬挂的if。
我已经有了匹配和不匹配的答案,但是我不明白为什么会这样(特别是不匹配的部分)。
>Stmt ::= matchedStmt | unmatchedStmt
>matchedStmt ::= if Expr then matchedStmt else matchedStmt
> |other
>unmatchedStmt ::= if Expr then Stmt
> |if Expr then matchedStmt else unmatchedStmt
我该怎么理解?
我尝试了google,阅读了本书,然后堆积了以前的问题,但我仍然不明白,也找不到详细解释的资料(这本书说我们可以通过这套新的生产规则来解决例如)。