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 */
您可以看到两个 %%
之间有第二个代码块,我有两个问题:
- 这段代码什么时候执行?
- 这个和
YY_USER_ACTION
有什么区别?
规则部分中的代码块具有不可预测的结果,除非:
它出现在第一个模式之前,或者
它只包含白色 space 或评论。
这个特定的代码块仅由白色 space 和注释组成。所以它何时执行的问题是相当禅宗的。 (在“一只手拍手的声音”的意义上。)它什么都不做。什么时候?好吧,无论何时。没有什么是难以观察的。
YY_USER_ACTION
发生在识别模式之后,规则操作之前(即使该操作为空)。如果你不定义 YY_USER_ACTION
,它也什么都不做,所以我想这与评论没有区别。但通常它被定义为做某事,并且它被插入到每个规则中,而不仅仅是一个地方。所以这是完全不同的。
我正在学习 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 */
您可以看到两个 %%
之间有第二个代码块,我有两个问题:
- 这段代码什么时候执行?
- 这个和
YY_USER_ACTION
有什么区别?
规则部分中的代码块具有不可预测的结果,除非:
它出现在第一个模式之前,或者
它只包含白色 space 或评论。
这个特定的代码块仅由白色 space 和注释组成。所以它何时执行的问题是相当禅宗的。 (在“一只手拍手的声音”的意义上。)它什么都不做。什么时候?好吧,无论何时。没有什么是难以观察的。
YY_USER_ACTION
发生在识别模式之后,规则操作之前(即使该操作为空)。如果你不定义 YY_USER_ACTION
,它也什么都不做,所以我想这与评论没有区别。但通常它被定义为做某事,并且它被插入到每个规则中,而不仅仅是一个地方。所以这是完全不同的。