Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






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





 

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

 

(1) stmt matched_stmt
(2) stmt unmatched_stmt
(3) matched_stmt if expr thenmatched_stmt elsematched_stmt
(4) matched_stmt Other
(5) unmatched_stmt if expr thenstmt
(6) unmatched_stmt if expr thenmatched_stmt elseunmatched_stmt

 

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

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

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

 

Stack contents Unprocessed input string Action
$ ifE1 then ifE2 thenS1 else S2 shift
$ ifE1 then ifE2 thenS1 elseS2   reduce [2]
$ifE1 thenS   reduce [1]
$    

Неоднозначные грамматики. Конфликт перенос-перенос

 

Второй тип конфликта, который может возникнуть, это так называемый конфликт перенос-перенос (reduce/reduce), который возникает, когда на вершине стека анализатора возникает строка терминалов, к которой может быть применена свертка по двум различным правилам.

Пример. Рассмотрим грамматику G2 (' id ', ' ( ', ' ) ', ' = 'и ', ' терминалы).

 

(1) stmt id (parameters_list)
(2) stmt expr = expr
(3) parameter_list parameter_list, parameter
(4) parameter_list Parameter
(5) parameter Id
(6) expr id (expr_list)
(7) expr Id
(8) expr_list expr_list, expr
(9) expr_list Expr

 

В процессе разбора входной цепочки id (id, id) происходит следующее:

 

Содержимое стека Необработанная часть Действие
$ id (id, id) shift
$ id (id, id) shift
$ id ( id, id) shift
$ id (id , id) shift

 

Очевидно, что после выполнения последнего шага необходимо произвести свертку находящегося на вершине стека терминала id. Но какое правило использовать? Если использвать правило (5), то будет получен вызов процедуры, если использовать правило (7), то получится вырезка из массива. Чтобы избежать неоднозначности, в первом правиле можно заменить терминал id на другой терминал, например, procid. Но в этом случае, чтобы вернуть правильный лексический класс, лексический анализатор должен выполнить сложную работу по определению, является ли данный идентификатор обозначением процедуры или массива.







Date: 2016-05-25; view: 539; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию