X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2b1ea50ce582ef6c9cf41de8a9707669677b7a26..985077eeb363574eac7a04abc60805de44e95343:/src/gras/DataDesc/ddt_parse.yy.l diff --git a/src/gras/DataDesc/ddt_parse.yy.l b/src/gras/DataDesc/ddt_parse.yy.l index ee56c5476b..4a633eeea5 100644 --- a/src/gras/DataDesc/ddt_parse.yy.l +++ b/src/gras/DataDesc/ddt_parse.yy.l @@ -2,160 +2,119 @@ /* DataDesc/ddt_parse -- automatic parsing of data structures */ -/* Authors: Arnaud Legrand, Martin Quinson */ -/* Copyright (C) 2003, 2004 Martin Quinson. */ +/* Copyright (c) 2004 Arnaud Legrand, Martin Quinson. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it - under the terms of the license (GNU LGPL) which comes with this package. */ + * under the terms of the license (GNU LGPL) which comes with this package. */ %option noyywrap %{ -#include"DataDesc/datadesc_private.h" -#include"DataDesc/ddt_parse.yy.h" +#include "gras/DataDesc/datadesc_private.h" +#include "gras/DataDesc/ddt_parse.yy.h" #include - YY_BUFFER_STATE input_buffer; - FILE *file_to_parse; + YY_BUFFER_STATE gras_ddt_input_buffer; + FILE *gras_ddt_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; - GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(lexer,parse); -#define SHOW_WHERE DEBUG4("%d:%d (char #%d): seen %s", gras_ddt_parse_line_pos,gras_ddt_parse_col_pos,gras_ddt_parse_char_pos,yytext) + const char *definition; + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lexer,ddt_parse,"The crude internals of the lexer used for type parsing"); +#define SHOW_WHERE DEBUG4("%d:%d (char #%d): seen '%s'", gras_ddt_parse_line_pos,gras_ddt_parse_col_pos,gras_ddt_parse_char_pos,yytext) %} -%x comment foo str +%x annotate comment foo 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; + int comment_caller=0; + int annotate_caller=0; "//"[^\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++; +"/*g"{space}* { /****************** ANNOTATION ************************/ + DEBUG0("Begin annotation"); + annotate_caller = INITIAL; + gras_ddt_parse_char_pos+= strlen(yytext); + gras_ddt_parse_col_pos+= strlen(yytext); + BEGIN(annotate); +} +"/*g"{space}* { /* trim annotation */ + DEBUG0("Begin annotation"); + annotate_caller = foo; + gras_ddt_parse_char_pos+= strlen(yytext); + gras_ddt_parse_col_pos+= strlen(yytext); + BEGIN(annotate); } -"*"+"/" 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++; +{space}*"g*/" { + DEBUG0("End annotation"); + gras_ddt_parse_char_pos+= strlen(yytext); + gras_ddt_parse_col_pos+= strlen(yytext); + BEGIN(annotate_caller); } -\\t { - *string_buf_ptr++ = '\t'; - gras_ddt_parse_char_pos++; - gras_ddt_parse_col_pos++; + +"*/" { + PARSE_ERROR0("``/*g'' construct closed by a regular ``*/''"); } -\\r { - *string_buf_ptr++ = '\r'; - gras_ddt_parse_char_pos++; - gras_ddt_parse_col_pos++; +\n { + PARSE_ERROR0("Type annotation cannot spread over several lines"); } -\\b { - *string_buf_ptr++ = '\b'; - gras_ddt_parse_char_pos++; - gras_ddt_parse_col_pos++; + +.* { /* eat the rest */ + gras_ddt_parse_char_pos+= strlen(yytext); + gras_ddt_parse_col_pos+= strlen(yytext); + return GRAS_DDT_PARSE_TOKEN_ANNOTATE; } -\\f { - *string_buf_ptr++ = '\f'; - gras_ddt_parse_char_pos++; - gras_ddt_parse_col_pos++; + +"/*[^g]" { /****************** COMMENTS ************************/ + /* constructs like : */ + /*g [string] g*/ + /* are not comments but size annotations */ + comment_caller = INITIAL; + BEGIN(comment); } -\\(.|\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++; +"/*[^g]" { + comment_caller = foo; + BEGIN(comment); } -[^\\\n\"]+ { - char *yptr = yytext; - - while ( *yptr ) - *string_buf_ptr++ = *yptr++; +[^*\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++; - gras_ddt_parse_col_pos++; } - -({letter}|{digit})* { +"*"+"/" { gras_ddt_parse_char_pos+= strlen(yytext); gras_ddt_parse_col_pos+= strlen(yytext); + BEGIN(comment_caller); +} + +({letter}|{digit})* { /****************** STATEMENTS ************************/ + gras_ddt_parse_char_pos += strlen(yytext); + gras_ddt_parse_col_pos += strlen(yytext); + SHOW_WHERE; return(GRAS_DDT_PARSE_TOKEN_WORD); } "{" { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; SHOW_WHERE; - return(GRAS_DDT_PARSE_TOKEN_LP); + return(GRAS_DDT_PARSE_TOKEN_LA); } "}" { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; SHOW_WHERE; - return(GRAS_DDT_PARSE_TOKEN_RP); + return(GRAS_DDT_PARSE_TOKEN_RA); } "[" { gras_ddt_parse_char_pos++; @@ -169,6 +128,18 @@ digit [0-9] SHOW_WHERE; return(GRAS_DDT_PARSE_TOKEN_RB); } +"(" { + gras_ddt_parse_char_pos++; + gras_ddt_parse_col_pos++; + SHOW_WHERE; + return(GRAS_DDT_PARSE_TOKEN_LP); +} +")" { + gras_ddt_parse_char_pos++; + gras_ddt_parse_col_pos++; + SHOW_WHERE; + return(GRAS_DDT_PARSE_TOKEN_RP); +} "*" { gras_ddt_parse_char_pos++; gras_ddt_parse_col_pos++; @@ -203,11 +174,11 @@ digit [0-9] 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_LA : {printf("TOKEN_LA ");break;} + case GRAS_DDT_PARSE_TOKEN_RA : {printf("TOKEN_RA ");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_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;} @@ -218,14 +189,14 @@ void gras_ddt_parse_dump(void) { int gras_ddt_parse_lex_n_dump(void) { gras_ddt_parse_tok_num = gras_ddt_parse_lex(); - // gras_ddt_parse_char_pos += strlen(yytext); + /* 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_file_to_parse = fopen(file,"r"); + gras_ddt_input_buffer = yy_create_buffer( gras_ddt_file_to_parse, 10 ); + yy_switch_to_buffer(gras_ddt_input_buffer); gras_ddt_parse_line_pos = 1; gras_ddt_parse_char_pos = 0; @@ -234,8 +205,8 @@ void gras_ddt_parse_pointer_init(const char *file) { } void gras_ddt_parse_pointer_close(void) { - yy_delete_buffer(input_buffer); - fclose(file_to_parse); + yy_delete_buffer(gras_ddt_input_buffer); + fclose(gras_ddt_file_to_parse); gras_ddt_parse_line_pos = 1; gras_ddt_parse_char_pos = 0; @@ -244,8 +215,9 @@ void gras_ddt_parse_pointer_close(void) { 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_input_buffer = yy_scan_string (string_to_parse); + definition = string_to_parse; + yy_switch_to_buffer(gras_ddt_input_buffer); gras_ddt_parse_line_pos = 1; gras_ddt_parse_char_pos = 0; @@ -253,13 +225,16 @@ void gras_ddt_parse_pointer_string_init(const char *string_to_parse) { } void gras_ddt_parse_pointer_string_close(void) { - yy_delete_buffer(input_buffer); + yy_delete_buffer(gras_ddt_input_buffer); gras_ddt_parse_line_pos = 1; gras_ddt_parse_char_pos = 0; gras_ddt_parse_tok_num = 0; + + if (0) + yyunput('\0',NULL); /* fake a use of this function to calm gcc down */ } -// Local variables: -// mode: c -// End: +/* Local variables:*/ +/* mode: c */ +/* End: */