flex-lexer规则部分中的代码块做什么?

问题描述

我正在学习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

除非有以下条件,否则“规则”部分中的代码块会产生不可预测的结果:

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

  • 除了空白或注释之外,它什么都没有。

此特定代码块仅包含空格和注释。因此,何时执行的问题是禅定的。 (在“一只手鼓掌的声音”意义上。)它什么也没做。什么时候?好吧,每当。什么都不难观察。

YY_USER_ACTION会在识别出模式之后,规则操作之前发生(即使该操作为空)。如果您未定义YY_USER_ACTION,它也不会执行任何操作,因此我认为与注释没有区别。但通常将其定义为执行某项操作,并将其插入每条规则中,而不仅仅是一条规则中。所以完全不同。