使用lex

时间:2015-07-30 02:13:08

标签: regex parsing bison yacc lex

我有一个配置文件如下。

    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吗?

0 个答案:

没有答案