#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 */
Вы могли видеть, что между двумя блоками кода есть второй %%
, у меня есть два вопроса:
- когда этот код будет выполнен?
- в чем разница между этим и
YY_USER_ACTION
?
Ответ №1:
Блок кода в разделе правил приводит к непредсказуемым результатам, если:
-
Это происходит перед первым шаблоном или
-
Он не содержит ничего, кроме пробелов или комментариев.
Этот конкретный блок кода состоит только из пробела и комментария. Итак, вопрос о том, когда он выполняется, довольно прост. (В смысле «звук хлопка одной руки».) Он ничего не делает. Когда? Ну, когда угодно. Нет ничего сложного для наблюдения.
YY_USER_ACTION
происходит сразу после распознавания шаблона, перед действием правила (даже если это действие пустое). Если вы не определяете YY_USER_ACTION
, он также ничего не делает, поэтому я полагаю, что нет никакой разницы с комментарием. Но обычно он определен для выполнения чего-либо, и он вставляется в каждое правило, а не только в одно место. Так что это совершенно другое.