0

我有一个保持两种排他状态(WORD 和 DEFN)的扫描仪

%option noyywrap
%s WORD
%s DEFN
%%

%{
    BEGIN(WORD);
%}

<WORD>{
"|"          { BEGIN(DEFN); return WS_PIPE; }
}

<DEFN>{
[^;]+        { printf("ds: %s\n", yytext); return WD_STRING; }
";"          { return WD_SEMICOLON; }
}

\n|.         { printf("U: %s\n", yytext); }

%%

但是使用简单的输入“| some text;”,解析管道时状态不会改变,所以解析“some text;” 失败。

4

1 回答 1

1

当在 state 中遇到DEFNa时,状态肯定会被更改。但是,下一次被调用(以获取管道后面的令牌),状态被块重置为|WORDyylexWORD

%{
    BEGIN(WORD);
%}

来自flex 手册(强调添加):

在规则部分中,出现在第一条规则之前的任何缩进或 %{ %} 封闭文本可用于声明扫描例程的本地变量和(在声明之后)每当进入扫描例程时要执行的代码.

您最好使用INITIAL起始条件来表示初始起始条件。

于 2013-08-08T02:53:12.200 回答