Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Vr далее следуют списки имен переменных с указанием типа

Работа добавлена на сайт samzan.net:



1. Анализ описания переменных

Создание программы для анализа описания переменных – цель выполнения лабораторной работы №1.

1.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 символов.

Имя переменной – это последовательность букв и цифр, начинающаяся с буквы. Под буквами понимаются большие и малые буквы латинского алфавита (az, AZ) и подчеркивание (_). Большинство современных компиляторов не имеют ограничений по длине имен переменных, однако, значащими считаются только первые N символов (число N зависит от конкретного компилятора). Например, если N = 8, то переменные a1234567 и a12345678 рассматриваются компиляторами как идентичные, хотя обе записи являются синтаксически верными. Значение числа N можно выбрать любое (N ≥ 1), но обычно это 8, 16, 32 и т.д.

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

  •  пробелы (код ASCII – 32 или $20 в шестнадцатеричном виде);
  •  переводы строк и возвраты кареток (коды ASCII – 10 ($0A) и 13 ($0D) соответственно);
  •  табуляции (код ASCII – 9 или $09).

Для указания символа по его коду в языке Pascal используется знак «#». Либо для этих целей можно использовать функцию CHR (см. ее описание в файле справки компилятора языка Pascal). При указании букв AF в шестнадцатеричных числах можно использовать как большие, так и малые буквы. Так, для проверки символа 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:

  •  ‘\n’ – перевод строки (next line);
  •  ‘\r’возврат каретки (carriage return);
  •  ‘\t’табуляция (tabulate);

Пробелы (как в Pascal, так и в C/C++) можно обозначать просто в виде пробела, заключенного в кавычки (‘ ’).

В отличие от языка Pascal, в языках C/C++ размерность массива указывается в виде одной цифры (обязательно положительной), и каждая размерность заключается в квадратные скобки.

1.2. Выходные данные

Ваша программа должна проанализировать имеющиеся в текстовом файле описания переменных и выдать (в текстовый файл OUTPUT.TXT или на экран) результат проверки. Это может быть:

1. Сообщение о том, что описание корректное.

2. Сообщение о синтаксической ошибке (неправильные имена переменных, ошибки при использовании ключевых слов, неверные индексы массивов, отсутствие знаков пунктуации и т.д.). Указывать тип ошибки не обязательно, требуется только указать строку и позицию в строке входного файла, где наблюдается ошибка. Достаточно находить только первую ошибку в описании.

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


2. Разбор математического выражения

Создание программы для разбора математического выражения – цель выполнения лабораторной работы №2.

2.1. Входные данные

На вход программы подается текстовый файл (с именем INPUT.TXT), содержащий единственную строку символов. Данная строка задает присваивание переменной значения арифметического выражения в виде

ПЕРЕМЕННАЯ = ВЫРАЖЕНИЕ.

Выражение может включать:

  •  Знаки сложения и умножения («+» и «*»);
  •  Круглые скобки («(» и «)»);
  •  Константы (например, 5; 3.8; 1e+18, 8.41E–10);
  •  Имена переменных.

Имя переменной – это последовательность букв и цифр, начинающаяся с буквы. Входное выражение считать правильным.

2.2. Выходные данные

В выходном файле (с именем OUTPUT.TXT) для исходного выражения, заданного во входном файле, необходимо привести:

1) Таблицу имен;

2) Неоптимизированный код;

3) Оптимизированный код.


3. Разбор описания структуры при помощи LL(1)-грамматики

Создание программы для проверки правильности описания структуры при помощи LL(1)-грамматики – цель выполнения лабораторной работы №3.

3.1. Входные данные

На вход программы подаются два текстовых файла (с именами 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) там, где это возможно.

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

3.2. Выходные данные

Ваша программа должна проанализировать имеющееся в текстовом файле описание структуры и выдать (в текстовый файл OUTPUT.TXT или на экран) результат проверки. Это может быть:

1. Сообщение о том, что описание структуры корректное.

2. Сообщение о синтаксической ошибке. Указывать тип ошибки не обязательно, требуется только указать строку и позицию в строке входного файла, где наблюдается ошибка. Достаточно находить только первую ошибку в описании.

3. Сообщение о конфликте имен. В этом случае на выходе программы необходимо указать имя конфликтного типа, а также строку и позицию в строке, где произошел конфликт.


4. Разбор описания структуры при помощи LR(1)-грамматики

Создание программы для проверки правильности описания структуры при помощи LR(1)-грамматики – цель выполнения лабораторной работы №4.

4.1. Входные данные

Соответствуют таковым в лабораторной работе №3, но разбор осуществляется с помощью LR(1)-, а не LL(1)-грамматики. Соответственно, входной файл GRAMMAR.TXT содержит LR(1)-грамматику или таблицу разбора (грамматика, как и прежде, предпочтительнее).

4.2. Выходные данные

Аналогично лабораторной работе №3.


5. Решение систем регулярных уравнений

Решение системы регулярных уравнений – цель выполнения лабораторной работы №5.

5.1. Входные данные

Во входном файле (с именем INPUT.TXT) задается размерность системы регулярных уравнений n (1 ≤ n ≤ 8) а затем – ее коэффициенты:

α10 α11 α12 … α1n

α20 α21 α22 … α2n

…………………

αn0 αn1 αn2 … αnn

Максимальная длина регулярного выражения для каждого коэффициента равна 3.

5.2. Выходные данные

В выходной файл (с именем OUTPUT.TXT) необходимо вывести:

1) Полное решение системы регулярных уравнений;

2) Упрощенное решение.

Упрощенное решение получается, если применить к полученному решению леммы 1-12.




1. Лекция 18 06.09.12 Чума сибирская язва
2. Тема 1. Уравнение состояния идеального газа.html
3. либо испробованных человечеством
4. Рынок совершенной конкуренции
5. А подпись инициалы фамилия ldquo; rdquo; 2013г
6. Основы радиоэлектроники и схемотехники
7. Тема- Содержание и роль национальной культуры в контексте общемирового исторического процесса План 1
8. Облигации
9. Разработка инновационного проекта Книжный магазин готической литературы
10. Icom Немецкий ИнтернетМагазин LMOD 1000 Брендов Одежды и Обуви Скидки 70 Доставка за наш счет
11. і. Яке залежне сестринське втручання виконаєте при наданні допомоги Ввести судинні засоби B Поклас.
12. Архитектурно-строительная акустика
13. ЛЕКЦИЯ I Народы и древнейшие государства на территории нашей страны
14. чернокнижников но ведь наверняка Сергей Дёмин стал таковым не сразу ~ в каком возрасте Вы стали ощущать в с
15. Государственный образовательный стандарт Характеристика результатов обучения
16. 84 Английский поэт Одна из особенностей отличающих человека от других видов жизни на планете это его спос
17. Утверждаю Зав1
18. Методические рекомендации Рассматривая первый вопрос темы следует охарактеризовать общество как систе
19. college writing essy ~ базовый предмет обучения в большинстве вузов США и других стран для улучшения соответствующи
20. Особливості фінансування бюджетних установ та організацій в Україні