Содержание Введение6 1 Описание языка 2 Лексический анализатор 3 Синтаксический анализатор 4 Абстрактный синтаксис Заключение Список использованной литературы Приложение А Листинг кода Введение Компилятор - программный модуль, задачей которого является перевод программы, написанной на одном из языков программирования (исходный язык) в программу на язык ассемблера или язык машинных команд. Большинство компиляторов переводят программу с некоторого высокоуровневого языка программирования в машинный код, который может быть непосредственно выполнен компьютером. Входной информацией для компилятора (исходный код) является описание алгоритма или программа на проблемно-ориентированном языке, а на выходе компилятора - эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код). Целью данной курсовой работы является изучение составных частей, основных принципов построения и функционирования компиляторов, практическое освоение методов построения составных частей компилятора для заданного входного языка; построение компилятора для подмножества язык Prolog. Задачи данной курсовой работы: - описание функционально-логического языка prolog; - построение лексического анализатора; - построение синтаксического анализатора; - абстрактный синтаксис Описание языка Пролог - язык и система логического программирования, основанные на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка. Основными понятиями в языке Пролог являются факты, правила логического вывода и запросы, позволяющие описывать базы знаний, процедуры логического вывода и принятия решений. Факты в языке Пролог описываются логическими предикатами с конкретными значениями. Правила в Прологе записываются в форме правил логического вывода с логическими заключениями и списком логических условий. Факты в базах знаний на языке Пролог представляют конкретные сведения (знания). Обобщённые сведения и знания в языке Пролог задаются правилами логического вывода (определениями) и наборами таких правил вывода (определений) над конкретными фактами и обобщёнными сведениями. Термы Программа на Прологе описывает отношения, определяемые с помощью предложений. Как и в любом другом языке, ориентированном на символьные вычисления, предложения выстраиваются из термов, которые в свою очередь подразделяются на атомы, числа, переменные и структуры. Атом записывается со строчной буквы или заключается в кавычки, когда требуется запись с прописной буквы. atom 'Atom' Переменные, записывающиеся с прописной буквы, отличаются от переменных в процедурных языках программирования, они не связаны с конкретной ячейкой памяти, а скорее ближе к математической переменной. X is 2 + 2. Правила В чистом Прологе предложения ограничиваются Дизъюнктами Хорна Вывод :- Условие. И читаются как: Заголовок ИСТИНА, если Тело ИСТИНА. Тело правила содержит ссылки на предикаты, которые называются целями правила. Встроенные предикаты ,/2, означающий оператор с двумя аргументами, определяющий конъюнкцию целей и ;/2 определяющий дизъюнкцию. Факты Предложения с пустым Телом называются Фактами. Пример факта: Кот(Иван). оно эквивалентно правилу: Кот(Иван) :- ИСТИНА. Арифметические выражения В языке Пролог имеется ряд встроенных функций для вычисления арифметических выражений, основные из которых перечислены в таблице. ВыражениеИнтерпретацияX + YСумма X и YX - YРазность X и YX * YПроизведение X и YX / YДеление X на YX > YБольшеX < YМеньшеX = < YМеньше или равноX > = YБольше или равно В соответствии с описанными конструкциями языка построена следующая грамматика: GOAL->SLIST SLIST->SENTENCE . SLIST SLIST-> ε SENTENCE->FACT FACT->FACT1 RULE RULE->:- FLIST RULE-> ε FACT1-> ids ( TLIST ) TLIST->TERM TL TL->, TLIST TL-> ε FLIST->FACT1 FL FL->, FLIST FL-> ε TERM-> TERM1 TT TERM->FACT1 TERM1-> idb TERM1-> num TT-> SIGN TERM1 TT-> ε SIGN-> + SIGN-> - SIGN-> * SIGN-> / SIGN-> < SIGN-> > SIGN-> = Лексический анализатор Основная задача лексического анализа - разбить входной текст, состоящий из последовательности одиночных символов, на последовательность слов, или лексем, т.е. выделить эти слова из непрерывной последовательности символов. Все символы входной последовательности с этой точки зрения разделяются на символы, принадлежащие каким-либо лексемам, и символы, разделяющие лексемы (разделители). В некоторых случаях между лексемами может и не быть разделителей. С другой стороны, в некоторых языках лексемы могут содержать незначащие символы. Общая схема работы лексического анализатора такова. Сначала выделяем отдельную лексему (возможно, используя символы-разделители). Если выделенная лексема- ограничитель, то он (точнее, некоторый его признак) выдается как результат лексического анализа. Ключевые слова распознаются либо явным выделением непосредственно из текста, либо сначала выделяется идентификатор, а затем делается проверка на принадлежность его множеству ключевых слов. Если да, то выдается признак соответствующего ключевого слова, если нет- выдается признак идентификатора, а сам идентификатор сохраняется отдельно. Если выделенная лексема принадлежит какому-либо из других классов лексем (число, строка и т.д.), то выдается признак класса лексемы, а значение лексемы сохраняется.
1/--страниц