Операционная система UNIX. Руководство программиста


Использование значений произвольных типов - часть 2


%left <optype> '+' '-'

означает, что любое обращение к значениям, возвращаемым этими двумя лексемами, снабжается тегом - именем элемента объединения optype. Еще одно ключевое слово %type используется для сопоставления имени элемента объединения нетерминальному символу. Чтобы сопоставить элемент объединения nodetype нетерминальным символам expr и stat, можно записать

%type <nodetype> expr stat

Есть несколько случаев, в которых описанных механизмов недостаточно. Если действие находится внутри правила, возвращаемое этим действием значение не имеет типа, заданного a priori. Аналогично, yacc'у не хватает информации для определения типа при ссылках на значения из левого контекста (таких как $0). В подобных ситуациях тип может быть задан явно ссылкой на имя элемента объединения, которое заключается в угловые скобки < и > и вставляется за первым знаком $. Пример

rule : aaa { $<intval>$ = 3; } bbb { fun ($<intval>2, $<other>0); } ;

иллюстрирует данную возможность. Синтаксис не назовешь "сахарным", но и требуется такая конструкция нечасто.

Средства, описанные в данном разделе, проиллюстрированы в более сложном из приводимых ниже примеров. Отметим, что контроль типов включается только при явном использовании типизации (например, если встречается конструкция %type) и контроль этот является весьма жестким. Так, считается ошибкой вхождение $n или $$

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




Начало  Назад  Вперед



Книжный магазин