Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Создание программы для анализа описания переменных цель выполнения лабораторной работы №1.
На вход программы подается текстовый файл (с именем INPUT.TXT), содержащий только описания переменных на выбранном языке (Pascal или C/C++). Например, для языка Pascal содержание текстового файла может быть следующим:
var a, b, c: real;
d: array [1..6, 6..9] of integer;
s1: string;
s2: string[10];
Т.е. описание переменных начинается с ключевого слова «var», далее следуют списки имен переменных с указанием типа. В список типов необходимо включить наиболее часто используемые базовые типы. Тип может быть также массивом (в т.ч. многомерным) или строкой. У массива нижняя граница индекса не должна быть меньше верхней. Строка не может быть длиннее 255 символов.
Имя переменной это последовательность букв и цифр, начинающаяся с буквы. Под буквами понимаются большие и малые буквы латинского алфавита (a…z, A…Z) и подчеркивание (_). Большинство современных компиляторов не имеют ограничений по длине имен переменных, однако, значащими считаются только первые N символов (число N зависит от конкретного компилятора). Например, если N = 8, то переменные a1234567 и a12345678 рассматриваются компиляторами как идентичные, хотя обе записи являются синтаксически верными. Значение числа N можно выбрать любое (N ≥ 1), но обычно это 8, 16, 32 и т.д.
В качестве разделителей, отделяющих друг от друга ключевые слова, имена переменных, знаки пунктуации и т.п. могут выступать:
Для указания символа по его коду в языке Pascal используется знак «#». Либо для этих целей можно использовать функцию CHR (см. ее описание в файле справки компилятора языка Pascal). При указании букв A…F в шестнадцатеричных числах можно использовать как большие, так и малые буквы. Так, для проверки символа ch на возврат каретки можно написать
if ch = #13 …
или
if ch = #$0D …
или же
if ch = chr(13) …
Для языков C/C++ файл может быть таким:
double a[10], b, c;
int x_q[5][5];
Т.е. описание состоит из указаний типов данных со следующими за ними списками имен переменных. Языки C/C++ поддерживают различные модификаторы типов модификаторы размера (long/short), знака (signed/unsigned) и прочие (auto, register, volatile, const, static). Для упрощения задачи будем рассматривать только модификаторы размера. Обратите внимание, что модификатор может использоваться без указания базового типа, в этом случае в качестве базового типа подразумевается тип int. Например, запись
long
эквивалентна записи
long int
Модификатор long может использоваться с типами int и double, модификатор short только с типом int.
Т.к. языки C/C++ не делают различий между символом и целым числом (байтом), то для проверки кода числа можно просто сравнить символ с кодом:
if(ch == 13) …
Если компилятор выдает в этом случае предупреждение о возможном несоответствии данных, можно использовать явное преобразование типа:
if(ch == char(13)) …
Либо можно использовать запись \OOO или \xHH, где OOO восьмеричная запись кода символа (максимальный код 3778), HH шестнадцатеричная (максимальный код FF16). Так, проверку на символ перевода строки можно также записать в таком виде:
if(ch == \x0d) …
или
if(ch == \15) …
В языках C/C++ существуют также специальные символы для обозначения некоторых непечатных элементов таблицы ASCII:
Пробелы (как в Pascal, так и в C/C++) можно обозначать просто в виде пробела, заключенного в кавычки ( ).
В отличие от языка Pascal, в языках C/C++ размерность массива указывается в виде одной цифры (обязательно положительной), и каждая размерность заключается в квадратные скобки.
Ваша программа должна проанализировать имеющиеся в текстовом файле описания переменных и выдать (в текстовый файл OUTPUT.TXT или на экран) результат проверки. Это может быть:
1. Сообщение о том, что описание корректное.
2. Сообщение о синтаксической ошибке (неправильные имена переменных, ошибки при использовании ключевых слов, неверные индексы массивов, отсутствие знаков пунктуации и т.д.). Указывать тип ошибки не обязательно, требуется только указать строку и позицию в строке входного файла, где наблюдается ошибка. Достаточно находить только первую ошибку в описании.
3. Сообщение о дублировании имен переменных. В этом случае на выходе программы необходимо указать имя дублируемой переменной, а также строку и позицию в строке, где встретился дубликат.
Создание программы для разбора математического выражения цель выполнения лабораторной работы №2.
На вход программы подается текстовый файл (с именем INPUT.TXT), содержащий единственную строку символов. Данная строка задает присваивание переменной значения арифметического выражения в виде
ПЕРЕМЕННАЯ = ВЫРАЖЕНИЕ.
Выражение может включать:
Имя переменной это последовательность букв и цифр, начинающаяся с буквы. Входное выражение считать правильным.
В выходном файле (с именем OUTPUT.TXT) для исходного выражения, заданного во входном файле, необходимо привести:
1) Таблицу имен;
2) Неоптимизированный код;
3) Оптимизированный код.
Создание программы для проверки правильности описания структуры при помощи LL(1)-грамматики цель выполнения лабораторной работы №3.
На вход программы подаются два текстовых файла (с именами GRAMMAR.TXT и STRUCT.TXT). Первый содержит LL(1)-грамматику или таблицу разбора, второй описание структуры (записи) на языках C/C++. Необходимо проверить, является ли описание структуры корректным с точки зрения заданной грамматики и не содержит ли конфликтов имен.
Таким образом, задание разбивается на две части:
1. Проверка синтаксиса.
2. Проверка семантики.
Ясно, что семантика (т.е. смысл описания) зависит от выбранного языка, и поэтому ее проверка жестко привязана к анализатору (в данном случае Вашей программе). Грамматика же должна быть универсальной, т.е. должна позволять задавать любые правила для разбора структуры (и не только структуры). Например, должны быть доступны: смена ключевых слов, изменение знаков пунктуации, правила разбора идентификаторов и т.п.
Желательно задавать грамматику, а не таблицу разбора, т.к. при необходимости грамматику модифицировать проще. Если требуется таблица разбора, ее можно получить из грамматики по описанному ниже алгоритму.
Описание структуры на языках C/C++, в общем случае, выгляди так:
struct [имя]
{
[тип] [список переменных];
…
struct [имя]
{
…
} [список переменных];
…
} [список переменных];
Имя структуры это имя нового типа, который она описывает. Как и список переменных типа структуры, это необязательный параметр. Если отсутствует и имя типа структуры, и список переменных, структура является анонимной (т.к. к ее полям невозможно получить доступ). Некоторые компиляторы разрешают такие объявления, некоторые нет. Здесь и в дальнейшем при определении корректности структуры необходимо пользоваться правилами того компилятора, для которого разрабатывается программа.
Частным случаем конфликта имен является дублирование идентификаторов. Но, учитывая, что структуры могут быть вложенными, а также иметь имя типа, задача, по сравнению с первой лабораторной работой, усложняется. Например, структура
struct A
{
int A;
};
является корректной с точки зрения языка C, но не с точки зрения языка C++. Язык C++ является объектно-ориентированным, и в структуре с именем типа A ожидает появление конструктора с именем A. Если A не конструктор, налицо конфликт имен. По тем же причинам некорректна запись
struct A
{
struct A
{
…
};
};
Но в большинстве компиляторов языков C/C++ корректной является запись
struct A
{
…
} A;
Типы данных при описании переменных использовать стандартные, допускается наличие модификаторов размера (long/short) и знака (signed/unsigned) там, где это возможно.
В заключение еще раз отметим, что правила для поиска конфликтов имен должны соответствовать таковым в компиляторе, для которого предназначена программа.
Ваша программа должна проанализировать имеющееся в текстовом файле описание структуры и выдать (в текстовый файл OUTPUT.TXT или на экран) результат проверки. Это может быть:
1. Сообщение о том, что описание структуры корректное.
2. Сообщение о синтаксической ошибке. Указывать тип ошибки не обязательно, требуется только указать строку и позицию в строке входного файла, где наблюдается ошибка. Достаточно находить только первую ошибку в описании.
3. Сообщение о конфликте имен. В этом случае на выходе программы необходимо указать имя конфликтного типа, а также строку и позицию в строке, где произошел конфликт.
Создание программы для проверки правильности описания структуры при помощи LR(1)-грамматики цель выполнения лабораторной работы №4.
Соответствуют таковым в лабораторной работе №3, но разбор осуществляется с помощью LR(1)-, а не LL(1)-грамматики. Соответственно, входной файл GRAMMAR.TXT содержит LR(1)-грамматику или таблицу разбора (грамматика, как и прежде, предпочтительнее).
Аналогично лабораторной работе №3.
Решение системы регулярных уравнений цель выполнения лабораторной работы №5.
Во входном файле (с именем INPUT.TXT) задается размерность системы регулярных уравнений n (1 ≤ n ≤ 8) а затем ее коэффициенты:
α10 α11 α12 … α1n
α20 α21 α22 … α2n
…………………
αn0 αn1 αn2 … αnn
Максимальная длина регулярного выражения для каждого коэффициента равна 3.
В выходной файл (с именем OUTPUT.TXT) необходимо вывести:
1) Полное решение системы регулярных уравнений;
2) Упрощенное решение.
Упрощенное решение получается, если применить к полученному решению леммы 1-12.