ТЗ як (816073), страница 2
Текст из файла (страница 2)
п. 5.14) целесообразнодополнить следующим блоком действий:inputline : xx { /* Grammar Success */puts("Correct Bracket Expression");return(0);}который обеспечивает требуемую функциональную обработку при успехеграмматического разбора входной строки (см. п. 1.8).5.16. Продукции секции правил Yacc-файла bracket.y, необходимые дляприведения нетерминалов: p, s, b определяющих одиночные блоки скобоксоответствующих типов (см. п.
5.6), должны быть специфицированы спомощью альтернативных правил. В каждом из них альтернативы сверткиразличных нетерминалов правой части должны быть об'единены с помощьюоператора ИЛИ, который обозначается символом вертикальной черты (|).Например, альтернативную продукцию приведения нетерминала b следуетреализовать путем сочетания 2-х правил:b : '{' '}' ;/* rule b.1 */b : '{' xx '}' ;/* rule b.2 */в форме одного альтернативного правила:/* Braces block Alt Rule */b : '{''}'|/* alt-rule b.1 */'{' xx '}' ;/* alt-rule b.2 */которое определяет нетерминал b как блок фигурных скобок, содержащийвложенную последовательность блоков любых скобок, либо как пустой блокфигурных скобок без каких-либо скобочных символов внутри. Очевидно, чтоблоки круглых (p) и квадратных (s) могут определяться альтернативнымиправилами аналогичной структуры.5.17.
Продукции секции правил Yacc-файла bracket.y, необходимые дляприведения нетерминалов: pp, spps, xx, определяющих последовательностиблоков скобок соответствующих типов (см. п. 5.6), должны задаваться вформе лево-рекурсивных правил. Например, нетерминал xx рекомендуетсяспецифицировать следующим лево-рекурсивным правилом:/* Arbitrary brackets' blocks sequence */xx : x|xx x ;которое позволяет трактовать нетерминал xx как одиночный блок любыхскобок (x), или (|) последовательность таких блоков произвольной длины.Аналогичные лево-рекурсивные правила следует составить для приведенияпоследовательности блоков круглых скобок (pp) и комбинированнойпоследовательности из блоков круглых и/или квадратных скобок (spps).5.18.
Чтобы иметь возможность абстрагироваться от типа скобок,образующих одиночный скобочный блок, в лево-рекурсивных продукцияхсекции правил Yacc-файла bracket.y (см. п. 5.17) необходимо предусмотретьальтернативные правила разименования, которые должны обеспечиватьприведение нетерминалов sp и x (см.
п. 5.6). Например, нетерминал xцелесообразно определить следующим альтернативным правилом:/* Arbitrary brackets block */x : p | s | b ;согласно которому, к нетерминалу x приводится любой скобочный блок,вне независимости от типа образующих его скобок. Аналогичное по структуреальтернативное правило разименования следует предусмотреть дляприведения нетерминала sp, определяющее его как блок квадратных (s) иликруглых (p) скобок.5.19.
Секция функций Yacc-файла bracket.y должна содержать исходныйкод, оформленный по правилам системы программирования C, для 3-хфункций с предопределенными именами: yylex(), yyerror() и main(), которыедолжны иметь целочисленный (типа int) код возврата. Исходный кодперечисленных функций используется непосредственно для формированиякода программы BRACKET.5.20. Функция yylex() секции функций Yacc-файла bracket.y должнавыполнять лексический анализ входной строки из потока стандартного вводасо следующими целями: обнаружить скобки, распознать типы скобок изафиксировать порядковые номера скобок.
Вызов функции yylex() будетавтоматически производиться при грамматическом разборе входной строкидля получения очередных скобок, пока не достигнут символ перевода строки('\n').5.21. Для достижения целей лексического анализа, указанных в п.
5.20,исходный код функции yylex() должен предусматривать:• побайтноечтение любой заданной строки входного скобочноговыражения из потока стандартного ввода, например, с помощьюбиблиотечной функции getchar() системы программирования C;• распознавание символов скобок во входной строке например, спомощью оператора switch системы программирования C;• возврат кодов ASCII обнаруженных скобок с помощью оператора returnсистемы программирования C;• возврат нулевого кода при достижении конца входной строки спомощью оператора return(0) системы программирования C;• использование значения внешней целочисленной переменной yylval(см. п. 5.12) для фиксации порядкового номера каждой очереднойобнаруженной скобки.5.22.
Функция yyerror() секции функций Yacc-файла bracket.y должнаобеспечивать обработку ошибок расстановки скобок, обнаруженных приграмматическом разборе входной строки скобочного выражения. Ее вызовбудет происходить автоматически, когда скобочное выражение не можетбыть приведено к начальному нетерминальному символу грамматики скобок,обеспечивая аварийное прерывание грамматического разбора текущейвходной строки потока стандартного ввода.5.23. Спецификация функции yyerror() в Yacc-файле bracket.y, должнаиметь единственный аргумент типа (char *), который по умолчанию содержитадрес предопределенной символьной строки: "syntax error". Аргументфункции yyerror() следует использовать для формирования диагностическогосообщения в соответствии с требованием п.
1.7. Для диагностики позицииошибки по номеру неверно установленной скобки, исходный код функцииyyerror() должен предусматривать использование значения внешнейцелочисленной переменной yylval. Для отображения диагностическогосообщения в потоке стандартного вывода, рекомендуется применитьбиблиотечную функцию printf() системы программирования С.5.24. Спецификация функции main() в секции функций Yacc-файлаbracket.y должна содержать исходный код основной функции программыBRACKET, который обеспечивает обращение к функции синтаксическогоанализа yyparse() и передачу ее кода возврата во внешнюю операционнуюсреду.
Исходный код функции yyparse() формируется генераторомсинтаксических анализаторов YACC по Yacc-файлу и предусматривает вызовфункции yylex() для выполнения лексического анализа, также как передачууправления функции yyerror() для обработки ошибок грамматическогоразбора. Код возврата функции yyparse() должен однозначно отражатьрезультат грамматического разбора, принимая значение 0 при его успехе,или 1 - при обнаружении синтаксических ошибок.5.25. Исходный код секции функций Yacc-файла bracket.y и функцииyyparse() образует исходный код программы BRACKET, который долженформироваться генератором синтаксических анализаторов YACC в файле спредопределенным именем y.tab.c в текущем рабочем каталоге файловойсистемы OS UNIX.
Выполняемый модуль программы BRACKET должен бытьсоздан по файлу исходного кода y.tab.c в выполняемом файле bracketсредствами компилирующей системы программирования C.Стадии и этапы разработкиПроцесс разработки программы BRACKET целесообразно разделяться наследующие 3 стадии:• составить Yacc-файл bracket.y в выбранном рабочем каталоге файловойсистемы OS UNIX, используя любой текстовый редактор, например,xedit, ориентированный на работу в операционной среде X WindowSystem, или joe, для редактирования в консольном режиме;• получить исходный код синтаксического анализатора в файле y.tab.cтекущего каталога файловой системы OS UNIX, обработав Yacc-файлbracket.y командой yacc, следующим образом:$ yacc bracket.y• сформировать выполняемый модуль в файле bracket текущего каталогафайловойсистемыOSUNIX,компилируяисходныйкодсинтаксического анализатора в файле y.tab.c следующей командой:$ cc -o bracket y.tab.cРезультаты разработки программы BRACKET необходимо оформить в видепроектного документа, содержащего описание грамматики скобок и файласпецификаций для генератора синтаксических анализаторов YACC.Порядок контроля и приемки1.
Для проверки функционирования программы BRACKET должны бытьпредложены контрольные примеры, предусматривающие стандартныйввод корректных и некорректных скобочных выражений с учетомвложенности и конкатенации блоков скобок различных типов.2. Для приемки программы BRACKET должен быть организован вызоввыполняемого файла bracket в консольном режиме работы OS UNIXили режиме эмуляции терминала операционной среды X WindowSystem.Приложение1Текст высокоуровневой спецификации.Приложение2При разработке синтаксических анализаторов в OS UNIX дляпроектированияпрограммыBRACKETрекомендуетсяиспользоватьлитературные источники, перечисленные ниже.1.
Рейуорд-Смит В.Дж. Теория формальных языков. Вводный курс, M.:Радио и связь, 1988.2. Тихомиров В.П., Давидов М.И. Операционная система ДЕМОС:инструментальные средства программирования, М.: Финансы истатистика, 1988.3. SCO XENIX, Development System, YACC Programmer Guide, SCO Inc.,1986. ( Имеется русский перевод: Генератор синтаксическиханализаторов YACC. Руководство Программиста ).