/**** MSG_LICENCE DO NOT REMOVE ****/ %option noyywrap %{ #include"DataDesc/datadesc_private.h" #include"DataDesc/ddt_parse.yy.h" #include YY_BUFFER_STATE input_buffer; FILE *file_to_parse; int gras_ddt_parse_line_pos = 1; int gras_ddt_parse_col_pos = 0; int gras_ddt_parse_char_pos = 0; int gras_ddt_parse_tok_num = 0; %} %x comment foo str space [ \t] letter [A-Za-z._-] digit [0-9] %% int comment_caller=0; char string_buf[GRAS_DDT_PARSE_MAX_STR_CONST]; char *string_buf_ptr = NULL; "//"[^\n]* "/*" { comment_caller = INITIAL; BEGIN(comment); } "/*" { comment_caller = foo; BEGIN(comment); } [^*\n]* /* eat anything that's not a '*' */ "*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ \n { ++gras_ddt_parse_line_pos; gras_ddt_parse_col_pos=0; gras_ddt_parse_char_pos++; } "*"+"/" BEGIN(comment_caller); \" string_buf_ptr = string_buf; gras_ddt_parse_char_pos++;gras_ddt_parse_col_pos++; BEGIN(str); \" { /* saw closing quote - all done */ BEGIN(INITIAL); *string_buf_ptr = '\0'; yytext=string_buf; gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; return GRAS_DDT_PARSE_TOKEN_WORD; /* return string constant token type and * value to parser */ } \n { /* error - unterminated string constant */ /* generate error message */ } \\[0-7]{1,3} { /* octal escape sequence */ int result; (void) sscanf( yytext + 1, "%o", &result ); if ( result > 0xff ) /* error, constant is out-of-bounds */ *string_buf_ptr++ = result; gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; } \\[0-9]+ { /* generate error - bad escape sequence; something * like '\48' or '\0777777' */ } \\n { *string_buf_ptr++ = '\n'; gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; } \\t { *string_buf_ptr++ = '\t'; gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; } \\r { *string_buf_ptr++ = '\r'; gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; } \\b { *string_buf_ptr++ = '\b'; gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; } \\f { *string_buf_ptr++ = '\f'; gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; } \\(.|\n) { *string_buf_ptr++ = yytext[1]; if(yytext[1]=='\n') { ++gras_ddt_parse_line_pos; gras_ddt_parse_col_pos=0; } else { gras_ddt_parse_col_pos++; } gras_ddt_parse_char_pos++; } [^\\\n\"]+ { char *yptr = yytext; while ( *yptr ) *string_buf_ptr++ = *yptr++; gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; } ({letter}|{digit})* { gras_ddt_parse_char_pos+= strlen(yytext); gras_ddt_parse_col_pos+= strlen(yytext); return(GRAS_DDT_PARSE_TOKEN_WORD); } "{" { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; return(GRAS_DDT_PARSE_TOKEN_LP); } "}" { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; return(GRAS_DDT_PARSE_TOKEN_RP); } "[" { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; return(GRAS_DDT_PARSE_TOKEN_LB); } "]" { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; return(GRAS_DDT_PARSE_TOKEN_RB); } "*" { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; return(GRAS_DDT_PARSE_TOKEN_STAR); } ";" { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; return(GRAS_DDT_PARSE_TOKEN_SEMI_COLON); } "," { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; return(GRAS_DDT_PARSE_TOKEN_COLON); } "\n" { gras_ddt_parse_line_pos++; gras_ddt_parse_char_pos=0; gras_ddt_parse_col_pos++; } . { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; } %% /* {space}+ { return(TOKEN_SPACE);} */ void gras_ddt_parse_dump(void) { switch(gras_ddt_parse_tok_num) { case GRAS_DDT_PARSE_TOKEN_LP : {printf("TOKEN_LP ");break;} case GRAS_DDT_PARSE_TOKEN_RP : {printf("TOKEN_RP ");break;} case GRAS_DDT_PARSE_TOKEN_WORD : {printf("TOKEN_WORD ");break;} // case GRAS_DDT_PARSE_TOKEN_SPACE : {printf("TOKEN_SPACE ");break;} // case GRAS_DDT_PARSE_TOKEN_COMMENT : {printf("TOKEN_COMMENT ");break;} case GRAS_DDT_PARSE_TOKEN_NEWLINE : {printf("TOKEN_NEWLINE\n");return;} case GRAS_DDT_PARSE_TOKEN_EMPTY : {printf("TOKEN_EMPTY\n");return;} default : {printf("Unknown token %d\n", gras_ddt_parse_tok_num);return;} } printf("-->%s<-- [line %d, pos %d]\n",yytext,gras_ddt_parse_line_pos,gras_ddt_parse_char_pos); return; } int gras_ddt_parse_lex_n_dump(void) { gras_ddt_parse_tok_num = gras_ddt_parse_lex(); // gras_ddt_parse_char_pos += strlen(yytext); return(gras_ddt_parse_tok_num); } void gras_ddt_parse_pointer_init(const char *file) { file_to_parse = fopen(file,"r"); input_buffer = yy_create_buffer( file_to_parse, 10 ); yy_switch_to_buffer(input_buffer); gras_ddt_parse_line_pos = 1; gras_ddt_parse_char_pos = 0; gras_ddt_parse_col_pos = 0; gras_ddt_parse_tok_num = 0; } void gras_ddt_parse_pointer_close(void) { yy_delete_buffer(input_buffer); fclose(file_to_parse); gras_ddt_parse_line_pos = 1; gras_ddt_parse_char_pos = 0; gras_ddt_parse_tok_num = 0; } void gras_ddt_parse_pointer_string_init(const char *string_to_parse) { input_buffer = yy_scan_string (string_to_parse); yy_switch_to_buffer(input_buffer); gras_ddt_parse_line_pos = 1; gras_ddt_parse_char_pos = 0; gras_ddt_parse_tok_num = 0; } void gras_ddt_parse_pointer_string_close(void) { yy_delete_buffer(input_buffer); gras_ddt_parse_line_pos = 1; gras_ddt_parse_char_pos = 0; gras_ddt_parse_tok_num = 0; } // Local variables: // mode: c // End: