]> git.draconx.ca Git - gob-dx.git/blobdiff - src/lexer.l
Release 2.0.15
[gob-dx.git] / src / lexer.l
index b48e818d030e0dc5ba3c88a88b023deda9f6d7bc..b3b2d596c3fde0348f0ae55534c88e8bdab2d78f 100644 (file)
 %{
 
 #include "config.h"
-#include <glib.h>
+#include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
+#include <glib.h>
 
 #include "treefuncs.h"
 #include "parse.h"
@@ -103,6 +104,7 @@ int yylex(void);
 %x C_CODE
 %x CODE_STRING
 %x CLASS_CODE
+%x CLASS_STRING
 %x CLASS_CODE_I
 %x PROPERTY_CODE
 %x PROPERTY_CODE_I
@@ -195,9 +197,11 @@ REJECT;
                file++;
                p = strchr(file,'"');
                if(!p) p = strchr(file,'>');
-               *p = '\0';
-               include_files = g_list_prepend(include_files,g_strdup(file));
-               g_free(str);
+               if (p != NULL) {
+                       *p = '\0';
+                       include_files = g_list_prepend(include_files,g_strdup(file));
+                       g_free(str);
+               }
        }
        REJECT;
 }
@@ -472,6 +476,22 @@ flags              { return FLAGS; }
                }
 
 <CLASS_CODE>from       {return FROM;}
+<CLASS_CODE>\" {
+                       BEGIN(CLASS_STRING);
+                       before_string = CLASS_CODE;
+                       add_to_cbuf(yytext);
+               }
+<CLASS_STRING>\\.      { add_to_cbuf(yytext); }
+<CLASS_STRING>\"       {
+                       BEGIN(before_string);
+                       add_to_cbuf(yytext);
+                       yylval.id = cbuf->str;
+                       g_string_free (cbuf, FALSE);
+                       cbuf = NULL;
+                       return STRING;
+               }
+<CLASS_STRING>.        { add_to_cbuf(yytext); }
+<CLASS_STRING>\n       { add_to_cbuf(yytext); }
 
 <CLASS_CODE_I,PROPERTY_CODE_I>void     {return VOID;}
 <CLASS_CODE_I,PROPERTY_CODE_I>struct   {return STRUCT;}
@@ -547,12 +567,12 @@ flags             { return FLAGS; }
                                REJECT;
                        }
                }
-<CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I,INITIAL>[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)+ {
+<CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I,INITIAL>[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z_][A-Za-z0-9_]*)+        {
                        /* this one is for a classname with a namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
                }
-<CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I,INITIAL>:[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)*        {
+<CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I,INITIAL>:[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z_][A-Za-z0-9_]*)*       {
                        /* this is for a classname with an empty namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
@@ -570,12 +590,16 @@ flags             { return FLAGS; }
                        yylval.id = g_strdup(yytext);
                        return ARRAY_DIM;
                }
-
+<CLASS_CODE_I>:[0-9]+ {
+                       /* cheat for bitfield */
+                       yylval.id = g_strdup(yytext);
+                       return ARRAY_DIM;
+               }
 <CLASS_CODE>\{ {
                        BEGIN(CLASS_CODE_I);
                        return '{';
                }
-<CLASS_CODE_I>\{       {
+<CLASS_CODE_I,PROPERTY_CODE>\{ {
                        BEGIN(C_CODE);
                        parenth_depth=1;
                        class_after_c = TRUE;
@@ -598,4 +622,13 @@ flags              { return FLAGS; }
 
 <*>[\n\r]      ;  /*ignore*/
 
+^[ \t]*prealloc[ \t]+[0-9]+[ \t]*$ {
+                       char *p;
+                       int t;
+                       p = strchr (yytext,'p');
+                       g_assert (p); /* we MUST have found it */
+                       sscanf (p, "prealloc %d", &t);
+                       prealloc=t;
+               }
+
 %%