Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
ee56c5476b820fb91ecbb8bcd1e4f1a655f7926c
[simgrid.git] / src / gras / DataDesc / ddt_parse.yy.l
1 /* $Id$ */
2
3 /* DataDesc/ddt_parse -- automatic parsing of data structures */
4
5 /* Authors: Arnaud Legrand, Martin Quinson            */
6 /* Copyright (C) 2003, 2004 Martin Quinson.                                 */
7
8 /* This program is free software; you can redistribute it and/or modify it
9    under the terms of the license (GNU LGPL) which comes with this package. */
10
11 %option noyywrap
12 %{
13 #include"DataDesc/datadesc_private.h"
14 #include"DataDesc/ddt_parse.yy.h"
15 #include <string.h>
16   YY_BUFFER_STATE input_buffer;
17   FILE *file_to_parse;
18
19   int gras_ddt_parse_line_pos = 1;
20   int gras_ddt_parse_col_pos = 0;
21   int gras_ddt_parse_char_pos = 0;
22   int gras_ddt_parse_tok_num = 0;
23   GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(lexer,parse);
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 comment foo str
28 space           [ \t]
29 letter          [A-Za-z._-]
30 digit           [0-9]
31
32 %%
33         int comment_caller=0;
34
35         char string_buf[GRAS_DDT_PARSE_MAX_STR_CONST];
36         char *string_buf_ptr = NULL;
37
38 "//"[^\n]*
39 "/*"         {
40              comment_caller = INITIAL;
41              BEGIN(comment);
42              }
43
44 <foo>"/*"    {
45              comment_caller = foo;
46              BEGIN(comment);
47              }
48
49 <comment>[^*\n]*        /* eat anything that's not a '*' */
50 <comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
51 <comment>\n             {
52   ++gras_ddt_parse_line_pos;
53   gras_ddt_parse_col_pos=0;
54   gras_ddt_parse_char_pos++;
55 }
56 <comment>"*"+"/"        BEGIN(comment_caller);
57
58 \"      string_buf_ptr = string_buf; gras_ddt_parse_char_pos++;gras_ddt_parse_col_pos++; BEGIN(str);
59
60 <str>\"        { /* saw closing quote - all done */
61         BEGIN(INITIAL);
62         *string_buf_ptr = '\0';
63         yytext=string_buf;
64         gras_ddt_parse_char_pos++;
65         gras_ddt_parse_col_pos++;
66         return GRAS_DDT_PARSE_TOKEN_WORD;
67         /* return string constant token type and
68          * value to parser
69          */
70         }
71
72 <str>\n        {
73         /* error - unterminated string constant */
74         /* generate error message */
75         }
76
77 <str>\\[0-7]{1,3} {
78         /* octal escape sequence */
79         int result;
80
81         (void) sscanf( yytext + 1, "%o", &result );
82
83         if ( result > 0xff )
84                 /* error, constant is out-of-bounds */
85
86         *string_buf_ptr++ = result;
87         gras_ddt_parse_char_pos++;
88         gras_ddt_parse_col_pos++;
89         }
90
91 <str>\\[0-9]+ {
92         /* generate error - bad escape sequence; something
93          * like '\48' or '\0777777'
94          */
95         }
96
97 <str>\\n  {
98   *string_buf_ptr++ = '\n';
99   gras_ddt_parse_char_pos++;
100   gras_ddt_parse_col_pos++;
101 }
102 <str>\\t  {
103   *string_buf_ptr++ = '\t';     
104   gras_ddt_parse_char_pos++;
105   gras_ddt_parse_col_pos++;
106 }
107 <str>\\r  {
108   *string_buf_ptr++ = '\r';     
109   gras_ddt_parse_char_pos++;
110   gras_ddt_parse_col_pos++;
111 }
112 <str>\\b  {
113   *string_buf_ptr++ = '\b';     
114   gras_ddt_parse_char_pos++;
115   gras_ddt_parse_col_pos++;
116 }
117 <str>\\f  {
118   *string_buf_ptr++ = '\f';
119   gras_ddt_parse_char_pos++;
120   gras_ddt_parse_col_pos++;
121 }
122
123 <str>\\(.|\n)  {
124   *string_buf_ptr++ = yytext[1];        
125   if(yytext[1]=='\n') {
126     ++gras_ddt_parse_line_pos;
127     gras_ddt_parse_col_pos=0;
128   } else {
129     gras_ddt_parse_col_pos++;
130   }
131   gras_ddt_parse_char_pos++;
132 }
133
134 <str>[^\\\n\"]+  {
135   char *yptr = yytext;
136   
137   while ( *yptr )
138     *string_buf_ptr++ = *yptr++;
139   gras_ddt_parse_char_pos++;
140   gras_ddt_parse_col_pos++;
141 }
142
143 ({letter}|{digit})* { 
144   gras_ddt_parse_char_pos+= strlen(yytext);
145   gras_ddt_parse_col_pos+= strlen(yytext);
146   return(GRAS_DDT_PARSE_TOKEN_WORD);
147 }
148 "{"  { 
149   gras_ddt_parse_char_pos++; 
150   gras_ddt_parse_col_pos++; 
151   SHOW_WHERE;
152   return(GRAS_DDT_PARSE_TOKEN_LP);
153 }
154 "}" {
155   gras_ddt_parse_char_pos++;
156   gras_ddt_parse_col_pos++;
157   SHOW_WHERE;
158   return(GRAS_DDT_PARSE_TOKEN_RP);
159 }
160 "["  { 
161   gras_ddt_parse_char_pos++; 
162   gras_ddt_parse_col_pos++; 
163   SHOW_WHERE;
164   return(GRAS_DDT_PARSE_TOKEN_LB);
165 }
166 "]" {
167   gras_ddt_parse_char_pos++;
168   gras_ddt_parse_col_pos++;
169   SHOW_WHERE;
170   return(GRAS_DDT_PARSE_TOKEN_RB);
171 }
172 "*" {
173   gras_ddt_parse_char_pos++;
174   gras_ddt_parse_col_pos++;
175   SHOW_WHERE;
176   return(GRAS_DDT_PARSE_TOKEN_STAR);
177 }
178 ";" {
179   gras_ddt_parse_char_pos++;
180   gras_ddt_parse_col_pos++;
181   SHOW_WHERE;
182   return(GRAS_DDT_PARSE_TOKEN_SEMI_COLON);
183 }
184 "," { 
185   gras_ddt_parse_char_pos++;
186   gras_ddt_parse_col_pos++;
187   SHOW_WHERE;
188   return(GRAS_DDT_PARSE_TOKEN_COLON);
189 }
190 "\n" {
191  gras_ddt_parse_line_pos++; 
192  gras_ddt_parse_char_pos++;
193  gras_ddt_parse_col_pos=0;
194   SHOW_WHERE;
195 }
196 . { 
197   gras_ddt_parse_char_pos++;
198   gras_ddt_parse_col_pos++;
199   SHOW_WHERE;
200 }
201 %%
202 /* {space}+                { return(TOKEN_SPACE);} */
203
204 void gras_ddt_parse_dump(void) {
205   switch(gras_ddt_parse_tok_num) {
206   case GRAS_DDT_PARSE_TOKEN_LP      : {printf("TOKEN_LP ");break;}
207   case GRAS_DDT_PARSE_TOKEN_RP      : {printf("TOKEN_RP ");break;}
208   case GRAS_DDT_PARSE_TOKEN_WORD    : {printf("TOKEN_WORD ");break;}
209     //  case GRAS_DDT_PARSE_TOKEN_SPACE   : {printf("TOKEN_SPACE ");break;}
210     //  case GRAS_DDT_PARSE_TOKEN_COMMENT : {printf("TOKEN_COMMENT ");break;}
211   case GRAS_DDT_PARSE_TOKEN_NEWLINE : {printf("TOKEN_NEWLINE\n");return;}
212   case GRAS_DDT_PARSE_TOKEN_EMPTY : {printf("TOKEN_EMPTY\n");return;}
213   default             : {printf("Unknown token %d\n", gras_ddt_parse_tok_num);return;}
214   }
215   printf("-->%s<-- [line %d, pos %d]\n",yytext,gras_ddt_parse_line_pos,gras_ddt_parse_char_pos);
216   return;
217 }
218
219 int gras_ddt_parse_lex_n_dump(void) {
220   gras_ddt_parse_tok_num = gras_ddt_parse_lex();
221   //  gras_ddt_parse_char_pos += strlen(yytext);
222   return(gras_ddt_parse_tok_num);
223 }
224
225 void  gras_ddt_parse_pointer_init(const char *file) {
226   file_to_parse = fopen(file,"r");
227   input_buffer = yy_create_buffer( file_to_parse, 10 );
228   yy_switch_to_buffer(input_buffer);
229
230   gras_ddt_parse_line_pos = 1;
231   gras_ddt_parse_char_pos = 0;
232   gras_ddt_parse_col_pos = 0;
233   gras_ddt_parse_tok_num = 0;
234 }
235
236 void  gras_ddt_parse_pointer_close(void) {
237   yy_delete_buffer(input_buffer);
238   fclose(file_to_parse);
239
240   gras_ddt_parse_line_pos = 1;
241   gras_ddt_parse_char_pos = 0;
242   gras_ddt_parse_tok_num = 0;
243 }
244
245
246 void  gras_ddt_parse_pointer_string_init(const char *string_to_parse) {
247   input_buffer = yy_scan_string (string_to_parse);
248   yy_switch_to_buffer(input_buffer);
249
250   gras_ddt_parse_line_pos = 1;
251   gras_ddt_parse_char_pos = 0;
252   gras_ddt_parse_tok_num = 0;
253 }
254
255 void  gras_ddt_parse_pointer_string_close(void) {
256   yy_delete_buffer(input_buffer);
257
258   gras_ddt_parse_line_pos = 1;
259   gras_ddt_parse_char_pos = 0;
260   gras_ddt_parse_tok_num = 0;
261 }
262
263 // Local variables:
264 // mode: c
265 // End: