Что делает блок кода в разделе правил flex-lexer?

#flex-lexer

#flex-lexer

Вопрос:

Я изучаю flex и столкнулся с проблемой, связанной с блоком кода в разделе правил.

В руководстве по flexhttp://westes.github.io/flex/manual/Comments-in-the-Input.html#Comments-in-the-Input , в разделе правил есть блок кода:

 %{
/* code block */
%}

/* Definitions Section */
%x STATE_X

%%
    /* Rules Section */
ruleA   /* after regex */ { /* code block */ } /* after code block */
        /* Rules Section (indented) */
<STATE_X>{
ruleC   ECHO;
ruleD   ECHO;
%{
/* code block */
%}
}
%%
/* User Code Section */

  

Вы могли видеть, что между двумя блоками кода есть второй %% , у меня есть два вопроса:

  1. когда этот код будет выполнен?
  2. в чем разница между этим и YY_USER_ACTION ?

Ответ №1:

руководство по flex

Блок кода в разделе правил приводит к непредсказуемым результатам, если:

  • Это происходит перед первым шаблоном или

  • Он не содержит ничего, кроме пробелов или комментариев.

Этот конкретный блок кода состоит только из пробела и комментария. Итак, вопрос о том, когда он выполняется, довольно прост. (В смысле «звук хлопка одной руки».) Он ничего не делает. Когда? Ну, когда угодно. Нет ничего сложного для наблюдения.

YY_USER_ACTION происходит сразу после распознавания шаблона, перед действием правила (даже если это действие пустое). Если вы не определяете YY_USER_ACTION , он также ничего не делает, поэтому я полагаю, что нет никакой разницы с комментарием. Но обычно он определен для выполнения чего-либо, и он вставляется в каждое правило, а не только в одно место. Так что это совершенно другое.