解析器中匹配和不匹配(如果悬空)

时间:2019-01-31 07:10:21

标签: compiler-construction

我正在尝试了解编译器构造中的解析器。到目前为止,我了解到生产规则中存在我们需要注意的歧义问题。

我不明白的一个例子如下:

  

如果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,阅读了本书,然后堆积了以前的问题,但我仍然不明白,也找不到详细解释的资料(这本书说我们可以通过这套新的生产规则来解决例如)。

0 个答案:

没有答案