flex-lexer 规则部分中的代码块有什么作用?

What does code block in flex-lexer rule section do?

我正在学习 flex 并遇到了有关规则部分代码块的问题。

在flex的手册http://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有什么区别?

flex manual

规则部分中的代码块具有不可预测的结果,除非:

  • 它出现在第一个模式之前,或者

  • 它只包含白色 space 或评论。

这个特定的代码块仅由白色 space 和注释组成。所以它何时执行的问题是相当禅宗的。 (在“一只手拍手的声音”的意义上。)它什么都不做。什么时候?好吧,无论何时。没有什么是难以观察的。

YY_USER_ACTION 发生在识别模式之后,规则操作之前(即使该操作为空)。如果你不定义 YY_USER_ACTION,它也什么都不做,所以我想这与评论没有区别。但通常它被定义为做某事,并且它被插入到每个规则中,而不仅仅是一个地方。所以这是完全不同的。