From: helly Date: Thu, 19 Apr 2007 01:08:03 +0000 (+0000) Subject: - Improve names for condition jump table and condition state variable X-Git-Tag: 0.13.6~194 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1857562584e08f42a74ac33c46af584738e27162;p=re2c - Improve names for condition jump table and condition state variable - Add first working test (as it uses -g it only works with newer gcc) --- diff --git a/re2c/code.cc b/re2c/code.cc index 3be5d3f6..45b85432 100644 --- a/re2c/code.cc +++ b/re2c/code.cc @@ -1666,7 +1666,7 @@ void genCondTable(std::ostream &o, uint ind, const RegExpMap* specMap) { if (cFlag && !bWroteCondCheck && gFlag) { - o << indent(ind++) << "static void *" << mapCodeName["yycond"] << "[" << specMap->size() << "] = {\n"; + o << indent(ind++) << "static void *" << mapCodeName["yyctable"] << "[" << specMap->size() << "] = {\n"; for(RegExpMap::const_iterator it = specMap->begin(); it != specMap->end(); ++it) { @@ -1682,11 +1682,11 @@ void genCondGoto(std::ostream &o, uint ind, const RegExpMap* specMap) { if (gFlag) { - o << indent(ind) << "goto *" << mapCodeName["yycond"] << "[" << mapCodeName["YYCOND"] << "];\n"; + o << indent(ind) << "goto *" << mapCodeName["yyctable"] << "[" << mapCodeName["YYCONDITION"] << "];\n"; } else { - o << indent(ind) << "switch(" << mapCodeName["YYCOND"] << ") {\n"; + o << indent(ind) << "switch(" << mapCodeName["YYCONDITION"] << ") {\n"; for(RegExpMap::const_iterator it = specMap->begin(); it != specMap->end(); ++it) { o << indent(ind) << "case " << it->first << ": goto " << condPrefix << it->first << ";\n"; @@ -1780,7 +1780,9 @@ void Scanner::config(const Str& cfg, const Str& val) mapVariableKeys.insert("variable:yyaccept"); mapVariableKeys.insert("variable:yybm"); mapVariableKeys.insert("variable:yych"); + mapVariableKeys.insert("variable:yyctable"); mapVariableKeys.insert("variable:yytarget"); + mapDefineKeys.insert("define:YYCONDITION"); mapDefineKeys.insert("define:YYCTXMARKER"); mapDefineKeys.insert("define:YYCTYPE"); mapDefineKeys.insert("define:YYCURSOR"); diff --git a/re2c/test/condition_01.c.c b/re2c/test/condition_01.c.c index b3f1d214..0343dfaf 100755 --- a/re2c/test/condition_01.c.c +++ b/re2c/test/condition_01.c.c @@ -4,7 +4,7 @@ #line 5 "" { YYCTYPE yych; - switch(YYCOND) { + switch(YYCONDITION) { case a: goto yyc_a; case b: goto yyc_b; } diff --git a/re2c/test/condition_02.c.c b/re2c/test/condition_02.c.c index 8d8a1db2..7644fbcf 100755 --- a/re2c/test/condition_02.c.c +++ b/re2c/test/condition_02.c.c @@ -4,7 +4,7 @@ #line 5 "" { YYCTYPE yych; - switch(YYCOND) { + switch(YYCONDITION) { case 0: goto yyc_0; case r1: goto yyc_r1; case r2: goto yyc_r2; diff --git a/re2c/test/condition_02.cg.c b/re2c/test/condition_02.cg.c index da0d59e3..dfb1816f 100755 --- a/re2c/test/condition_02.cg.c +++ b/re2c/test/condition_02.cg.c @@ -4,12 +4,12 @@ #line 5 "" { YYCTYPE yych; - static void *yycond[3] = { + static void *yyctable[3] = { &&yyc_0, &&yyc_r1, &&yyc_r2, }; - goto *yycond[YYCOND]; + goto *yyctable[YYCONDITION]; /* *********************************** */ yyc_0: diff --git a/re2c/test/condition_03.cg.c b/re2c/test/condition_03.cg.c index e4775425..76a0da7e 100755 --- a/re2c/test/condition_03.cg.c +++ b/re2c/test/condition_03.cg.c @@ -4,12 +4,12 @@ #line 5 "" { YYCTYPE yych; - static void *yycond[3] = { + static void *yyctable[3] = { &&yyc_0, &&yyc_r1, &&yyc_r2, }; - goto *yycond[YYCOND]; + goto *yyctable[YYCONDITION]; /* *********************************** */ yyc_0: diff --git a/re2c/test/condition_04.cg.c b/re2c/test/condition_04.cg.c index da1b8ce2..b996a8d1 100755 --- a/re2c/test/condition_04.cg.c +++ b/re2c/test/condition_04.cg.c @@ -4,11 +4,11 @@ #line 5 "" { YYCTYPE yych; - static void *yycond[2] = { + static void *yyctable[2] = { &&yyc_r1, &&yyc_r2, }; - goto *yycond[YYCOND]; + goto *yyctable[YYCONDITION]; /* *********************************** */ yyc_r1: diff --git a/re2c/test/condition_05.cg.c b/re2c/test/condition_05.cg.c new file mode 100755 index 00000000..162e3c3a --- /dev/null +++ b/re2c/test/condition_05.cg.c @@ -0,0 +1,150 @@ +/* Generated by re2c */ +#line 1 "condition_05.cg.re" +#include +#include +#include + +#define BSIZE 8192 + +typedef struct Scanner +{ + FILE *fp; + unsigned char *cur, *tok, *lim, *eof; + unsigned char buffer[BSIZE]; +} Scanner; + +int fill(Scanner *s, int len) +{ + if (!len) + { + s->cur = s->tok = s->lim = s->buffer; + s->eof = 0; + } + if (!s->eof) + { + int got, cnt = s->tok - s->buffer; + + if (cnt > 0) + { + memcpy(s->buffer, s->tok, s->lim - s->tok); + s->tok -= cnt; + s->cur -= cnt; + s->lim -= cnt; + } + cnt = BSIZE - cnt; + if ((got = fread(s->lim, 1, cnt, s->fp)) != cnt) + { + s->eof = &s->lim[got]; + } + s->lim += got; + } + else if (s->cur + len > s->eof) + { + return 0; /* not enough input data */ + } + return -1; +} + +char scan(Scanner *s) +{ + int state = 1; + + fill(s, 0); + + for(;;) + { + s->tok = s->cur; + +#line 59 "" +{ + unsigned char yych; + static void *yyctable[2] = { + &&yyc_comment, + &&yyc_normal, + }; + goto *yyctable[state]; +/* *********************************** */ +yyc_comment: + + if((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; }; + yych = *s->cur; + if(yych != '*') goto yy4; + ++s->cur; + if((yych = *s->cur) == '/') goto yy5; +yy3: +#line 79 "condition_05.cg.re" + { + goto yyc_comment; + } +#line 80 "" +yy4: + yych = *++s->cur; + goto yy3; +yy5: + ++s->cur; +#line 75 "condition_05.cg.re" + { + continue; + } +#line 90 "" +/* *********************************** */ +yyc_normal: + if((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; }; + yych = *s->cur; + if(yych != '/') goto yy11; + ++s->cur; + if((yych = *s->cur) == '*') goto yy12; +yy10: +#line 70 "condition_05.cg.re" + { + fputc(*s->tok, stdout); + continue; + } +#line 104 "" +yy11: + yych = *++s->cur; + goto yy10; +yy12: + ++s->cur; +#line 66 "condition_05.cg.re" + { + goto yyc_comment; + } +#line 114 "" +} +#line 83 "condition_05.cg.re" + + } +} + +int main(int argc, char **argv) +{ + Scanner in; + char c; + + if (argc != 2) + { + fprintf(stderr, "%s \n", argv[0]); + return 1;; + } + + memset((char*) &in, 0, sizeof(in)); + + if (!strcmp(argv[1], "-")) + { + in.fp = stdin; + } + else if ((in.fp = fopen(argv[1], "r")) == NULL) + { + fprintf(stderr, "Cannot open file '%s'\n", argv[1]); + return 1; + } + + scan(&in); + + if (in.fp != stdin) + { + fclose(in.fp); + } + return 0; +} diff --git a/re2c/test/condition_05.cg.re b/re2c/test/condition_05.cg.re new file mode 100755 index 00000000..32db8d5b --- /dev/null +++ b/re2c/test/condition_05.cg.re @@ -0,0 +1,117 @@ +#include +#include +#include + +#define BSIZE 8192 + +typedef struct Scanner +{ + FILE *fp; + unsigned char *cur, *tok, *lim, *eof; + unsigned char buffer[BSIZE]; +} Scanner; + +int fill(Scanner *s, int len) +{ + if (!len) + { + s->cur = s->tok = s->lim = s->buffer; + s->eof = 0; + } + if (!s->eof) + { + int got, cnt = s->tok - s->buffer; + + if (cnt > 0) + { + memcpy(s->buffer, s->tok, s->lim - s->tok); + s->tok -= cnt; + s->cur -= cnt; + s->lim -= cnt; + } + cnt = BSIZE - cnt; + if ((got = fread(s->lim, 1, cnt, s->fp)) != cnt) + { + s->eof = &s->lim[got]; + } + s->lim += got; + } + else if (s->cur + len > s->eof) + { + return 0; /* not enough input data */ + } + return -1; +} + +char scan(Scanner *s) +{ + int state = 1; + + fill(s, 0); + + for(;;) + { + s->tok = s->cur; +/*!re2c + +re2c:define:YYCTYPE = "unsigned char"; +re2c:define:YYCURSOR = s->cur; +re2c:define:YYLIMIT = s->lim; +re2c:define:YYMARKER = s->ptr; +re2c:define:YYFILL = "{ if(fill(s, 2) >= 0) break; }"; +re2c:define:YYCONDITION = state; +re2c:yyfill:parameter = 0; + + "/*" + { + goto yyc_comment; + } + [^] + { + fputc(*s->tok, stdout); + continue; + } + "*" "/" + { + continue; + } + [^] + { + goto yyc_comment; + } + +*/ + } +} + +int main(int argc, char **argv) +{ + Scanner in; + char c; + + if (argc != 2) + { + fprintf(stderr, "%s \n", argv[0]); + return 1;; + } + + memset((char*) &in, 0, sizeof(in)); + + if (!strcmp(argv[1], "-")) + { + in.fp = stdin; + } + else if ((in.fp = fopen(argv[1], "r")) == NULL) + { + fprintf(stderr, "Cannot open file '%s'\n", argv[1]); + return 1; + } + + scan(&in); + + if (in.fp != stdin) + { + fclose(in.fp); + } + return 0; +}