Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Требование детерминированного распознавания

Else

Begin

Begin

if Ch = '^ ' then begin

NextCh;

Number;

end;

end;

Полезно обратить внимание на дисциплину вызова процедуры NextCh. Следующий символ считывается, когда опознан текущий.

Последняя распознающая процедура — для «Целого». И в этом случае тоже можно преобразовать исходную диаграмму (см. рис. 19), отделив блок, соответствующий первой цифре (обязательной), от остальных блоков (рис. 23).

Рис.23 Синтаксическая диаграмма «Целое»

 

Предусматривать отдельную распознающую процедуру для «почти терминального символа» «цифра» неразумно. Проще и наглядней непосредственно проверять принадлежность очередного знака множеству цифр.

procedure Number; { Целое }

if Ch in ['0'..'9'] then

NextCh

Error('Число начинается не с цифры');

while Ch in ['0'..'9'] do

NextCh;

end;

Распознаватель готов. Осталось только расположить в программе написанные процедуры в правильном порядке — описание процедуры поместить перед ее вызовом. Поскольку рекурсии в этом примере нет, сделать это легко.

На рассмотренном примере мы продемонстрировали, что синтаксический анализатор методом рекурсивного спуска можно написать «почти так же быстро, как мы вообще можем писать»

 

Уже в ходе предыдущего рассмотрения можно было заметить, что рекурсивный спуск позволяет построить анализатор не для любой КС-грамматики.

Ограничения возникают при анализе направляющих символов отдельных ветвей синтаксической диаграммы.

Множество направляющих символов first(D) ветви D синтаксической диаграммы образуют терминальные символы, которые могут встретиться первыми при движении по диаграмме вдоль этой ветви.

Движение по диаграмме предполагает, что при достижении прямоугольного блока, изображающего нетерминал, оно продолжается по диаграмме этого нетерминала с последующим возвратом на исходную диаграмму.


 

Порядок действий анализатора, работающего по методу рекурсивного спуска, и определяется анализом направляющих символов отдельных ветвей синтаксической диаграммы.

Чтобы алгоритм работал без возвратов, а выбор направления движения по диаграмме выполнялся однозначно, должно соблюдаться требование детерминированного распознавания:

В каждом разветвлении синтаксической диаграммы множества направляющих символов отдельных ветвей не должны попарно пересекаться.

В рассмотренной ранее грамматике многочленов требование детерминированного распознавания всегда соблюдается.

Возьмем, например, диаграмму, показанную на рис. 21. На ней две точки ветвления. Первая — на входе в диаграмму, вторая — на выходе.


 

В первом разветвлении три ветви. Множества направляющих символов этих ветвей:

[' +' ] — верхняя ветвь;

[' 0'.. ' 9', 'х']— средняя ветвь;

[' -' ] — нижняя ветвь.

Как видим, эти множества не пересекаются.

В правой точке происходит ветвление на два направления. Одно ведет на выход из диаграммы, множество направляющих символов этой ветви состоит из символа «конец текста»: [^]. Другая ветвь соответствует очередному витку цикла, ее множество направляющих символов равно [' +', ' -' ].

Пересечения множеств снова нет.

<== предыдущая лекция | следующая лекция ==>
Else begin | Рахунки, що використовуються для обліку операцій з матеріальними та нематеріальними активами
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 472; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.