Разработка компиляторов

       

Семантики (продолжение)


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

T: F { &&=&1; } | T*F { && = &1*&2; } ;

Заметим, что по умолчанию значение правила и тем самым значение нетерминала, находящегося в его левой части, - это значение первого элемента в нем. Таким образом, предыдущий пример может быть переписан:

T: F | T*F { && = &1*&2; } ;

На самом деле, семантики могут быть использованы не только в конце правила, но и в середине. Например,

A: B { && = 1; } C { x = &2; y = &3; } ;

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

&&1: /* пустая правая часть */ { && = 1; } ; A: B &&1 C { x = &2; y = &3; } ;



Содержание раздела