Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Some work to get it ansi compliant, still much to doo
[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 "gras/DataDesc/datadesc_private.h"
14 #include "gras/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   const char *definition;
24   GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(lexer,ddt_parse,"The crude internals of the lexer used for type parsing");
25 #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)
26 %}
27
28 %x annotate comment foo
29 space           [ \t]
30 letter          [A-Za-z._-]
31 digit           [0-9]
32
33 %%
34    int comment_caller=0;
35    int annotate_caller=0;
36
37    char string_buf[GRAS_DDT_PARSE_MAX_STR_CONST];
38    char *string_buf_ptr = NULL;
39
40 "//"[^\n]*
41
42 "/*g"{space}* { /****************** ANNOTATION ************************/
43   DEBUG0("Begin annotation");
44   annotate_caller = INITIAL;
45   gras_ddt_parse_char_pos+= strlen(yytext);
46   gras_ddt_parse_col_pos+= strlen(yytext);
47   BEGIN(annotate);
48 }
49 <foo>"/*g"{space}* { /* trim annotation */
50   DEBUG0("Begin annotation");
51   annotate_caller = foo;
52   gras_ddt_parse_char_pos+= strlen(yytext);
53   gras_ddt_parse_col_pos+= strlen(yytext);
54   BEGIN(annotate);
55 }
56
57 <annotate>{space}*"g*/" {
58   DEBUG0("End annotation");
59   gras_ddt_parse_char_pos+= strlen(yytext);
60   gras_ddt_parse_col_pos+= strlen(yytext);
61   BEGIN(annotate_caller);
62 }
63
64 <annotate>"*/" {
65   PARSE_ERROR0("``/*g'' construct closed by a regular ``*/''");
66 }
67 <annotate>\n  {
68   PARSE_ERROR0("Type annotation cannot spread over several lines");
69 }
70
71 <annotate>.* { /* eat the rest */
72   gras_ddt_parse_char_pos+= strlen(yytext);
73   gras_ddt_parse_col_pos+= strlen(yytext);
74   return GRAS_DDT_PARSE_TOKEN_ANNOTATE;
75 }
76
77 "/*[^g]"   { /****************** COMMENTS ************************/
78   /* constructs like : */
79     /*g [string] g*/ 
80   /* are not comments but size annotations */
81   comment_caller = INITIAL;
82   BEGIN(comment);
83 }
84
85 <foo>"/*[^g]"    {
86   comment_caller = foo;
87   BEGIN(comment);
88 }
89
90 <comment>[^*\n]*      { /* eat anything that's not a '*' */
91 }
92 <comment>"*"+[^*/\n]* { /* eat up '*'s not followed by '/'s */
93 }
94 <comment>\n             {
95   ++gras_ddt_parse_line_pos;
96   gras_ddt_parse_col_pos=0;
97   gras_ddt_parse_char_pos++;
98 }
99 <comment>"*"+"/" {
100   gras_ddt_parse_char_pos+= strlen(yytext);
101   gras_ddt_parse_col_pos+= strlen(yytext);
102   BEGIN(comment_caller);
103 }
104
105 ({letter}|{digit})* {  /****************** STATEMENTS ************************/
106   gras_ddt_parse_char_pos += strlen(yytext);
107   gras_ddt_parse_col_pos += strlen(yytext);
108   SHOW_WHERE;
109   return(GRAS_DDT_PARSE_TOKEN_WORD);
110 }
111 "{"  { 
112   gras_ddt_parse_char_pos++; 
113   gras_ddt_parse_col_pos++; 
114   SHOW_WHERE;
115   return(GRAS_DDT_PARSE_TOKEN_LA);
116 }
117 "}" {
118   gras_ddt_parse_char_pos++;
119   gras_ddt_parse_col_pos++;
120   SHOW_WHERE;
121   return(GRAS_DDT_PARSE_TOKEN_RA);
122 }
123 "["  { 
124   gras_ddt_parse_char_pos++; 
125   gras_ddt_parse_col_pos++; 
126   SHOW_WHERE;
127   return(GRAS_DDT_PARSE_TOKEN_LB);
128 }
129 "]" {
130   gras_ddt_parse_char_pos++;
131   gras_ddt_parse_col_pos++;
132   SHOW_WHERE;
133   return(GRAS_DDT_PARSE_TOKEN_RB);
134 }
135 "("  { 
136   gras_ddt_parse_char_pos++; 
137   gras_ddt_parse_col_pos++; 
138   SHOW_WHERE;
139   return(GRAS_DDT_PARSE_TOKEN_LP);
140 }
141 ")" {
142   gras_ddt_parse_char_pos++;
143   gras_ddt_parse_col_pos++;
144   SHOW_WHERE;
145   return(GRAS_DDT_PARSE_TOKEN_RP);
146 }
147 "*" {
148   gras_ddt_parse_char_pos++;
149   gras_ddt_parse_col_pos++;
150   SHOW_WHERE;
151   return(GRAS_DDT_PARSE_TOKEN_STAR);
152 }
153 ";" {
154   gras_ddt_parse_char_pos++;
155   gras_ddt_parse_col_pos++;
156   SHOW_WHERE;
157   return(GRAS_DDT_PARSE_TOKEN_SEMI_COLON);
158 }
159 "," { 
160   gras_ddt_parse_char_pos++;
161   gras_ddt_parse_col_pos++;
162   SHOW_WHERE;
163   return(GRAS_DDT_PARSE_TOKEN_COLON);
164 }
165 "\n" {
166  gras_ddt_parse_line_pos++; 
167  gras_ddt_parse_char_pos++;
168  gras_ddt_parse_col_pos=0;
169   SHOW_WHERE;
170 }
171 . { 
172   gras_ddt_parse_char_pos++;
173   gras_ddt_parse_col_pos++;
174   SHOW_WHERE;
175 }
176 %%
177 /* {space}+                { return(TOKEN_SPACE);} */
178
179 void gras_ddt_parse_dump(void) {
180   switch(gras_ddt_parse_tok_num) {
181   case GRAS_DDT_PARSE_TOKEN_LA      : {printf("TOKEN_LA ");break;}
182   case GRAS_DDT_PARSE_TOKEN_RA      : {printf("TOKEN_RA ");break;}
183   case GRAS_DDT_PARSE_TOKEN_WORD    : {printf("TOKEN_WORD ");break;}
184     /*  case GRAS_DDT_PARSE_TOKEN_SPACE   : {printf("TOKEN_SPACE ");break;}*/
185     /*  case GRAS_DDT_PARSE_TOKEN_COMMENT : {printf("TOKEN_COMMENT ");break;}*/
186   case GRAS_DDT_PARSE_TOKEN_NEWLINE : {printf("TOKEN_NEWLINE\n");return;}
187   case GRAS_DDT_PARSE_TOKEN_EMPTY : {printf("TOKEN_EMPTY\n");return;}
188   default             : {printf("Unknown token %d\n", gras_ddt_parse_tok_num);return;}
189   }
190   printf("-->%s<-- [line %d, pos %d]\n",yytext,gras_ddt_parse_line_pos,gras_ddt_parse_char_pos);
191   return;
192 }
193
194 int gras_ddt_parse_lex_n_dump(void) {
195   gras_ddt_parse_tok_num = gras_ddt_parse_lex();
196   /*  gras_ddt_parse_char_pos += strlen(yytext);*/
197   return(gras_ddt_parse_tok_num);
198 }
199
200 void  gras_ddt_parse_pointer_init(const char *file) {
201   file_to_parse = fopen(file,"r");
202   input_buffer = yy_create_buffer( file_to_parse, 10 );
203   yy_switch_to_buffer(input_buffer);
204
205   gras_ddt_parse_line_pos = 1;
206   gras_ddt_parse_char_pos = 0;
207   gras_ddt_parse_col_pos = 0;
208   gras_ddt_parse_tok_num = 0;
209 }
210
211 void  gras_ddt_parse_pointer_close(void) {
212   yy_delete_buffer(input_buffer);
213   fclose(file_to_parse);
214
215   gras_ddt_parse_line_pos = 1;
216   gras_ddt_parse_char_pos = 0;
217   gras_ddt_parse_tok_num = 0;
218 }
219
220
221 void  gras_ddt_parse_pointer_string_init(const char *string_to_parse) {
222   input_buffer = yy_scan_string (string_to_parse);
223   definition = string_to_parse;
224   yy_switch_to_buffer(input_buffer);
225
226   gras_ddt_parse_line_pos = 1;
227   gras_ddt_parse_char_pos = 0;
228   gras_ddt_parse_tok_num = 0;
229 }
230
231 void  gras_ddt_parse_pointer_string_close(void) {
232   yy_delete_buffer(input_buffer);
233
234   gras_ddt_parse_line_pos = 1;
235   gras_ddt_parse_char_pos = 0;
236   gras_ddt_parse_tok_num = 0;
237 }
238
239 /* Local variables:*/
240 /* mode: c */
241 /* End: */