3 /* DataDesc/ddt_parse -- automatic parsing of data structures */
5 /* Copyright (c) 2004 Arnaud Legrand, Martin Quinson. All rights reserved. */
7 /* This program is free software; you can redistribute it and/or modify it
8 * under the terms of the license (GNU LGPL) which comes with this package. */
10 /* char string_buf[GRAS_DDT_PARSE_MAX_STR_CONST];
11 char *string_buf_ptr = NULL; FIXME; killme*/
15 #include "gras/DataDesc/datadesc_private.h"
16 #include "gras/DataDesc/ddt_parse.yy.h"
18 YY_BUFFER_STATE gras_ddt_input_buffer;
19 FILE *gras_ddt_file_to_parse;
21 int gras_ddt_parse_line_pos = 1;
22 int gras_ddt_parse_col_pos = 0;
23 int gras_ddt_parse_char_pos = 0;
24 int gras_ddt_parse_tok_num = 0;
25 const char *definition;
26 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lexer,ddt_parse,"The crude internals of the lexer used for type parsing");
27 #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)
30 %x annotate comment foo
37 int annotate_caller=0;
41 "/*g"{space}* { /****************** ANNOTATION ************************/
42 DEBUG0("Begin annotation");
43 annotate_caller = INITIAL;
44 gras_ddt_parse_char_pos+= strlen(yytext);
45 gras_ddt_parse_col_pos+= strlen(yytext);
48 <foo>"/*g"{space}* { /* trim annotation */
49 DEBUG0("Begin annotation");
50 annotate_caller = foo;
51 gras_ddt_parse_char_pos+= strlen(yytext);
52 gras_ddt_parse_col_pos+= strlen(yytext);
56 <annotate>{space}*"g*/" {
57 DEBUG0("End annotation");
58 gras_ddt_parse_char_pos+= strlen(yytext);
59 gras_ddt_parse_col_pos+= strlen(yytext);
60 BEGIN(annotate_caller);
64 PARSE_ERROR0("``/*g'' construct closed by a regular ``*/''");
67 PARSE_ERROR0("Type annotation cannot spread over several lines");
70 <annotate>.* { /* eat the rest */
71 gras_ddt_parse_char_pos+= strlen(yytext);
72 gras_ddt_parse_col_pos+= strlen(yytext);
73 return GRAS_DDT_PARSE_TOKEN_ANNOTATE;
76 "/*[^g]" { /****************** COMMENTS ************************/
77 /* constructs like : */
79 /* are not comments but size annotations */
80 comment_caller = INITIAL;
89 <comment>[^*\n]* { /* eat anything that's not a '*' */
91 <comment>"*"+[^*/\n]* { /* eat up '*'s not followed by '/'s */
94 ++gras_ddt_parse_line_pos;
95 gras_ddt_parse_col_pos=0;
96 gras_ddt_parse_char_pos++;
99 gras_ddt_parse_char_pos+= strlen(yytext);
100 gras_ddt_parse_col_pos+= strlen(yytext);
101 BEGIN(comment_caller);
104 ({letter}|{digit})* { /****************** STATEMENTS ************************/
105 gras_ddt_parse_char_pos += strlen(yytext);
106 gras_ddt_parse_col_pos += strlen(yytext);
108 return(GRAS_DDT_PARSE_TOKEN_WORD);
111 gras_ddt_parse_char_pos++;
112 gras_ddt_parse_col_pos++;
114 return(GRAS_DDT_PARSE_TOKEN_LA);
117 gras_ddt_parse_char_pos++;
118 gras_ddt_parse_col_pos++;
120 return(GRAS_DDT_PARSE_TOKEN_RA);
123 gras_ddt_parse_char_pos++;
124 gras_ddt_parse_col_pos++;
126 return(GRAS_DDT_PARSE_TOKEN_LB);
129 gras_ddt_parse_char_pos++;
130 gras_ddt_parse_col_pos++;
132 return(GRAS_DDT_PARSE_TOKEN_RB);
135 gras_ddt_parse_char_pos++;
136 gras_ddt_parse_col_pos++;
138 return(GRAS_DDT_PARSE_TOKEN_LP);
141 gras_ddt_parse_char_pos++;
142 gras_ddt_parse_col_pos++;
144 return(GRAS_DDT_PARSE_TOKEN_RP);
147 gras_ddt_parse_char_pos++;
148 gras_ddt_parse_col_pos++;
150 return(GRAS_DDT_PARSE_TOKEN_STAR);
153 gras_ddt_parse_char_pos++;
154 gras_ddt_parse_col_pos++;
156 return(GRAS_DDT_PARSE_TOKEN_SEMI_COLON);
159 gras_ddt_parse_char_pos++;
160 gras_ddt_parse_col_pos++;
162 return(GRAS_DDT_PARSE_TOKEN_COLON);
165 gras_ddt_parse_line_pos++;
166 gras_ddt_parse_char_pos++;
167 gras_ddt_parse_col_pos=0;
171 gras_ddt_parse_char_pos++;
172 gras_ddt_parse_col_pos++;
176 /* {space}+ { return(TOKEN_SPACE);} */
178 void gras_ddt_parse_dump(void) {
179 switch(gras_ddt_parse_tok_num) {
180 case GRAS_DDT_PARSE_TOKEN_LA : {printf("TOKEN_LA ");break;}
181 case GRAS_DDT_PARSE_TOKEN_RA : {printf("TOKEN_RA ");break;}
182 case GRAS_DDT_PARSE_TOKEN_WORD : {printf("TOKEN_WORD ");break;}
183 /* case GRAS_DDT_PARSE_TOKEN_SPACE : {printf("TOKEN_SPACE ");break;}*/
184 /* case GRAS_DDT_PARSE_TOKEN_COMMENT : {printf("TOKEN_COMMENT ");break;}*/
185 case GRAS_DDT_PARSE_TOKEN_NEWLINE : {printf("TOKEN_NEWLINE\n");return;}
186 case GRAS_DDT_PARSE_TOKEN_EMPTY : {printf("TOKEN_EMPTY\n");return;}
187 default : {printf("Unknown token %d\n", gras_ddt_parse_tok_num);return;}
189 printf("-->%s<-- [line %d, pos %d]\n",yytext,gras_ddt_parse_line_pos,gras_ddt_parse_char_pos);
193 int gras_ddt_parse_lex_n_dump(void) {
194 gras_ddt_parse_tok_num = gras_ddt_parse_lex();
195 /* gras_ddt_parse_char_pos += strlen(yytext);*/
196 return(gras_ddt_parse_tok_num);
199 void gras_ddt_parse_pointer_init(const char *file) {
200 gras_ddt_file_to_parse = fopen(file,"r");
201 gras_ddt_input_buffer = yy_create_buffer( gras_ddt_file_to_parse, 10 );
202 yy_switch_to_buffer(gras_ddt_input_buffer);
204 gras_ddt_parse_line_pos = 1;
205 gras_ddt_parse_char_pos = 0;
206 gras_ddt_parse_col_pos = 0;
207 gras_ddt_parse_tok_num = 0;
210 void gras_ddt_parse_pointer_close(void) {
211 yy_delete_buffer(gras_ddt_input_buffer);
212 fclose(gras_ddt_file_to_parse);
214 gras_ddt_parse_line_pos = 1;
215 gras_ddt_parse_char_pos = 0;
216 gras_ddt_parse_tok_num = 0;
220 void gras_ddt_parse_pointer_string_init(const char *string_to_parse) {
221 gras_ddt_input_buffer = yy_scan_string (string_to_parse);
222 definition = string_to_parse;
223 yy_switch_to_buffer(gras_ddt_input_buffer);
225 gras_ddt_parse_line_pos = 1;
226 gras_ddt_parse_char_pos = 0;
227 gras_ddt_parse_tok_num = 0;
230 void gras_ddt_parse_pointer_string_close(void) {
231 yy_delete_buffer(gras_ddt_input_buffer);
233 gras_ddt_parse_line_pos = 1;
234 gras_ddt_parse_char_pos = 0;
235 gras_ddt_parse_tok_num = 0;
238 yyunput('\0',NULL); /* fake a use of this function to calm gcc down */
241 /* Local variables:*/