/* name: fld_list.y */ ? %option reentrant %option noyywrap %option extra-type="struct stWorkData*" ? %x S_FIELDNAME %x S_EQUEL %x S_DATA_LEN %x S_DATA_LEN2 %x S_DATA_PROP %x S_DATA_PROP2 %x S_FIELDVAL %x S_END ? %{ ? #define YY_NO_UNISTD_H #include <string.h> #include <stdlib.h> ? ? #define MAX_FIELD_NAME_LEN? 64 ? struct stFieldInfo { ?????? char *name; ?????? unsigned int len; ?????? int prop; ?????? char *buffer; ?????? ?????? struct stFieldInfo *next; }; ? struct stWorkData { ?????? char *fld_name; /*字段名称 */ ?????? unsigned int data_len; /* 字段值长度*/ ?????? int data_prop; /*字段属性*/ ?????? char *data_buffer; /* 字段值 */ ?????? struct stFieldInfo? *field_list; ?????? struct stFieldInfo? *last_field; }; ? int add_field(struct stWorkData *wkdata,struct stFieldInfo *fld); %} ? FLDNAME [A-Za-z_]+([A-Za-z_]|[0-9])* DELIM ([" "t])* NUMBERS [0-9]* %% {FLDNAME} { ?????? yyextra->fld_name = strdup(yyget_text(yyscanner)); ?????? BEGIN S_FIELDNAME; } ? <S_FIELDNAME>{DELIM}"="{DELIM}[{DELIM} { ?????? BEGIN S_EQUEL; } ? <S_EQUEL>{NUMBERS} { ?????? yyextra->data_len = atoi(yyget_text(yyscanner)); ?????? BEGIN S_DATA_LEN; } <S_DATA_LEN>{DELIM}","{DELIM} { ?????? BEGIN S_DATA_LEN2;?????? } ? <S_DATA_LEN2>{NUMBERS}? { ?????? yyextra->data_prop = atoi(yyget_text(yyscanner)); ?????? BEGIN S_DATA_PROP; } ? <S_DATA_PROP>{DELIM}","{DELIM} { ?????? BEGIN S_DATA_PROP2;???? } ? <S_DATA_PROP2>. { ?????? int c; ?????? unsigned int len = 0; ?????? char *p; ?????? yyextra->data_buffer = malloc(yyextra->data_len+1); ?????? yyextra->data_buffer[0] = yyget_text(yyscanner)[0]; ?????? p = yyextra->data_buffer; ?????? p++; ?????? len++; ?????? while(len<yyextra->data_len&&(c=input(yyscanner))&&c!=EOF) { ????????????? *p = c; ????????????? p++; ????????????? len++; ?????? } ?????? if (c==EOF||len<yyextra->data_len) ????????????? yyterminate(); ?????? yyextra->data_buffer[len] = ' '; ? ?????? BEGIN S_FIELDVAL; } ? <S_FIELDVAL>{DELIM}]{DELIM}[,]? { ?????? struct stFieldInfo *fld = malloc(sizeof(struct stFieldInfo)); ?????? fld->name = yyextra->fld_name; ?????? fld->len = yyextra->data_len; ?????? fld->prop = yyextra->data_prop; ?????? fld->buffer = yyextra->data_buffer; ?????? fld->next = 0; ?????? add_field(yyextra,fld); ?????? ?????? BEGIN INITIAL; } . { ECHO; } ? %% ? int add_field(struct stWorkData *wkdata,struct stFieldInfo *fld) { ????????????? if (wkdata->field_list==0) { ???????????????????? wkdata->field_list = fld; ???????????????????? wkdata->last_field = fld; ???????????????????? return 0; ????????????? } ????????????? wkdata->last_field->next = fld; ????????????? wkdata->last_field = fld; ? ????????????? return 0;????????????? } ? int print_fld_list(struct stWorkData *wkdata) { ?????? int fld_num = 0; ?????? struct stFieldInfo *fld = wkdata->field_list; ?????? while(fld!=0) { ????????????? printf("name:%s,fld->buffer); ????????????? fld_num++; ? ????????????? fld = fld->next; ?????? } ?????? printf("field_num:%d.n",fld_num); ? ?????? return 0; } ? int main() { ??? yyscan_t scanner; ?????? struct stWorkData wkdata; ? ?????? char *str_input = "f123=[3,xxxxx]"; ? ?????? wkdata.data_len = 0; ?????? wkdata.data_prop = 0; ?????? wkdata.field_list = 0; ?????? wkdata.last_field = 0; ? ??? yylex_init ( &scanner ); ?????? yylex_init_extra( &wkdata,&scanner ); ?????? yy_scan_string(str_input,scanner); ? ??? yylex ( scanner ); ??? yylex_destroy ( scanner ); ? ?????? print_fld_list(&wkdata); ? ?????? getch(); ? ?????? return 0; } ? |