Я полагаю, что каждый, кто читает его, знаком с двусмысленностью else. Поэтому я пропущу объяснение. Я нашел в книге компиляторов (книге дракона) недвусмысленную грамматику, которая представляет IF и ELSE. Вот.
stmt->matched_stmt | open_stmt
matched_stmt->if exp then matched_stmt else matched_stmt | other
open_stmt->if exp then stmt | if exp then matched_stmt else open_stmt
Проблемы:
open_stmt->если exp то stmt | если exp, то matched_stmt иначе open_stmt
Чтобы заставить грамматику, которую я работаю над грамматикой LL(1), мне нужно исключить левый общий префикс, и в этом случае левый общий префикс:
если эксп, то
когда я пытаюсь его сфабриковать, он снова становится неоднозначным, это то, что я пробовал.
stmt->matched_stmt | open_stmt
matched_stmt->if exp then matched_stmt else matched_stmt | other
open_stmt->if exp thenO'
O'->stmt | matched_stmt else open_stmt
Что неоднозначно, может ли кто-нибудь помочь мне сделать его не двусмысленным и без общего левого префикса? большое спасибо