X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/e10d6e307623d0952f6e1f5d9fee8720ddab4808..8fcffcc668f4782447beb64a823cc15961cea9ab:/src/lexer.l diff --git a/src/lexer.l b/src/lexer.l index d896eb2..f3a0f2e 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -24,6 +24,7 @@ #include #include +#include "treefuncs.h" #include "parse.h" #include "main.h" #include "util.h" @@ -33,6 +34,10 @@ static int before_comment = INITIAL; static gboolean class_after_c = FALSE; static int code_type = CCODE; +/* GTK+ doc stuff */ +static char *gtk_doc_func = NULL; /* current gtk-doc func */ +GHashTable *gtk_doc_hash = NULL; + static GString *cbuf = NULL; int ccode_line = 1; @@ -46,9 +51,9 @@ static void clear_cbuf(void) { if(!cbuf) { - cbuf = g_string_new(""); + cbuf = g_string_new(NULL); } else { - cbuf = g_string_assign(cbuf,""); + cbuf = g_string_assign(cbuf, ""); } } @@ -62,6 +67,21 @@ add_to_cbuf(char *s) } } +static void +add_gtk_doc_func(void) +{ + if(!gtk_doc_func) + return; + + if(!gtk_doc_hash) + gtk_doc_hash = g_hash_table_new(g_str_hash, g_str_equal); + g_hash_table_insert(gtk_doc_hash, gtk_doc_func, g_strdup(cbuf->str)); + clear_cbuf(); + + gtk_doc_func = NULL; +} + + %} %x COMMENT @@ -69,12 +89,37 @@ add_to_cbuf(char *s) %x C_CODE_STRING %x CLASS_CODE %x CLASS_CODE_I +%x GTK_DOC_BEFORE_NAME +%x GTK_DOC +%x GTK_DOC_LINE + + %% <*>\n { line_no++; REJECT; } -<*>MOTHERFUCKER { fprintf(stderr,"You are a bad bad person!\n"); REJECT; } +^(I(S.RI).E\(([1-9][0-9]+|[2-9]))/(\)) { +/* Thy evil easter egg */ +#define QQ(x) long x +#define KK(x) =atoi(__(&,,x,)) +#define MM(x,a) {QQ(i);for(i=2;i^#[ \t]*include[ \t][<"][^\n">]*[>"] { @@ -94,6 +139,67 @@ add_to_cbuf(char *s) REJECT; } +\/\*\*[ \t]*$ { + /* eat out gtk doc stuff */ + BEGIN(GTK_DOC_BEFORE_NAME); + clear_cbuf(); + } +^[ \t]*\*[ \t]*$ { + /* empty doc lines */ + ; + } +^[ \t]*\*\ [_a-zA-Z][_a-zA-Z0-9]*:?[ \t]*$ { + char *p; + BEGIN(GTK_DOC); + p = strchr(yytext, '*'); + g_free(gtk_doc_func); + gtk_doc_func = g_strdup(p+2); + p = strchr(gtk_doc_func, ':'); + if(p) *p='\0'; + g_strstrip(gtk_doc_func); + } +\*\/ { + BEGIN(CLASS_CODE_I); + } +. { + BEGIN(COMMENT); + before_comment = CLASS_CODE_I; + } +^[ \t]*\*[ \t]*$ { + /* empty doc lines */ + add_to_cbuf(" *\n"); + } +^[ \t]*\*?\*\/ { + BEGIN(CLASS_CODE_I); + add_gtk_doc_func(); + } +^[ \t]*\*\ { + fflush(stdout); + add_to_cbuf(" * "); + BEGIN(GTK_DOC_LINE); + } +\*\/ { + BEGIN(CLASS_CODE_I); + } +. { + BEGIN(COMMENT); + before_comment = CLASS_CODE_I; + } +\*\/ { + BEGIN(CLASS_CODE_I); + add_to_cbuf("\n"); + add_gtk_doc_func(); + } +.$ { + BEGIN(GTK_DOC); + add_to_cbuf(yytext); + add_to_cbuf("\n"); + } +. { + fflush(stdout); + add_to_cbuf(yytext); + } + \/\/.*$ { add_to_cbuf(yytext); /*comment, ignore*/ } \/\/.*$ { ; /*comment, ignore*/ } \/\/.*$ { ; /*comment, ignore*/ } @@ -118,6 +224,23 @@ add_to_cbuf(char *s) if(before_comment == C_CODE) add_to_cbuf(yytext); } +^\%(a|all)\{ { + BEGIN(C_CODE); + parenth_depth = 1; + class_after_c = FALSE; + code_type = ACODE; + clear_cbuf(); + ccode_line = line_no; + } +^\%(at|alltop)\{ { + BEGIN(C_CODE); + parenth_depth = 1; + class_after_c = FALSE; + code_type = ATCODE; + clear_cbuf(); + ccode_line = line_no; + } + ^\%(ht|headertop)\{ { BEGIN(C_CODE); parenth_depth = 1; @@ -202,8 +325,16 @@ add_to_cbuf(char *s) \n { add_to_cbuf(yytext); } class { + static int found_classes = 0; look_for_includes = 2; BEGIN(CLASS_CODE); + + if(++found_classes > 1) { + print_error(FALSE, + "Only one class per file allowed", + line_no); + } + return CLASS; } @@ -226,7 +357,7 @@ class { "To upgrade your gob, see: " "http://www.5z.com/jirka/gob.html", maj,min,pl,VERSION); - print_error(FALSE,s, line_no); + print_error(FALSE, s, line_no); g_free(s); } } @@ -236,8 +367,8 @@ class { char *s; s = g_strdup_printf("'%s' keyword should not " "be used when generating " - "C++ code",yytext); - print_error(TRUE,s, line_no); + "C++ code", yytext); + print_error(TRUE, s, line_no); g_free(s); } REJECT; @@ -264,16 +395,22 @@ class { public {yylval.line = line_no; return PUBLIC;} private {yylval.line = line_no; return PRIVATE;} protected {yylval.line = line_no; return PROTECTED;} +classwide {yylval.line = line_no; return CLASSWIDE;} argument {yylval.line = line_no; return ARGUMENT;} virtual {yylval.line = line_no; return VIRTUAL;} signal {yylval.line = line_no; return SIGNAL;} override {yylval.line = line_no; return OVERRIDE;} -onerror {return ONERROR;} 0|[1-9][0-9]*|0x[0-9a-fA-F]+|0[0-7]+|[0-9]*\.[0-9]+|\.[0-9][0-9]* { yylval.id = g_strdup(yytext); return NUMBER; } -:?[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)+ { +[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)+ { + /* this one is for a classname with a namespace */ + yylval.id = g_strdup(yytext); + return TYPETOKEN; + } +:[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)* { + /* this is for a classname with an empty namespace */ yylval.id = g_strdup(yytext); return TYPETOKEN; } @@ -282,7 +419,7 @@ class { return TOKEN; } -(\[[0-9]*\])+ { +(\[[0-9]*\]|\[[A-Za-z_][A-Za-z0-9_]*\])+ { yylval.id = g_strdup(yytext); return ARRAY_DIM; }