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

       

Семантики


Семантики

Nonterminal: production_body_1 { semantic_action_1 } | . . . production_body_n { semantic_action_n } ;

Грамматические правила могут содержать так называемые семантики (semantic actions), представляющие собой фрагменты программ на языке С, заключенные в фигурные скобки. Например,

lines: lines expr '\n' { printf ("%s\n", %2); }

Нетерминал может иметь значение некоторого типа, который указан в объединении, определенном в секции объявлений. Для этого

  1. нетерминал должен быть объявлен следующим образом: %type <имя-вида> имя-нетерминала

    Причем, в объединении должен быть элемент вид имя-вида. Например,

    %union { ... unsigned short int myCounter; ... } %type <myCounter> counter %%

  2. Семантика правил, левой частью которых является этот нетерминал, должна содержать оператор: $$ = значение;

Заметим, что значение может иметь не только нетерминалы, но и терминальные символы. В этом случае терминал должен быть объявлен следующим образом: %type <имя-вида> имя-нетерминала

Естественно, в объединении должен быть элемент вид имя-вида. Например,

%union {... signed int myValue;...} %token <myValue> NUMBER_LC



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