|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Понятие грамматического разбораРаспознавание принадлежности строки конкретному языку осуществляется его выводом из аксиомы. Вывод представляет собой последовательность подстановок, при выполнении которых левая часть правила заменяется правой. Исходная строка, строки, получаемые в процессе вывода и аксиома, называются сентенциальными формами. Сентенциальная форма, содержащая только терминальные символы, называется допустимой и представляет собой предложение языка. Для обозначения подстановки используют символ «Þ». Пример. Вывод строки «-45»: <целое> Þ1 Þ1<знак><целое без знака> Þ2 Þ2 <знак><цифра><целое без знака>Þ3 Þ3 <знак><цифра><цифра> Þ4 Þ4 - <цифра><цифра> Þ5 Þ5 - 4<цифра> Þ6 Þ6- 45 Вывод можно представить графически, в виде синтаксического дерева, корнем которого является аксиома, а листья – образуют предложение языка (см. рисунок 1). Неоднозначные грамматики. Существуют грамматики, в которых для одной строки можно построить несколько деревьев. Такие грамматики называются неоднозначными. Разбор неоднозначных грамматик затруднен, поэтому их, если возможно, преобразуют в однозначные или ограничивают правилами. Пример 1. Строка х+х+х, порождаемая грамматикой с правилами S ® S + S и S ® x, имеет два дерева разбора (см. рисунок 2, а–б). Описывающая тот же язык однозначная грамматика использует правила: S ® S + x и S ® x (см. рисунок 2, в). Рисунок 2 – Деревья разбора неоднозначной грамматики (а, б) и единственное дерево однозначной (в) Пример 2. Конструкция if <лог. выр.> then <оператор> [ else <оператор>] при вложении неполного варианта получается неоднозначной. Поскольку ее преобразование невозможно, разбор ограничен правилом вложенности. Грамматический разбор – процедура построения синтаксического дерева для конкретного предложения языка. Грамматический разбор может осуществляться в разной последовательности, причем дерево можно строить как «сверху» – от аксиомы, так и «снизу» – от предложения. Соответственно существуют нисходящий и восходящий методы разбора. При этом предложения языка можно рассматривать слева направо и наоборот. Соответственно различают левосторонний и правосторонний разбор. Левосторонний разбор используют чаще, т. к. мы читаем слева направо. Левосторонний восходящий грамматический разбор («слева-направо»). Данный метод разбора применим, если грамматика не содержит правил с правосторонней рекурсией. При осуществлении грамматического разбора сентенциальные формы просматриваются слева направо и последовательно «свертываются» посредством замены подстроки, совпадающей с правой частью правила («основы») на левую часть того же правила. Правила подстановки должны проверяться, начиная с самого сложного, иначе сложные правила никогда не будут применены, и разбор не удастся. В общем случае при разборе возможны возвраты, поскольку может быть выбрано неподходящее правило подстановки. Пример. Разобрать строку «-45» Правила грамматики: <целое>::= <знак><целое без знака>|<целое без знака>, <целое без знака>::= <целое без знака><цифра>|<цифра>, <цифра >::= 0|1|2|3|4|5|6|7|8|9, <знак>::= +| -. Последовательность получения сентенциальных форм данным методом: <знак> 45 <знак> <цифра>5 <знак> <цбз>5 <целое> 5 – Тупик! Возвращаемся и ищем другой вариант подстановки! <знак><целое>5 – Тупик! Возвращаемся и ищем другой вариант подстановки! <знак> <цбз><цифра> <целое> <цифра> – Тупик! Возвращаемся и ищем другой вариант подстановки! <знак> <целое> <цифра> – Тупик! Возвращаемся и ищем другой вариант! <знак> <цбз> <целое> Необходимость предусмотреть возможность возвратов требует хранить всю информацию о каждом шаге разбора, что требует много памяти и существенно усложняет процесс написания программы разбора. Левосторонний нисходящий грамматический разбор («сверху-вниз»). Данный метод разбора применим, если грамматика не содержит правил с левосторонней рекурсией. Метод предполагает последовательное выдвижение гипотез, начиная с аксиомы, их доказательство посредством подбора правил, которым удовлетворяет разбираемый фрагмент, и выдвижения новых гипотез относительно не разобранной части предложения. Правила подстановки также должны проверяться, начиная с самого сложного, иначе цель разбора не будет достигнута. При наличии правил с левосторонней рекурсией процедура разбора становится бесконечной. В общем случае при разборе возможны возвраты, поскольку может быть выбрано неподходящее правило подстановки. Пример. Разобрать строку «-45» Правила грамматики: а) <целое>::= <знак><целое без знака>|<целое без знака> б) <целое без знака>::= <цифра><целое без знака>|<цифра>, в) <цифра >::= 0|1|2|3|4|5|6|7|8|9, г) <знак>::= +| -. Последовательность разбора:
Также как в предыдущем случае в программе разбора следует хранить всю информацию о каждом шаге разбора. Выбор метода разбора для грамматики определяется видом правил продукции языка. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |