Разработка компиляторов

       

Разрешение конфликта перенос-свертка


Следуя формализации правила явного предпочтения, может быть построена следующая грамматика:

(1) stmt->matched_stmt
(2) stmt->unmatched_stmt
(3) matched_stmt->if expr then matched_stmt else matched_stmt
(4) matched_stmt->Other
(5) unmatched_stmt->if expr then stmt
(6) unmatched_stmt->if expr then matched_stmt else unmatched_stmt

Новая грамматика порождает тот же язык, что и старая, но вывод цепочки if E1 then if E2 then S1 else S2 теперь не содержит конфликтов.

Альтернативой построению новой грамматики может служить "соглашение", что в случае конфликта перенос-свертка, перенос является предпочтительным действием.

После принятия одной из этих альтернатив вывод может быть продолжен следующим образом:

Stack contentsUnprocessed input stringAction
$ if E1 then if E2 then S1 elseS2 shift
$ if E1 then if E2 then S 1 else S2 reduce [2]
$ if E 1 then Sreduce [1]
$



Содержание раздела