Logo AND Algorithmique Numérique Distribuée

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