Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
34447b8e0c790c92100919f7c0630fc99410158e
[simgrid.git] / src / gras / DataDesc / ddt_parse.yy.l
1 /* $Id$ */
2
3 /* DataDesc/ddt_parse -- automatic parsing of data structures */
4
5 /* Copyright (c) 2004 Arnaud Legrand, Martin Quinson. All rights reserved.  */
6
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. */
9
10 %option noyywrap
11 %{
12 #include "gras/DataDesc/datadesc_private.h"
13 #include "gras/DataDesc/ddt_parse.yy.h"
14 #include <string.h>
15   YY_BUFFER_STATE input_buffer;
16   FILE *file_to_parse;
17
18   int gras_ddt_parse_line_pos = 1;
19   int gras_ddt_parse_col_pos = 0;
20   int gras_ddt_parse_char_pos = 0;
21   int gras_ddt_parse_tok_num = 0;
22   const char *definition;
23   XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lexer,ddt_parse,"The crude internals of the lexer used for type parsing");
24 #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)
25 %}
26
27 %x annotate comment foo
28 space           [ \t]
29 letter          [A-Za-z._-]
30 digit           [0-9]
31
32 %%
33    int comment_caller=0;
34    int annotate_caller=0;
35
36    char string_buf[GRAS_DDT_PARSE_MAX_STR_CONST];
37    char *string_buf_ptr = NULL;
38
39 "//"[^\n]*
40
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);
46   BEGIN(annotate);
47 }
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);
53   BEGIN(annotate);
54 }
55
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);
61 }
62
63 <annotate>"*/" {
64   PARSE_ERROR0("``/*g'' construct closed by a regular ``*/''");
65 }
66 <annotate>\n  {
67   PARSE_ERROR0("Type annotation cannot spread over several lines");
68 }
69
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;
74 }
75
76 "/*[^g]"   { /****************** COMMENTS ************************/
77   /* constructs like : */
78     /*g [string] g*/ 
79   /* are not comments but size annotations */
80   comment_caller = INITIAL;
81   BEGIN(comment);
82 }
83
84 <foo>"/*[^g]"    {
85   comment_caller = foo;
86   BEGIN(comment);
87 }
88
89 <comment>[^*\n]*      { /* eat anything that's not a '*' */
90 }
91 <comment>"*"+[^*/\n]* { /* eat up '*'s not followed by '/'s */
92 }
93 <comment>\n             {
94   ++gras_ddt_parse_line_pos;
95   gras_ddt_parse_col_pos=0;
96   gras_ddt_parse_char_pos++;
97 }
98 <comment>"*"+"/" {
99   gras_ddt_parse_char_pos+= strlen(yytext);
100   gras_ddt_parse_col_pos+= strlen(yytext);
101   BEGIN(comment_caller);
102 }
103
104 ({letter}|{digit})* {  /****************** STATEMENTS ************************/
105   gras_ddt_parse_char_pos += strlen(yytext);
106   gras_ddt_parse_col_pos += strlen(yytext);
107   SHOW_WHERE;
108   return(GRAS_DDT_PARSE_TOKEN_WORD);
109 }
110 "{"  { 
111   gras_ddt_parse_char_pos++; 
112   gras_ddt_parse_col_pos++; 
113   SHOW_WHERE;
114   return(GRAS_DDT_PARSE_TOKEN_LA);
115 }
116 "}" {
117   gras_ddt_parse_char_pos++;
118   gras_ddt_parse_col_pos++;
119   SHOW_WHERE;
120   return(GRAS_DDT_PARSE_TOKEN_RA);
121 }
122 "["  { 
123   gras_ddt_parse_char_pos++; 
124   gras_ddt_parse_col_pos++; 
125   SHOW_WHERE;
126   return(GRAS_DDT_PARSE_TOKEN_LB);
127 }
128 "]" {
129   gras_ddt_parse_char_pos++;
130   gras_ddt_parse_col_pos++;
131   SHOW_WHERE;
132   return(GRAS_DDT_PARSE_TOKEN_RB);
133 }
134 "("  { 
135   gras_ddt_parse_char_pos++; 
136   gras_ddt_parse_col_pos++; 
137   SHOW_WHERE;
138   return(GRAS_DDT_PARSE_TOKEN_LP);
139 }
140 ")" {
141   gras_ddt_parse_char_pos++;
142   gras_ddt_parse_col_pos++;
143   SHOW_WHERE;
144   return(GRAS_DDT_PARSE_TOKEN_RP);
145 }
146 "*" {
147   gras_ddt_parse_char_pos++;
148   gras_ddt_parse_col_pos++;
149   SHOW_WHERE;
150   return(GRAS_DDT_PARSE_TOKEN_STAR);
151 }
152 ";" {
153   gras_ddt_parse_char_pos++;
154   gras_ddt_parse_col_pos++;
155   SHOW_WHERE;
156   return(GRAS_DDT_PARSE_TOKEN_SEMI_COLON);
157 }
158 "," { 
159   gras_ddt_parse_char_pos++;
160   gras_ddt_parse_col_pos++;
161   SHOW_WHERE;
162   return(GRAS_DDT_PARSE_TOKEN_COLON);
163 }
164 "\n" {
165  gras_ddt_parse_line_pos++; 
166  gras_ddt_parse_char_pos++;
167  gras_ddt_parse_col_pos=0;
168   SHOW_WHERE;
169 }
170 . { 
171   gras_ddt_parse_char_pos++;
172   gras_ddt_parse_col_pos++;
173   SHOW_WHERE;
174 }
175 %%
176 /* {space}+                { return(TOKEN_SPACE);} */
177
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;}
188   }
189   printf("-->%s<-- [line %d, pos %d]\n",yytext,gras_ddt_parse_line_pos,gras_ddt_parse_char_pos);
190   return;
191 }
192
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);
197 }
198
199 void  gras_ddt_parse_pointer_init(const char *file) {
200   file_to_parse = fopen(file,"r");
201   input_buffer = yy_create_buffer( file_to_parse, 10 );
202   yy_switch_to_buffer(input_buffer);
203
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;
208 }
209
210 void  gras_ddt_parse_pointer_close(void) {
211   yy_delete_buffer(input_buffer);
212   fclose(file_to_parse);
213
214   gras_ddt_parse_line_pos = 1;
215   gras_ddt_parse_char_pos = 0;
216   gras_ddt_parse_tok_num = 0;
217 }
218
219
220 void  gras_ddt_parse_pointer_string_init(const char *string_to_parse) {
221   input_buffer = yy_scan_string (string_to_parse);
222   definition = string_to_parse;
223   yy_switch_to_buffer(input_buffer);
224
225   gras_ddt_parse_line_pos = 1;
226   gras_ddt_parse_char_pos = 0;
227   gras_ddt_parse_tok_num = 0;
228 }
229
230 void  gras_ddt_parse_pointer_string_close(void) {
231   yy_delete_buffer(input_buffer);
232
233   gras_ddt_parse_line_pos = 1;
234   gras_ddt_parse_char_pos = 0;
235   gras_ddt_parse_tok_num = 0;
236 }
237
238 /* Local variables:*/
239 /* mode: c */
240 /* End: */