3 /* DataDesc/ddt_parse -- automatic parsing of data structures */
5 /* Authors: Arnaud Legrand, Martin Quinson */
6 /* Copyright (C) 2003, 2004 Martin Quinson. */
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. */
13 #include"DataDesc/datadesc_private.h"
14 #include"DataDesc/ddt_parse.yy.h"
16 YY_BUFFER_STATE input_buffer;
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)
35 char string_buf[GRAS_DDT_PARSE_MAX_STR_CONST];
36 char *string_buf_ptr = NULL;
40 comment_caller = INITIAL;
49 <comment>[^*\n]* /* eat anything that's not a '*' */
50 <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
52 ++gras_ddt_parse_line_pos;
53 gras_ddt_parse_col_pos=0;
54 gras_ddt_parse_char_pos++;
56 <comment>"*"+"/" BEGIN(comment_caller);
58 \" string_buf_ptr = string_buf; gras_ddt_parse_char_pos++;gras_ddt_parse_col_pos++; BEGIN(str);
60 <str>\" { /* saw closing quote - all done */
62 *string_buf_ptr = '\0';
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
73 /* error - unterminated string constant */
74 /* generate error message */
78 /* octal escape sequence */
81 (void) sscanf( yytext + 1, "%o", &result );
84 /* error, constant is out-of-bounds */
86 *string_buf_ptr++ = result;
87 gras_ddt_parse_char_pos++;
88 gras_ddt_parse_col_pos++;
92 /* generate error - bad escape sequence; something
93 * like '\48' or '\0777777'
98 *string_buf_ptr++ = '\n';
99 gras_ddt_parse_char_pos++;
100 gras_ddt_parse_col_pos++;
103 *string_buf_ptr++ = '\t';
104 gras_ddt_parse_char_pos++;
105 gras_ddt_parse_col_pos++;
108 *string_buf_ptr++ = '\r';
109 gras_ddt_parse_char_pos++;
110 gras_ddt_parse_col_pos++;
113 *string_buf_ptr++ = '\b';
114 gras_ddt_parse_char_pos++;
115 gras_ddt_parse_col_pos++;
118 *string_buf_ptr++ = '\f';
119 gras_ddt_parse_char_pos++;
120 gras_ddt_parse_col_pos++;
124 *string_buf_ptr++ = yytext[1];
125 if(yytext[1]=='\n') {
126 ++gras_ddt_parse_line_pos;
127 gras_ddt_parse_col_pos=0;
129 gras_ddt_parse_col_pos++;
131 gras_ddt_parse_char_pos++;
138 *string_buf_ptr++ = *yptr++;
139 gras_ddt_parse_char_pos++;
140 gras_ddt_parse_col_pos++;
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);
149 gras_ddt_parse_char_pos++;
150 gras_ddt_parse_col_pos++;
152 return(GRAS_DDT_PARSE_TOKEN_LP);
155 gras_ddt_parse_char_pos++;
156 gras_ddt_parse_col_pos++;
158 return(GRAS_DDT_PARSE_TOKEN_RP);
161 gras_ddt_parse_char_pos++;
162 gras_ddt_parse_col_pos++;
164 return(GRAS_DDT_PARSE_TOKEN_LB);
167 gras_ddt_parse_char_pos++;
168 gras_ddt_parse_col_pos++;
170 return(GRAS_DDT_PARSE_TOKEN_RB);
173 gras_ddt_parse_char_pos++;
174 gras_ddt_parse_col_pos++;
176 return(GRAS_DDT_PARSE_TOKEN_STAR);
179 gras_ddt_parse_char_pos++;
180 gras_ddt_parse_col_pos++;
182 return(GRAS_DDT_PARSE_TOKEN_SEMI_COLON);
185 gras_ddt_parse_char_pos++;
186 gras_ddt_parse_col_pos++;
188 return(GRAS_DDT_PARSE_TOKEN_COLON);
191 gras_ddt_parse_line_pos++;
192 gras_ddt_parse_char_pos++;
193 gras_ddt_parse_col_pos=0;
197 gras_ddt_parse_char_pos++;
198 gras_ddt_parse_col_pos++;
202 /* {space}+ { return(TOKEN_SPACE);} */
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;}
215 printf("-->%s<-- [line %d, pos %d]\n",yytext,gras_ddt_parse_line_pos,gras_ddt_parse_char_pos);
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);
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);
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;
236 void gras_ddt_parse_pointer_close(void) {
237 yy_delete_buffer(input_buffer);
238 fclose(file_to_parse);
240 gras_ddt_parse_line_pos = 1;
241 gras_ddt_parse_char_pos = 0;
242 gras_ddt_parse_tok_num = 0;
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);
250 gras_ddt_parse_line_pos = 1;
251 gras_ddt_parse_char_pos = 0;
252 gras_ddt_parse_tok_num = 0;
255 void gras_ddt_parse_pointer_string_close(void) {
256 yy_delete_buffer(input_buffer);
258 gras_ddt_parse_line_pos = 1;
259 gras_ddt_parse_char_pos = 0;
260 gras_ddt_parse_tok_num = 0;