Введение
Настоящий документ определяет техническое задание на разработку программы интерактивного интерпретатора целочисленных констант (далее по тексту - программа RADIX), заданных в различных позиционных системах счисления.

Основания для разработки
Программа RADIX разрабатывается в рамках лабораторной работы по курсу "Лингвистическое обеспечение САПР" для практического изучения этапов лексического и синтаксического анализа в процедурах трансляции формальных языков.

Назначение разработки
Программа RADIX предназначается для реализации грамматического разбора и преобразования целочисленных констант в калькураторах арифметических выражений или макропроцессорах систем программирования.

Требования к программе

1. Требования к функциональным характеристикам
1.1. Программа RADIX должна обеспечивать интерактивную обработку для анализа целочисленных констант без знака из потока стандартного ввода, заданных в системах счисления 8, 10 или 16 согласно формату системы программирования С.
1.2. Корректная целочисленная константа в формате системы счисления по основанию 8 должна начинаться с префикса 0 и состоять из цифр в диапазоне от 0 до 7, например, 0644.
1.3. Корректная целочисленная константа в формате системы счисления по основанию 10 должна состоять из цифр в диапазоне от 0 до 9 без лидирующего символа 0, например, 1998.
1.4. Корректная целочисленная константа в формате системы счисления по основанию 16 должна начинаться с префикса 0x или 0X и состоять из любых цифр и (или) 6-ти первых заглавных или строчных букв латинского алфавита (a-f или A-F), например, 0XFF81, 0x377, 0x1b.
1.5. Программа RADIX должна распознавать основание системы счисления корректной целочисленной константы, полученной из входной строки потока стандартного ввода.
1.6. Результат распознавания программой RADIX корректной константы должен отображаться в потоке стандартного вывода информационным сообщением "Correct Integer Format" с указанием основания системы счисления: Dec(10), Octal(8) или Hex(16) и значения целочисленной константы в оригинальной системе счисления.
1.7. Программа RADIX должна обеспечивать преобразование формата представления корректной константы в форматах альтернативных систем счисления и отображение результата преобразования в потоке стандартного вывода. Результаты преобразований должны отображаться в круглых скобках после значения константы в распознанной системе счисления.
1.8. С учетом требований пп. 1.6 и 1.7 информационное сообщение по результатам распознавания и пребразования корректной целочисленной константы, например, 033 в системе счисления по основанию 8, должно отображаться следующей строкой потока стандартного вывода:

033 (27, 0x1b) - Octal(8) Correct Integer Format

где 27 и 0x1b - представление константы 033 в системах счисления по основанию 10 и 16, соответственно.
1.9. Программа RADIX должна обнаруживать любые нарушения формата представления целочисленных констант, которые противоречат требованиям пп. 1.2 - 1.4.
1.10. Любые нарушения допустимого формата константы во входной строке из потока стандартного ввода должны сопровождаться информационным сообщением "Incorrect Integer Format" в потоке стандартного вывода. Место 1-й ошибки во входной строке должно быть идентифицировано символом ^ c последующим диагностическим сообщением " *** syntax error" под входной строкой.
1.11. Программа RADIX должна диагностировать стандартный ввод пустых строк или строк без цифр ("нецифровых" строк) любой системы счисления, отображая информационное сообщение "No one digit line " в потоке стандартного вывода и классифицируя их как ошибку формата константы, но без указания позиции ошибки (см. п. 1.10).
1.12. Программа RADIX должна завершать обработку входных строк при обнаружении конца потока стандартного ввода, отображая информационное сообщение "Constant Parsing Complited" в поток стандартного вывода.

2. Требования к надёжности
Программа RADIX должна обеспечивать обработку целочисленных констант, внутреннее представление которых не превышает размер машинного слова, длиной 4 байта.

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

4. Условия эксплуатации
4.1. Программа RADIX должна быть ориентирована на эксплуатацию в среде OS UNIX.
4.2. Программа RADIX должна быть реализована в виде выполняемого файла с именем radix, по которому она должна вызываться средствами любого командного процессора OS UNIX.
4.3. Программа RADIX должна эксплуатироваться в интерактивном режиме, читая строки из потока стандартного ввода и отображая результаты их обработки в потоке стандартного вывода.

5. Требования к информационной и программной совместимости
5.1. Чтобы обеспечить выполнение требуемых технических характеристик, программа RADIX должна реализовывать лексический и синтаксический анализ входных строк из потока стандартного ввода.
5.2. Лексический анализатор программы RADIX должен обеспечивать распознавание лексем, соответствующих формату структурных элементов целочисленных констант, в строках потока стандартного ввода.
5.3. Лексический анализатор программы RADIX должен обеспечивать выделение следующих типов лексем:
Типы выделяемых лексем должны кодироваться в программе RADIX целыми числами, величиной не меньше, чем 257, директивами "#define" макропроцессора системы программирования C. Макроопределения значений типов лексем следует сосредоточить в заголовочном файле y.tab.h, который должен формироваться при разработке синтаксичекого анализатора программы RADIX (см. ниже).
5.4. Значение любой лексемы (кроме лексемы типа LF), выделяемой лексическим анализатором программы RADIX, должно содержать номер ее позиции, считая с 0, в текущей входной строке потока стандартного ввода и величину соответствующей ей цифры (для цифровых лексем D8, D10 и D16) или 0 для остальных лексем. Лексеме типа LF должно соответствовать нулевое значение. Для сохранения значений лексем следует использовать внешнюю (extern) целочисленную (типа int) переменную yylval, старшие байты которой должны содержать номер позиции, а младшие - цифровое выражение лексемы.
5.5. Для разработки лексического анализатора программы RADIX, необходимо использовать генератор лексических анализаторов (далее по тексту - LEX) OS UNIX, инструментальные средства которого должны быть ориентированы на обработку файла спецификаций проектируемого лексического анализатора (далее по тексту - Lex-файл).
5.6. При разработке лексического анализатора программы RADIX необходимо составить Lex-файл, отражающий специфику лексического анализа целочисленных констант, и сохранить его под именем radix.l в выбранном рабочем каталоге файловой системы OS UNIX.
5.7. Проектируемый Lex-файл radix.l должен состоять из 2-х разделов: раздел деклараций и раздел правил. Разделы Lex-файла должны отделяться символической парой %%.
5.8. В разделе деклараций Lex-файла radix.l необходимо:
5.9. В разделе правил Lex-файла radix.l должны быть введены правила, которые обеспечивают распознавание лексем, перечисленных в п. 5.3, с помощью шаблонов регулярных выражений и необходимую функциональную обработку переменных в блоках действий правил.
5.10. Блоки действий правил Lex-файла radix.l должны обеспечивать:
Каждый блок действий должен быть ограничен парой фигурных скобок, внутри которых допустимо использовать любые конструкции и вызовы библиотечных функций системы программирования C. Например, блок действий при выделении десятичной цифры (по шаблону [0-9]) рекомендуется оформить следующим образом:

[0-9]    {  /*dec digit rule*/
          yylval = yytext[0] - '0';
          yylval |= ((pos << 16) & 0xFF0000);
          pos++;  /* эквивалентно, pos += yyleng; */
          return(D10);
         }

5.11. Лексический анализатор программы RADIX должен быть реализован отдельным об'ектным модулем lex.yy.o с точкой входа yylex(), который должен включаться в состав выполняемого файла radix редактором связей системы программирования C.
5.12. Вызов лексического анализатора должен осуществляться путем обращения к функции yylex() в синтаксическом анализаторе программы RADIX. Связь между синтаксическим и лексическим анализаторами должна осуществляться по типу лексемы, определяемому кодом возврата функции yylex(), и по значению лексемы, который передается через внешнюю переменную yylval.
5.13. Синтаксический анализатор программы RADIX должен обеспечивать грамматический разбор потока лексем от лексического анализатора с целью установить соответствие или несоответствие содержащих их строк потока стандартного ввода требуемому формату целочисленных констант.
5.14. Для выполнения грамматического разбора синтаксический анализатор программы RADIX должен реализовывать однозначную контекстно-свободную грамматику простого предшествования, которая ориентирована на построчную обработку целочисленных констант из потока стандартного ввода и далее по тексту называется грамматикой констант.
5.15. Грамматику констант синтаксического анализатора программы RADIX должны составлять следующие элементы: начальный нетерминал (inputline), нетерминалы (integer, int8, int10, int16, octal, dec, hex, noint), терминалы (лексемы, выделенные лексическим анализатором, см. п. 5.3), система продукций (правил вывода), которые должны обеспечивать вывод входной строки стандартного ввода путем приведения терминалов и нетерминалов к начальному нетерминалу грамматики констант методом LR(1) анализа снизу-вверх по дереву вывода.
5.16. Приведение потока лексем к начальному нетерминалу с помощью продукций грамматики констант синтаксического анализатора программы RADIX должно означать успешное завершение грамматического разбора, т.е. распознавание корректной целочисленной константы. Альтернативный результат должен рассматриваться как синтаксическая ошибка формата введенной константы.
5.17. Нетерминалы, указанные в п. 5.15, должны определяться продукциями грамматики констант синтаксического анализатора программы RADIX в форме, близкой нотации Бэкуса-Наура (БНФ), следующим образом:
Для кодирования нетерминалов octal, dec, hex, int8, int10, int16 и integer должны использоваться численные значения распознанных констант из потока стандартного ввода. Кодирование нетерминалов noint и empty может быть произвольным.
5.18. Начальный нетерминал inputline должен определяться продукциями грамматики констант синтаксического анализатора программы RADIX как входная строка, завершенная лексемой LF, где входная строка может соответствовать нетерминалам integer, empty или быть пустой, чтобы распознать конец потока стандартного ввода (EOF). Приведение по 1-й альтернативе (integer LF) означает успех грамматического разбора. Во втором случае (empty LF), грамматический разбор нельзя считать успешным, хотя достигнуто приведение к нетерминалу inputline, из-за нецифрового содержания входной строки. Последняя альтернатива нужна для корректной отработки признака конца потока стандартного ввода (^D), когда необходимо завершить выполнение программы RADIX, считая результат грамматического разбора неподлежащим анализу.
5.19. Для разработки синтаксического анализатора программы RADIX, необходимо использовать генератор синтаксических анализаторов (далее по тексту - YACC) из состава OS UNIX, инструментальные средства которого ориентированы на обработку файла спецификаций (далее по тексту Yacc-файл) проектируемого синтаксического анализатора.
5.20. При разработке синтаксического анализатора программы RADIX необходимо составить Yacc-файл, отражающий специфику грамматического разбора целочисленных констант, и сохранить его под именем radix.y в выбранном рабочем каталоге файловой системы OS UNIX.
5.21. Проектируемый Yacc-файл radix.y должен состоять из 3-х секций: секция деклараций, секция правил и секция функций. Разделителем секций должна быть символическая пара %%.
22. Секция деклараций Yacc-файла radix.y должна включать:
5.23. В секции правил Yacc-файла radix.y должны быть приведены описания продукций приведения нетерминалов грамматики констант в соответсвии с требованием пп. 5.17 и 5.18.
5.24. Каждая продукция секции правил Yacc-файла radix.y должна быть задана в нотации, близкой к форме Бэкуса-Наура, где в левой части указывается приводимый нетерминал, а в правой - последовательность терминалов и нетерминалов грамматики констант, которые перечисляются через пробел. В частном случае, правая часть может быть пустой, если необходимо построить пустую продукцию. Для разделения частей продукции должен использоваться символ двоеточия (:). Каждую продукцию нужно начинать с новой строки и завершать либо символом точки с запятой (;), либо блоком действий в фигурных скобках.
5.25. Альтернативные продукции (с одинаковыми нетерминалами в левых частях правил), необходимые для приведения нетерминалов inputline, integer и empty, должны быть об'единены в секции правил Yacc-файла radix.y с помощью оператора ИЛИ, который обозначается символом вертикальной черты (|). Например, альтернативную продукцию приведения нетерминала empty рекомендуется реализовать путем сочетания пустого правила и правила, определяющего нетерминал empty через нетерминал noint, следующим образом:

 empty : | noint;

Пустая альтернатива в этой продукции указывает на необязательность наличия в нетерминале empty последовательности лексем OTHER, ранее приведенной к нетерминалу noint, соответствующим правилом грамматики констант (см. п. 26).
5.26. Продукции секции правил Yacc-файла radix.y, необходимые для приведения нетерминалов noint, octal, dec и hex, которые определяются как последовательности соответствующих терминалов OTHER, D8, D10 и D16, должны задаваться в форме лево-рекурсивных правил. Например, нетерминал noint должен определяться следующим лево-рекурсивным правилом:

noint : OTHER |
        noint OTHER;

которое позволяет трактовать нетерминал noint как одиночную лексему OTHER, или (|) последовательность лексем OTHER произвольной длины.
5.27. Продукции секции правил Yacc-файла radix.y, приведение нетерминалов которых необходимо сопровождать функциональной обработкой, должны содержать блоки действий. Блоки действий должны располагаться в правых частях продукций и ограничиваться парой фигурных скобок. Внутри блоков действий можно использовать любые конструкции и вызовы функций системы программирования C, а также операции с псевдо-переменными YACC ($$, $1, $2, ... ), которые нужно применять для доступа к элементам продукций. Псевдо-переменная $$ должна использоваться для назначения желаемого численного значения нетерминалам в левых частях продукций. Псевдо-переменные $1 и $2 должны применяться для доступа к терминалам или нетерминалам в порядке их следования в правой части каждой продукции грамматики констант, где это необходимо. При формировании продукций грамматики констант следует учитывать, что по умолчанию, значение псевдо-переменной $$ равно значению псевдо-переменной $1, а значение псевдо-переменной для терминала равно значению переменной yylval, которая хранит значение соответствующей лексемы.
5.28. Блоки действий с псевдо-переменными в секции правил Yacc-файла radix.y следует использовать для динамического накопления значений целочисленных констант параллельно с грамматическим разбором входной строки стандартного ввода через соответсвующее вычисление числовых значений нетерминалов octal, dec или hex, когда они приводятся продукциями грамматики констант. Например, блок действий продукции приведения нетерминала octal рекомендуется оформить следующим образом:

octal : D8  {
             $$ = $1 & 0xFF;
            }
       | octal D8  {
                    $$ = $1 * 8 + ($2 & 0xFF);
                   }

Такая организация блока действий позволяет последовательно накапливать значение восьмиричной константы в нетерминале octal, используя его текущее значение и младший байт переменной yylval, содержащий значение лексемы D8, полученной от лексического анализатора.
5.29. Накопленные в нетерминалах octal, dec или hex значения констант должны передаваться нетерминалам int8, int10 или int16 через явное или неявное (принятое по умолчанию) присваивание псевдо-переменных в блоках действий соответствующих продукций секции правил Yacc-файла radix.y. Например, блок действий продукции приведения нетерминала int8 рекомендуется оформить следующим образом:

int8 : OCTALMARK octal { $$ = $2; }

где текущее значения константы, полученное ранее в нетерминале octal, преобразуется в значение нетерминала int8 через явное переприсваивание псевдо-переменных. При оформлении продукции приведения нетермина int10 следует использовать неявное переприсваивания псевдопеременных для передачи значения десятичной константы (по умолчанию, $$ = $1).
5.30. В блоках действий для альтернативных продукций приведения нетерминалов int8, int10 или int16 к нетерминалу integer грамматики констант в секции правил Yacc-файла radix.y должна быть обеспечена индентификация системы счисления распознаваемой целочисленной константы путем присваивания глобальной статической переменной base значения 8, 10 или 16, соответственно. Передача значения константы от нетерминалов int8, int10 или int16 в правых частях этих альтернативных продукций приводимому нетерминалу integer в левой части должна осуществляться через неявное переприсваивание псевдо-переменных ($$ = $1), которое выполняется по умолчанию.
5.31. Значение распознанной целочисленной константы, накопленное в нетерминалах octal, dec или hex и переданное через нетерминалы int8, int10 или int16 нетерминалу integer операциями над псевдопеременными в блоках действий соответствующих продукций, оформленных по требованиям пп. 5.27 - 5.30, должно быть использовано в блоке действий продукции приведения начального нетерминала inputline секции правил Yacc-файла radix.y для символического отображения основания системы счисления константы и ее представления в форматах альтернативных систем счисления как требуется в пп. 1.6 - 1.8.
5.32. Чтобы обеспечить требуемый в пп. 1.6 - 1.8 формат отображения результатов грамматического разбора корректной константы, в блоке действий продукции приведения нетерминала inputline секции правил Yacc-файла radix.y, следует применить библиотечную функцию printf() в комбинации с оператором switch системы программирования C. Для доступа к нетерминалу integer, содержащему значение распознанной константы, в блоке действий продукции приведения нетерминала inputline необходимо использовать псевдо-переменную $1. Идентификацию основания системы счисления должна обеспечивать статическая переменная base, значение которой определено блоком действия соответствующей продукции приведения нетерминала integer на предшествующей стадии грамматического разбора как требуется в п. 5.30. В конце этого блока действий целесообразно проинициализировать внешнюю переменную yylval нулем. Блок действий следует закончить оператором return(0), который должен обеспечивать (и отражать) принудительно успешное завершение синтаксического анализа текущей входной строки потока стандартного ввода.
5.33. Блок действия альтернативной продукции приведения начального нетерминала inputline через пустую структурную единицу грамматики констант, которая необходима для обработки признака конца потока стандартного ввода (см. п. 5.18), должен обеспечивать возможность отличить эту ситуацию от ситуации успешного завершения грамматического разбора (см. п. 5.32) в программе RADIX и блокировать отображение соответствующего информационного сообщения (см. п. 1.6). Чтобы обеспечить выполнение этого требования, рекомендуется присвоить внешней переменной yylval любое допустимое отрицательное значение и применить библиотечную функцию puts() системы программирования С для отображения в потоке стандартного вывода информационного сообщения о завершении обработки строк потока стандартного ввода в соответствии с требованием по п. 1.12.
5.34. Блок действия альтернативной продукции приведения начального нетерминала inputline через нетерминал empty (см. п. 5.18) , которая необходима для обработки пустой или "нецифровой" (без цифр) входной строки, должен обеспечивать требуемую в п. 1.11 диагностику ошибки, используя библиотечную функцию printf() системы программирования C. Блок действия этой альтернативной продукции необходимо закончить оператором return(1), который должен обеспечивать ( и отражать ) принудительно аварийное завершение синтаксического анализа текущей входной строки потока стандартного ввода.
5.35. Секция функций Yacc-файла radix.y должна содержать спецификацию функции обработки ошибок синтаксического анализа, с зарезервированным именем yyerror, которая автоматически вызывается, когда входной поток лексем не может быть приведен к начальному нетерминалу грамматики констант, обеспечивая аварийное прерывание грамматического разбора текущей входной строки потока стандартного ввода. Спецификация функции yyparse() должна соответствать правилам оформления исходного кода функций в системе программирования C.
5.36. Функция yyerror(), специфицированная в Yacc-файле radix.y, должна иметь единственный аргумент типа (char *), который по умолчанию содержит адрес предопределенной символьной строки: "syntax error". Аргумент функции yyerror() следует использовать для формирования диагностического сообщения в соответствии с требованием п. 1.10.
5.37. Функция yyerror(), специфицированная в Yacc-файле radix.y, должна обеспечивать диагностику места ошибки грамматического разбора во входной строке потока стандартного ввода в соответствии с требованием п. 1.10. Для определения позиции ошибки следует использовать содержание 2-х старших байтов внешней переменной yylval, сохраняющей значение распознанной ошибочной лексемы, которое должно устанавливаться лексическим анализатором программы RADIX. Получение этой информации и сохранение ее в автоматической целочисленной (int) переменной offset гарантирует, например, следующая конструкция:

int offset = (yylval >> 16) & 0xFFFF;

системы программирования C. Визуальное смещение указателя ошибки (^) от начала входной строки рекомендуется обеспечить путем отображения соответствующего числа пробелов под входной строкой, содержащей ошибку, используя, например, библиотечную функцию printf() или макрос putchar() системы программирования С.
5.38. Кроме диагностики ошибки, функция yyerror(), специфицированная в Yacc-файле radix.y, должна обеспечивать пропуск и блокировку разбора всех лексем после обнаруженной ошибки до лексемы LF, соответствующей концу текущей входной строки потока стандартного ввода. Для пропуска хвостовых лексем рекомендуется организовать циклический явный вызов функции yylex() лексического анализатора программы RADIX, пока не обнаружена лексема LF.
5.39. Функция yyerror(), специфицированная в Yacc-файле radix.y, должна обеспечивать целочисленный (типа int) возврат с кодом, равным 1.
5.40. Синтаксический анализатор, формируемый по Yacc-файлу radix.y, должен быть реализован отдельным объектным модулем y.tab.o с точкой входа yyparse(), который должен включаться в выполняемый файл radix программы RADIX редактором связей системы программирования C.
5.41. Вызов синтаксического анализатора должен осуществляться путем обращения к функции yyparse() в основной функции main() программы RADIX, исходный код которой необходимо составить на языке программирования C.
5.42. Функция yyparse() должна возврашать в основную функцию main() программы RADIX код 0 при успехе грамматического разбора каждой входной строки потока стандартного ввода или в конце потока стандартного ввода и 1 - при обнаружении синтаксических ошибок. Для различения 2-х указанных альтернатив при нулевом коде возврата функции yyparse(), в основной функции main() целесообразно предусмотреть анализ знака значения внешней переменной yylval (см. пп. 5.32 и 5.33).
5.43. Основная функция main() программы RADIX должна обеспечивать циклический вызов функции синтаксического анализатора yyparse() и анализ ее кода возврата для отображения информационных сообщений по результатам грамматического разбора каждой входной строки из потока стандартного ввода в соответствии с требованиями пп. 1.6 и 1.10, пока не исчерпан поток стандартного ввода. Признак конца потока стандартного ввода рекомендуется проверять на каждой итерации цикла предикатом eof(stdin), который определен в заголовочном файле stdio.h системы программирования C.
5.44. Основная функция main() программы RADIX должна быть реализована в отдельном объектном модуле radix.o с точкой входа main(). Он должен включаться в выполняемый файл radix программы RADIX редактором связей системы программирования C

Стадии и этапы разработки
Процесс разработки программы RADIX должен разделяться на следующие 4 стадии:

1. При разработке лексического анализатора программы RADIX необходимо выполнить следующие этапы:
$ lex radix.l

$ cc -c lex.yy.c

2. Стадию разработки синтаксического анализатора программы RADIX необходимо разделить на следующие этапы:

$ yacc -vd radix.y


$ cc -c y.tab.c

3. На стадии разработки основной функции main для вызова анализаторов в программе RADIX следует выполнить следующие этапы:

$ cc -c radix.c

4. Для сборки выполняемого файла radix из объектных модулей lex.yy.o, y.tab.o, radix.o, полученных на стадиях пп. 5.2 - 5.4, и объектных модулей библиотеки LEX /usr/lib/libl.a, необходимо применить редактор связей OS UNIX, реализовав его вызов следующей командой:

$ cc -o radix radix.o y.tab.o lex.yy.o -ll

Для автоматизации отладки программы RADIX целесообразно составить make-программу, содержащую вызовы команд OS UNIX, перечисленные в пп. 2 - 5, которые должны выполняться по результатам сопоставления даты создания или модификации содержания зависимых файлов, используемых при разработке программы RADIX.
При составлении make-программы автоматизации разработки программы RADIX должны быть учтены следующие зависимости файлов:

lex.yy.c зависит от radix.l;
lex.yy.o зависит от lex.yy.c и y.tab.h;
y.tab.c и y.tab.h зависят от radix.y;
y.tab.o зависит от y.tab.c;
radix.o зависит от radix.c;
radix зависит от radix.o, y.tab.o и lex.yy.o

Указанные зависимости должны быть специфицированы в make-программе в форме правил, обеспечивающих авто-проверку соответствия дат создания или модификации файлов, которые перечислены в левых и правых частях правил. Левые и правые части правил make-программы образуют списки целей и подцелей, соответственно. Каждое правило должно указываться на отдельной строке. Разделителем списков целей и подцелей в правилах является символ двоеточия (:). Если файлы в списке подцелей созданы или модифицированы позднее файлов в списке целей, то должны выполняться действия правила, указанные в отдельных строках под правилом, начиная с позиции табуляции. Например, правило проверки зависимости файла lex.yy.c (цель) от файла radix.l (подцель) в make-программе разработки программы RADIX рекомендуется оформить следующим образом:

lex.yy.c: radix.l
        lex radix.l

Make-программа автоматизации разработки программы RADIX должна быть сосредоточена в текстовом файле radix.m выбранного рабочего каталога файловой системы OS UNIX, где находятся все остальные файлы, создаваемые при разработке программы RADIX (см. пп. 2 - 5). Для составления make-программы в файле radix.m может быть использован любой текстовый редактор OS UNIX, например, xedit. Содержание make-программы в файле radix.m должно быть ориентировано на обработку интерпретатором make из состава инструментальных средств OS UNIX, для вызова которого необходимо применить следующую команду:

$ make -f radix.m

Пример составления make-программы radix.m приведен в Приложении 1 к настоящему Техническому Заданию.

Порядок контроля и приёмки
Для проверки функционирования программы RADIX должен быть предложен контрольный пример, предусматривающий стандартный ввод корректных и некорректных целочисленных констант в каждой системе счисления, для которого возможна простая визуальная оценка полученных результатов.

Приложение 1
В этом приложении приведен пример составления make-программы radix.m, необходимой для автоматизации отладки программы RADIX.

# Radix Translator project make-file, which
# declare Make-variables & dependence rules
# to the project auto assembly.
# To invoke this make-file use command:
# make -f radix.m

# Make-file variables definition

# Lexical (.l) & Syntax (.y) analyseres lex-
# and yacc-files basename

BASE=radix

# Radix Translator execute file name

EXEC=radix

# Header file names list

HEADER=y.tab.h

# Classic Link libraries set

LIBS=-ll

# C-compiler invoking command

CC=cc

# Lex generator invoking command

LEX=lex

# Yacc generator invoking command

YACC=yacc -vd

# Make-file dependence rule description
# Any rule determines time dependence of the
# target (left) file from subtarget list (right) files.
# Action in any dependence is executed, when
# target (left) file is older the any file
# in subtarget list (right)
# (Note, leading  in action lines begining)

# Radix translator execute module wanted,
# when changed radix.o y.tab.o lex.yy.o

$(EXEC): $(BASE).o y.tab.o lex.yy.o
        $(CC) -o $(EXEC) $(BASE).o y.tab.o lex.yy.o $(LIBS)

# Syntax analyser object file wanted,
# when changed y.tab.c

y.tab.o: y.tab.c
        $(CC) -c y.tab.c

# Lexical analyser object file wanted,
# when changed lex.yy.c and y.tab.h

lex.yy.o: lex.yy.c y.tab.h
         $(CC) -c lex.yy.c

# Radix translator's main function objective code
# wanted, when changed radix.c

$(BASE).o: $(BASE).c
          $(CC) -c $(BASE).c

# Syntax analyser C-code & token definition header
# file wanted, when changed radix.y

y.tab.h: $(BASE).y
        $(YACC) $(BASE).y
y.tab.c: $(BASE).y
        $(YACC) $(BASE).y

# Lexical analyser source file wanted,
# when changed radix.l

lex.yy.c: $(BASE).l
         $(LEX) $(BASE).l

# Reject default suffixes rule for yacc

.y.c:
      @echo "Reject default processing yacc suffixes fule"
.SUFFIXES:  .c .y

Приложение 2
При разработке лексических и синтаксических анализаторов в OS UNIX для проектирования программы RADIX рекомендуется использовать литературные источники, перечисленные ниже.

  1. Рейуорд-Смит В.Дж. Теория формальных языков. Вводный курс, M.: Радио и связь, 1988.
  2. Тихомиров В.П., Давидов М.И. Операционная система ДЕМОС: инструментальные средства программирования, М.: Финансы и статистика, 1988.
  3. SCO XENIX, Development System, LEX Programmer Guide, SCO Inc., 1986. ( Имеется русский перевод: Генератор лексических анализаторов LEX. Руководство Программиста )
  4. SCO XENIX, Development System, YACC Programmer Guide, SCO Inc., 1986. ( Имеется русский перевод: Генератор синтаксических анализаторов YACC. Руководство Программиста )
  5. SCO XENIX, Development System, Make Programmer Guide, SCO Inc., 1986. ( Имеется русский перевод: Интерпретатор make. Руководство Программиста )