[ Содержание ] [ Предыдущая ] [ Следующая ]

Глава 1. Основные спецификации

    Имена ссылаются либо на токены, либо на нетерминальные символы. Yacc требует, чтобы имена токенов были объявлены. В добавок, по причинам, описанным в часто желательно включить лексический анализатор как часть файла спецификаций; может быть полезно включить туда также идругие программы. Таким образом, каждый файл спецификаций состоит из трех секций: объявления, (грамматические) правила, и программы. Секции разделяются символами двойного процента "%%". (Символ процента "%" в основном используется в Yacc-е как Esc-символ.) Другими словами, полный файл спецификации выглядит как:

описания %% правила %% программы

    Секция объявлений может быть пуста. Более того, если секция программ опущена, то вторая метка "%%" также может быть опущена; таким образом, минимальная разрешенная спецификация Yacc есть:

%% правила

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

     Комментарии могут появляться везде, где разрешено имя; они заключаются в /* . . . */ как в C и PL/I

    Секция правил построена из одного или более грамматических правил. Грамматическое правило имеет форму:

A : BODY ;

    A представляет собой нетерминальное имя, а BODY представляет собой последовательность нуля или более имен и литералов. Двоеточие ":" и точка с запятой ";" - пунктуация Yacc-а.

     Имена могут быть произвольной длины и могут состоять из букв, точек ".", подчерков "_" и неначальных цифр. Заглавные и строчные буквы различаются. Имена, используемые в теле грамматических правил могут представлять токены и нетерминальные символы.

     Литерал состоит из символов, заключенных в одиночные кавычки "'". Как и в C, символ обратной косой черты "\" -- это esc-символ внутри литералов, распознаются все esc-последовательности. Таким образом,

'\n'новая строка
'\r'перевод каретки
'\\'обратная косая черта
'\''одиночная кавычка
'\t'табуляция
'\b'забой
'\f'перевод страницы
'\xxx'"xxx" в восьмеричной системе счисления

    По некоторым причинам технического свойства, символ NUL ('\0') не должен использоваться в грамматических правилах.

     Если имеется несколько грамматических правил с одинаковой левой частью, может использоваться вертикальная черта "|", чтобы избежать переписывания левой части. Таким образом, грамматические правила

A : B C D ; A : E F ; A : G ;

    могут быть представлены как

A : B C D | E F | G ;

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

     Если нетерминальный символ соответствует пустой строке, это можно записать очевидным способом:

empty : ;

    Имена, представляющие токены, должны быть объявлены; проще всего это сделать, написав

%token name1 name2 . . .

    в секции объявлений. (Смотри главы 3, 5, 6 за дополнительным обяснением). Каждое имя, не объявленное в секции объявлений, считается нетерминальным символом. Каждый нетерминальный символ должен появляться в левой части как минимум одного правила.

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

%start keyword

    b`$4 b4 $lbq l`sp $jb ` ``p` Вернуть в соответсвующем месте символ конца -- дело лексического анализатора, написанного пользователем; смотри секцию 3, ниже. Обычно символ конца представляет некоторый достаточно очевидный статус ввода-вывода, такой как "конец файла" или "конец записи".

[ Содержание ] [ Предыдущая ] [ Следующая ]



c 1998-2000 SoloTony (Antonio Solo) solotony@mail.ru