[ Содержание ] [ Предыдущая ] [ Следующая ]
Имена ссылаются либо на токены, либо на нетерминальные символы. 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 |