%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z] {words++; chars+=strlen(yytext);}
\n {chars++;lines++;}
. {chars++;}
"aaa" {chars+=3; words++;}
%%
main(int argc,char **argv){
yylex();
printf("%8d%8d%8d\n", lines,words,chars);
}
flex程序分为三个部分,每个部分都由“%%”进行分割:
- 第一部分,主要是声明和选项设置,该部分会被直接拷贝到生成的词法分析器中;
- 第二部分
- 左边是模式,右边是模式匹配之后需要执行的代码。
- 该部分的模式需要顶格写,并且模式都采用正则表达式的方式进行描述,因此第三行的“.”表示任意匹配一个字符。
- yytext变量总是被指向本次匹配的输入文本。
- 引号表示flex使用银好内文本的原义,而不是解释成正则表达式
- 第三部分,第三部分是会被拷贝到生成的词法分析器里面的C代码,通常是一些与动作代码相关的例程。