-/**** MSG_LICENCE DO NOT REMOVE ****/
+/* $Id$ */
+
+/* DataDesc/ddt_parse -- automatic parsing of data structures */
+
+/* Authors: Arnaud Legrand, Martin Quinson */
+/* Copyright (C) 2003, 2004 Martin Quinson. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ under the terms of the license (GNU LGPL) which comes with this package. */
%option noyywrap
%{
-#include"DataDesc/datadesc_private.h"
-#include"DataDesc/ddt_parse.yy.h"
+#include "gras/DataDesc/datadesc_private.h"
+#include "gras/DataDesc/ddt_parse.yy.h"
#include <string.h>
YY_BUFFER_STATE input_buffer;
FILE *file_to_parse;
int gras_ddt_parse_col_pos = 0;
int gras_ddt_parse_char_pos = 0;
int gras_ddt_parse_tok_num = 0;
+ const char *definition;
+ GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(lexer,ddt_parse,"The crude internals of the lexer used for type parsing");
+#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)
%}
-%x comment foo str
+%x annotate comment foo
space [ \t]
letter [A-Za-z._-]
digit [0-9]
%%
- int comment_caller=0;
+ int comment_caller=0;
+ int annotate_caller=0;
- char string_buf[GRAS_DDT_PARSE_MAX_STR_CONST];
- char *string_buf_ptr = NULL;
+ char string_buf[GRAS_DDT_PARSE_MAX_STR_CONST];
+ char *string_buf_ptr = NULL;
"//"[^\n]*
-"/*" {
- comment_caller = INITIAL;
- BEGIN(comment);
- }
-
-<foo>"/*" {
- comment_caller = foo;
- BEGIN(comment);
- }
-
-<comment>[^*\n]* /* eat anything that's not a '*' */
-<comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
-<comment>\n {
- ++gras_ddt_parse_line_pos;
- gras_ddt_parse_col_pos=0;
- gras_ddt_parse_char_pos++;
+
+"/*g"{space}* { /****************** ANNOTATION ************************/
+ DEBUG0("Begin annotation");
+ annotate_caller = INITIAL;
+ gras_ddt_parse_char_pos+= strlen(yytext);
+ gras_ddt_parse_col_pos+= strlen(yytext);
+ BEGIN(annotate);
}
-<comment>"*"+"/" BEGIN(comment_caller);
-
-\" string_buf_ptr = string_buf; gras_ddt_parse_char_pos++;gras_ddt_parse_col_pos++; BEGIN(str);
-
-<str>\" { /* saw closing quote - all done */
- BEGIN(INITIAL);
- *string_buf_ptr = '\0';
- yytext=string_buf;
- gras_ddt_parse_char_pos++;
- gras_ddt_parse_col_pos++;
- return GRAS_DDT_PARSE_TOKEN_WORD;
- /* return string constant token type and
- * value to parser
- */
- }
-
-<str>\n {
- /* error - unterminated string constant */
- /* generate error message */
- }
-
-<str>\\[0-7]{1,3} {
- /* octal escape sequence */
- int result;
-
- (void) sscanf( yytext + 1, "%o", &result );
-
- if ( result > 0xff )
- /* error, constant is out-of-bounds */
-
- *string_buf_ptr++ = result;
- gras_ddt_parse_char_pos++;
- gras_ddt_parse_col_pos++;
- }
-
-<str>\\[0-9]+ {
- /* generate error - bad escape sequence; something
- * like '\48' or '\0777777'
- */
- }
-
-<str>\\n {
- *string_buf_ptr++ = '\n';
- gras_ddt_parse_char_pos++;
- gras_ddt_parse_col_pos++;
+<foo>"/*g"{space}* { /* trim annotation */
+ DEBUG0("Begin annotation");
+ annotate_caller = foo;
+ gras_ddt_parse_char_pos+= strlen(yytext);
+ gras_ddt_parse_col_pos+= strlen(yytext);
+ BEGIN(annotate);
}
-<str>\\t {
- *string_buf_ptr++ = '\t';
- gras_ddt_parse_char_pos++;
- gras_ddt_parse_col_pos++;
+
+<annotate>{space}*"g*/" {
+ DEBUG0("End annotation");
+ gras_ddt_parse_char_pos+= strlen(yytext);
+ gras_ddt_parse_col_pos+= strlen(yytext);
+ BEGIN(annotate_caller);
}
-<str>\\r {
- *string_buf_ptr++ = '\r';
- gras_ddt_parse_char_pos++;
- gras_ddt_parse_col_pos++;
+
+<annotate>"*/" {
+ PARSE_ERROR0("``/*g'' construct closed by a regular ``*/''");
}
-<str>\\b {
- *string_buf_ptr++ = '\b';
- gras_ddt_parse_char_pos++;
- gras_ddt_parse_col_pos++;
+<annotate>\n {
+ PARSE_ERROR0("Type annotation cannot spread over several lines");
}
-<str>\\f {
- *string_buf_ptr++ = '\f';
- gras_ddt_parse_char_pos++;
- gras_ddt_parse_col_pos++;
+
+<annotate>.* { /* eat the rest */
+ gras_ddt_parse_char_pos+= strlen(yytext);
+ gras_ddt_parse_col_pos+= strlen(yytext);
+ return GRAS_DDT_PARSE_TOKEN_ANNOTATE;
}
-<str>\\(.|\n) {
- *string_buf_ptr++ = yytext[1];
- if(yytext[1]=='\n') {
- ++gras_ddt_parse_line_pos;
- gras_ddt_parse_col_pos=0;
- } else {
- gras_ddt_parse_col_pos++;
- }
- gras_ddt_parse_char_pos++;
+"/*[^g]" { /****************** COMMENTS ************************/
+ /* constructs like : */
+ /*g [string] g*/
+ /* are not comments but size annotations */
+ comment_caller = INITIAL;
+ BEGIN(comment);
}
-<str>[^\\\n\"]+ {
- char *yptr = yytext;
-
- while ( *yptr )
- *string_buf_ptr++ = *yptr++;
- gras_ddt_parse_char_pos++;
- gras_ddt_parse_col_pos++;
+<foo>"/*[^g]" {
+ comment_caller = foo;
+ BEGIN(comment);
}
-({letter}|{digit})* {
+<comment>[^*\n]* { /* eat anything that's not a '*' */
+}
+<comment>"*"+[^*/\n]* { /* eat up '*'s not followed by '/'s */
+}
+<comment>\n {
+ ++gras_ddt_parse_line_pos;
+ gras_ddt_parse_col_pos=0;
+ gras_ddt_parse_char_pos++;
+}
+<comment>"*"+"/" {
gras_ddt_parse_char_pos+= strlen(yytext);
gras_ddt_parse_col_pos+= strlen(yytext);
+ BEGIN(comment_caller);
+}
+
+({letter}|{digit})* { /****************** STATEMENTS ************************/
+ gras_ddt_parse_char_pos += strlen(yytext);
+ gras_ddt_parse_col_pos += strlen(yytext);
+ SHOW_WHERE;
return(GRAS_DDT_PARSE_TOKEN_WORD);
}
"{" {
gras_ddt_parse_char_pos++;
gras_ddt_parse_col_pos++;
- return(GRAS_DDT_PARSE_TOKEN_LP);
+ SHOW_WHERE;
+ return(GRAS_DDT_PARSE_TOKEN_LA);
}
"}" {
gras_ddt_parse_char_pos++;
gras_ddt_parse_col_pos++;
- return(GRAS_DDT_PARSE_TOKEN_RP);
+ SHOW_WHERE;
+ return(GRAS_DDT_PARSE_TOKEN_RA);
}
"[" {
gras_ddt_parse_char_pos++;
gras_ddt_parse_col_pos++;
+ SHOW_WHERE;
return(GRAS_DDT_PARSE_TOKEN_LB);
}
"]" {
gras_ddt_parse_char_pos++;
gras_ddt_parse_col_pos++;
+ SHOW_WHERE;
return(GRAS_DDT_PARSE_TOKEN_RB);
}
+"(" {
+ gras_ddt_parse_char_pos++;
+ gras_ddt_parse_col_pos++;
+ SHOW_WHERE;
+ return(GRAS_DDT_PARSE_TOKEN_LP);
+}
+")" {
+ gras_ddt_parse_char_pos++;
+ gras_ddt_parse_col_pos++;
+ SHOW_WHERE;
+ return(GRAS_DDT_PARSE_TOKEN_RP);
+}
"*" {
gras_ddt_parse_char_pos++;
gras_ddt_parse_col_pos++;
+ SHOW_WHERE;
return(GRAS_DDT_PARSE_TOKEN_STAR);
}
";" {
gras_ddt_parse_char_pos++;
gras_ddt_parse_col_pos++;
+ SHOW_WHERE;
return(GRAS_DDT_PARSE_TOKEN_SEMI_COLON);
}
"," {
gras_ddt_parse_char_pos++;
gras_ddt_parse_col_pos++;
+ SHOW_WHERE;
return(GRAS_DDT_PARSE_TOKEN_COLON);
}
"\n" {
gras_ddt_parse_line_pos++;
- gras_ddt_parse_char_pos=0;
- gras_ddt_parse_col_pos++;
+ gras_ddt_parse_char_pos++;
+ gras_ddt_parse_col_pos=0;
+ SHOW_WHERE;
}
. {
gras_ddt_parse_char_pos++;
gras_ddt_parse_col_pos++;
+ SHOW_WHERE;
}
%%
/* {space}+ { return(TOKEN_SPACE);} */
void gras_ddt_parse_dump(void) {
switch(gras_ddt_parse_tok_num) {
- case GRAS_DDT_PARSE_TOKEN_LP : {printf("TOKEN_LP ");break;}
- case GRAS_DDT_PARSE_TOKEN_RP : {printf("TOKEN_RP ");break;}
+ case GRAS_DDT_PARSE_TOKEN_LA : {printf("TOKEN_LA ");break;}
+ case GRAS_DDT_PARSE_TOKEN_RA : {printf("TOKEN_RA ");break;}
case GRAS_DDT_PARSE_TOKEN_WORD : {printf("TOKEN_WORD ");break;}
- // case GRAS_DDT_PARSE_TOKEN_SPACE : {printf("TOKEN_SPACE ");break;}
- // case GRAS_DDT_PARSE_TOKEN_COMMENT : {printf("TOKEN_COMMENT ");break;}
+ /* case GRAS_DDT_PARSE_TOKEN_SPACE : {printf("TOKEN_SPACE ");break;}*/
+ /* case GRAS_DDT_PARSE_TOKEN_COMMENT : {printf("TOKEN_COMMENT ");break;}*/
case GRAS_DDT_PARSE_TOKEN_NEWLINE : {printf("TOKEN_NEWLINE\n");return;}
case GRAS_DDT_PARSE_TOKEN_EMPTY : {printf("TOKEN_EMPTY\n");return;}
default : {printf("Unknown token %d\n", gras_ddt_parse_tok_num);return;}
int gras_ddt_parse_lex_n_dump(void) {
gras_ddt_parse_tok_num = gras_ddt_parse_lex();
- // gras_ddt_parse_char_pos += strlen(yytext);
+ /* gras_ddt_parse_char_pos += strlen(yytext);*/
return(gras_ddt_parse_tok_num);
}
void gras_ddt_parse_pointer_string_init(const char *string_to_parse) {
input_buffer = yy_scan_string (string_to_parse);
+ definition = string_to_parse;
yy_switch_to_buffer(input_buffer);
gras_ddt_parse_line_pos = 1;
gras_ddt_parse_tok_num = 0;
}
-// Local variables:
-// mode: c
-// End:
+/* Local variables:*/
+/* mode: c */
+/* End: */