Вход

Анализаторы Паскаль-программы для вычисления центральной разностной производной, арифметических выражений и языка право-линейной грамматики

Рекомендуемая категория для самостоятельной подготовки:
Курсовая работа*
Код 186264
Дата создания 2014
Страниц 14
Источников 2
Мы сможем обработать ваш заказ (!) 22 апреля в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
1 350руб.
КУПИТЬ

Содержание

Текст задания 3
Правила грамматики описания указанных конструкций с указанием типа грамматики по классификации Хомского 3
Диаграмма лексического анализатора 5
Тестовые примеры 11
Список использованных источников 15

Фрагмент работы для ознакомления

То, какой узел в дерене является операцией, а какой — операндом, никак невозможно определить из грамматики, описывающей синтаксис входного языка. Также ниоткуда не следует, каким операциям должен соответствовать объектный код в результирующей программе, а каким — нет. Все это определяется только исходя из семантики — «смысла» — языка входной программы. Поэтому только разработчик компилятора может четко определить, как при построении дерева операции должны различаться операнды и сами операции, а также то, какие операции являются семантически незначащими для порождения объектного кода.Алгоритм преобразования дерева семантического разбора и дерево операции можно представить следующим образом.Шаг 1. Если в дереве больше не содержится узлов, помеченных нетерминальными символами, то выполнение алгоритма завершено; иначе — перейти к шагу 2Шаг. 2. Выбрать крайний левый узел дерена, помеченный нетерминальным символом грамматики и сделать его текущим. Перейти к шагу 3.Шаг 3. Если текущий узел имеет только один нижележащий узел, то текущий узел необходимо удалить из дерена, а связанный с ним узел присоединить к узлу вышележащего уровня (исключить из дерена цепочку) и вернуться к шагу 1; иначе – перейти к шагу 4.Шаг 4. Если текущий узел имеет нижележащий узел (лист дерева), помеченный терминальным символом, который не несет семантической нагрузки, тогда этот лист нужно удалить из дерева и вернуться к шагу 3; иначе — перейти к шагу 5.Шаг 5. Если текущий узел имеет один нижележащий узел (лист дерева), помеченный терминальным символом, обозначающим знак операции, а остальные узлы помечены как операнды, то лист, помеченный знаком операции, надо удалить из дерева, текущий узел пометить этим знаком операции и перейти к шагу 1; иначе — перейти к шагу 6.Шаг 6. Если среди нижележащих узлов для текущего узла есть узлы, помеченные нетерминальными символами грамматики, то необходимо выбрать крайний левый среди этих узлов, сделать его текущим умом и перейти к шагу 3: иначе — выполнение алгоритма завершено.Тестовые примеры/* prog - файл с транслируемой программой, lex - выходной файл лексем */ while(!feof (prog)) { ch = readsym(); /* чтение очередного символа ch с пропуском пробелов */ if(isAlpha(ch)) fprintf(lex, "%c %d", ch, 1); else if(isDigit(ch)) digit(); /* Процедура чтения числа и вывода его в файл */ else if(ch == '=') fprintf(lex, "%c %d", ch, 3); else if(ch == '*' || ch == '/') fprintf(lex, "%c %d", ch, 4); else if(ch == '+' || ch == '-') fprintf(lex, "%c %d", ch, 5); elseprintf("Недопустимый символ языка - %c \n", ch); }2. Алгоритм перевода в обратную польскую запись функции, имеющей не менее одного параметра, такой же, что для переменной с индексами, но различие состоит в том, что в момент прихода закрывающей круглой скобки в выходную строку записывается символ Ф. Чтобы отличить открывающую круглую скобку в начале списка фактических параметров от открывающей круглой скобки в начале выражения, используют специальную переменную состояния f (признак функции), которая обычно имеет значение 0. В момент появления идентификатора функции f принимает значение 1, а после занесения в стек круглой скобки и начального значения счетчика операндов, равного 2, вновь принимает значение 0. Закрывающая скобка, встретив в стеке открывающую круглую скобку, записанную вместе со значением счетчика операндов, заносит это значение в выходную строку, записывает туда знак Ф и уничтожает в стеке круглую скобку и значение счетчика операндов.Обратная польская нотация (RPN) заданного выражения – корень(4*a – 8/a^2) будет иметь вид 0 4 а-8*а корень2^/3. Обычно задача решается следующим образом:Каждому состоянию ставим в соответствие нетерминал. Если есть переход из состояния X в состояние Y по а, добавляем правило X → aY. Для конечных состояний добавляем правила X → ε. Для ε-переходов — X → Y.Пример.Продукция грамматики имеет вид:A → aB | cCB → bD | cEC → εD → aB | cCE → aB | cCСписок использованных источниковСеребряков – Языки программирования: http://infonet.cherepovets.ru/citforum/programming/theory/serebryakovСвободная энциклопедия – Википедия http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D1%8F%D1%82%D0%BE%D1%80

Список литературы [ всего 2]

1. Серебряков – Языки программирования: http://infonet.cherepovets.ru/citforum/programming/theory/serebryakov
2. Свободная энциклопедия – Википедия http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D1%8F%D1%82%D0%BE%D1%80
Очень похожие работы
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00438
© Рефератбанк, 2002 - 2024