Совпадение и несоответствие (Dangling if) в парсере - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь узнать о парсерах в Compiler Construction.До сих пор я понимаю, что в правилах производства есть проблемы с неоднозначностью, на которые мы должны обратить внимание.

Один пример, который я не могу понять, таков:

если e1, то если e2, то s1 else s2

Я понимаю, что мыесть проблема неоднозначности с висячими, если.Так, например:

 if(e1)
   {
       if (e2)
       {
           s1
       }
       else
       {
           s2
       }

   }

, поэтому остальное нужно перейти во внутреннее if, а не во внешнее if.Однако наличие:

stmt::= if expression then stmt
      |if expression then stmt else stmt
      |other

вызовет неоднозначность, поскольку оно может связать внешнее if с остальным внутренним if.

Теперь решение состоит в том, чтобы использовать совпавшие и несопоставленные операторы:

>stmt:: = matched | unmatched
>matched:: = ?
>unmatched:: = ?

Я также понимаю, что совпадение относится к условию if else, а несоответствие относится к зависанию if.

У меня уже есть ответ на совпавший и несопоставленный, но я не понимаю, почему это такэто так (особенно непревзойденная часть).

>Stmt ::= matchedStmt | unmatchedStmt
>matchedStmt ::= if Expr then matchedStmt else matchedStmt
>               |other
>unmatchedStmt ::= if Expr then Stmt
>                 |if Expr then matchedStmt else unmatchedStmt

Как я могу это понять?

Я пробовал Google, читая книгу и переполнение стека предыдущие вопросы, но я все еще не могу понять это какну, я не могу найти какой-либо подробный объясненный источник (в книге просто сказано, что мы можем решить, например, с помощью этого нового набора правил производства).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...