Flex lexer启动条件无法识别

时间:2013-08-07 20:09:25

标签: bison flex-lexer lexer

我有一个扫描仪,它保持两个独占状态(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;”失败。

1 个答案:

答案 0 :(得分:1)

当状态DEFN遇到|时,状态肯定会更改为WORD。但是,下次调用yylex时(为了获取管道后面的令牌),状态将被块重置为WORD

%{
    BEGIN(WORD);
%}

flex manual(强调添加):

  

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

你最好使用INITIAL开始条件来表示初始启动条件。​​