Я пытаюсь узнать о парсерах в 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, читая книгу и переполнение стека предыдущие вопросы, но я все еще не могу понять это какну, я не могу найти какой-либо подробный объясненный источник (в книге просто сказано, что мы можем решить, например, с помощью этого нового набора правил производства).