我有一个扫描仪,它保持两个独占状态(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;”失败。
答案 0 :(得分:1)
当状态DEFN
遇到|
时,状态肯定会更改为WORD
。但是,下次调用yylex
时(为了获取管道后面的令牌),状态将被块重置为WORD
%{
BEGIN(WORD);
%}
从flex manual(强调添加):
在规则部分中,出现在第一个规则之前的任何缩进或%{%}封闭文本可用于声明扫描例程本地的变量和(声明之后)要执行的代码无论何时进入扫描程序。
你最好使用INITIAL
开始条件来表示初始启动条件。