- 论坛徽章:
- 3
|
打个比方:
%{
#include <stdio.h>
int a;
int op=0;
%}
%%
[0-9]+ {
if(op==0){
sscanf(yytext,"%d",&a);
} else {
int b;
sscanf(yytext,"%d",&b);
switch(op) {
case 1:
printf("%d\n",a+b);
break;
case 2:
printf("%d\n",a-b);
break;
case 3:
printf("%d\n",a*b);
break;
case 4:
printf("%d\n",a/b);
break;
default:
break;
}
op=0;
}
}
"+" {op=1;}
"-" {op=2;}
"*" {op=3;}
"/" {op=4;}
[\t \n]+ ;
. ;
%%
int main()
{
yylex();
return 0;
}
|
- linux-0gt0:/tmp # flex test.l ; gcc lex.yy.c -ll ; ./a.out
- 1 + 1
- 2
- 11 * 12
- 132
复制代码
以下程序和上面的功能一样,看起来更像lex程序
%{
#include <stdio.h>
int a;
int op=0;
%}
%s ADD SUB MUL DIV
%%
<ADD>[0-9]+ {
int tmp;
sscanf(yytext,"%d",&tmp);
printf("%d\n",a+tmp);
BEGIN INITIAL;
}
<SUB>[0-9]+ {
int tmp;
sscanf(yytext,"%d",&tmp);
printf("%d\n",a-tmp);
BEGIN INITIAL;
}
<MUL>[0-9]+ {
int tmp;
sscanf(yytext,"%d",&tmp);
printf("%d\n",a*tmp);
BEGIN INITIAL;
}
<DIV>[0-9]+ {
int tmp;
sscanf(yytext,"%d",&tmp);
printf("%d\n",a/tmp);
BEGIN INITIAL;
}
[0-9]+ {sscanf(yytext,"%d",&a);}
"+" {BEGIN ADD;}
"-" {BEGIN SUB;}
"*" {BEGIN MUL;}
"/" {BEGIN DIV;}
[\t \n]+ ;
. ;
%%
int main()
{
yylex();
return 0;
}
|
[ 本帖最后由 cjaizss 于 2008-2-13 17:32 编辑 ] |
|