我有一个配置文件如下。
e_type=0x1B
HID=0xaabbccddeeff
我使用以下lex文件来识别模式。
%option noyywrap
%{
#include <stdio.h>
#include <stdlib.h>
enum{
T_E_TYPE = 1,
T_HID_TYPE = 2,
};
int yylval;
%}
%%
%{
yylval = 0; /* do this for every token not using yylval, to be on the safe side */
%}
e_type=0[xX][0-9a-fA-F]+ { yylval=strtoul(&yytext[9],NULL, 16); return T_E_TYPE; }
HID=0[xX][0-9a-fA-F]+ { return T_HID_TYPE; }
[^\t\n\r] { }
%%
int main(int argc,char **argv)
{
int tok = 0;
if(argc > 1)
{
FILE *file;
file = fopen(argv[1], "r");
if(!file)
{
fprintf(stderr, "Could not open %s \n", argv[1]);
exit(1);
}
yyin = file;
}
while((tok = yylex()) != 0)
{
printf("token :%d lval : %d yytext : %s\n",tok,yylval,yytext);
}
}
我按如下方式编译程序
flex test.l ; gcc lex.yy.c -o test
我运行程序。
./test tmp.conf
输出:
token :1 lval : 27 yytext : e_type=0x1B
token :2 lval : 0 yytext : HID=0xaabbccddeeff
到目前为止一切顺利。如果我按如下方式扩展我的输入文件
[section1]
e_type=0x1B
HID=0xaabbccddeeff
[section2]
e_type=0x1B
HID=0xaabbccddeeff
有没有办法识别每个令牌属于哪个部分使用lex?或者我需要使用yacc / bison吗?