]> granicus.if.org Git - re2c/commitdiff
Integrated in bug fixes from yasm. 1. Fix detection of EOF in the re2c scanner....
authornuffer <nuffer@642ea486-5414-0410-9d7f-a0204ed87703>
Mon, 12 Jan 2004 04:36:00 +0000 (04:36 +0000)
committernuffer <nuffer@642ea486-5414-0410-9d7f-a0204ed87703>
Mon, 12 Jan 2004 04:36:00 +0000 (04:36 +0000)
13 files changed:
Makefile
code.cc
dfa.cc
globals.h
main.cc
parser.cc
parser.h
parser.tab.h [new file with mode: 0644]
parser.y
scanner.cc
substr.cc
version.h [new file with mode: 0644]
y.tab.h

index b392b0f5fc813c29d8ff034db36cfcbceb9c50ce..78683496e33cdb178b122c5fbe115705c4e23431 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,9 @@
 # $Log$
-# Revision 1.1  2003/12/13 04:58:19  nuffer
-# Initial revision
+# Revision 1.2  2004/01/12 04:36:00  nuffer
+# Integrated in bug fixes from yasm.  1. Fix detection of EOF in the re2c scanner.  2. Correctly output #line directives so that debugging the generated output is possible.
+#
+# Revision 1.1.1.1  2003/12/13 04:58:19  nuffer
+# Initial import
 #
 #Revision 1.1  1994/04/08  16:30:37  peter
 #Initial revision
@@ -14,7 +17,7 @@ MAN = /usr/local/man
 %.cc : %.l ; $(LEX)   $(LFLAGS) $<; mv $(LEXYY).c $@
 
 %.cc:  %.re
-       re2c -s $< >$@
+       ./re2c -s $< >$@
 
 SOURCES        = code.cc dfa.cc main.cc parser.y actions.cc scanner.re substr.cc\
        translate.cc
@@ -32,8 +35,8 @@ clean:
        rm -f *.o *.s y.tab.c y.tab.h scanner.cc parser.cc .version version.h re2c
 
 parser.cc:     parser.y
-       yacc -d parser.y
-       mv -f y.tab.c parser.cc
+       bison -d parser.y
+       mv -f parser.tab.c parser.cc
 
 re2c:  $(OBJS)
        $(CC) -o $@ $(OBJS) $(LDFLAGS) -lstdc++
diff --git a/code.cc b/code.cc
index 8aaf6a8864dbe343f39f4ffc4f2e40eb791e32b2..8cd93727433d3e822d39b4a74985da4767fd228a 100644 (file)
--- a/code.cc
+++ b/code.cc
@@ -5,6 +5,7 @@
 #include "substr.h"
 #include "globals.h"
 #include "dfa.h"
+#include "parser.h"
 
 // there must be at least one span in list;  all spans must cover
 // same range
@@ -130,11 +131,12 @@ void BitMap::gen(ostream &o, uint lb, uint ub){
                doGen(b->go, b->on, bm-lb, m);
            }
            for(uint j = 0; j < n; ++j){
-               if(j%8 == 0) o << "\n\t";
+               if(j%8 == 0) { o << "\n\t"; ++oline; }
                o << setw(3) << (uint) bm[j] << ", ";
            }
        }
        o << "\n\t};\n";
+       oline += 2;
     }
 }
 
@@ -150,6 +152,7 @@ prt(cerr, b->go, b->on); cerr << endl;
 
 void genGoTo(ostream &o, State *to){
     o  << "\tgoto yy" << to->label << ";\n";
+    ++oline;
 }
 
 void genIf(ostream &o, char *cmp, uint v){
@@ -165,18 +168,27 @@ void indent(ostream &o, uint i){
 
 static void need(ostream &o, uint n){
     if(n == 1)
+    {
        o << "\tif(YYLIMIT == YYCURSOR) YYFILL(1);\n";
+       ++oline;
+    }
     else
+    {
        o << "\tif((YYLIMIT - YYCURSOR) < " << n << ") YYFILL(" << n << ");\n";
+       ++oline;
+    }
     o << "\tyych = *YYCURSOR;\n";
+    ++oline;
 }
 
 void Match::emit(ostream &o){
     if(state->link){
        o << "\t++YYCURSOR;\n";
+       ++oline;
        need(o, state->depth);
     } else {
        o << "\tyych = *++YYCURSOR;\n";
+       ++oline;
     }
 }
 
@@ -184,20 +196,25 @@ void Enter::emit(ostream &o){
     if(state->link){
        o << "\t++YYCURSOR;\n";
        o << "yy" << label << ":\n";
+       oline += 2;
        need(o, state->depth);
     } else {
        o << "\tyych = *++YYCURSOR;\n";
        o << "yy" << label << ":\n";
+       oline += 2;
     }
 }
 
 void Save::emit(ostream &o){
     o << "\tyyaccept = " << selector << ";\n";
+    ++oline;
     if(state->link){
        o << "\tYYMARKER = ++YYCURSOR;\n";
+       ++oline;
        need(o, state->depth);
     } else {
        o << "\tyych = *(YYMARKER = ++YYCURSOR);\n";
+       ++oline;
     }
 }
 
@@ -222,12 +239,16 @@ void Accept::emit(ostream &o){
                first = false;
                o << "\tYYCURSOR = YYMARKER;\n";
                o << "\tswitch(yyaccept){\n";
+               oline += 2;
            }
            o << "\tcase " << saves[i] << ":";
            genGoTo(o, rules[i]);
        }
     if(!first)
+    {
        o << "\t}\n";
+       ++oline;
+    }
 }
 
 Rule::Rule(State *s, RuleOp *r) : Action(s), rule(r) {
@@ -238,8 +259,17 @@ void Rule::emit(ostream &o){
     uint back = rule->ctx->fixedLength();
     if(back != ~0u && back > 0u)
        o << "\tYYCURSOR -= " << back << ";";
-    o << "\n#line " << rule->code->line
-      << "\n\t" << rule->code->text << "\n";
+    o << "\n";
+    ++oline;
+    line_source(rule->code->line, o);
+    o << rule->code->text;
+// not sure if we need this or not.    oline += std::count(rule->code->text, rule->code->text + ::strlen(rule->code->text), '\n');
+    o << "\n";
+    ++oline;
+    o << "#line " << ++oline << " \"re2c-output.c\"\n";
+    // TODO: use this once we get an output filename: o << "#line " << ++oline << " \"" << outputFileName << "\"\n";
+//    o << "\n#line " << rule->code->line
+//      << "\n\t" << rule->code->text << "\n";
 }
 
 void doLinear(ostream &o, uint i, Span *s, uint n, State *next){
@@ -280,6 +310,7 @@ void genCases(ostream &o, uint lb, Span *s){
            if(++lb == s->ub)
                break;
            o << "\n";
+           ++oline;
        }
     }
 }
@@ -297,6 +328,7 @@ void Go::genSwitch(ostream &o, State *next){
                *(t++) = &span[i];
 
        o << "\tswitch(yych){\n";
+       ++oline;
        while(t != &sP[0]){
            r = s = &sP[0];
            if(*s == &span[0])
@@ -316,6 +348,7 @@ void Go::genSwitch(ostream &o, State *next){
        o << "\tdefault:";
        genGoTo(o, def);
        o << "\t}\n";
+       ++oline;
 
        delete [] sP;
     }
@@ -327,10 +360,13 @@ void doBinary(ostream &o, uint i, Span *s, uint n, State *next){
     } else {
        uint h = n/2;
        indent(o, i); genIf(o, "<=", s[h-1].ub - 1); o << "{\n";
+       ++oline;
        doBinary(o, i+1, &s[0], h, next);
        indent(o, i); o << "\t} else {\n";
+       ++oline;
        doBinary(o, i+1, &s[h], n - h, next);
        indent(o, i); o << "\t}\n";
+       ++oline;
     }
 }
 
@@ -641,12 +677,18 @@ void DFA::emit(ostream &o){
 
     delete head->action;
 
+    ++oline;
+    o << "\n#line " << ++oline << " \"re2c-output.c\"\n";
+    // TODO: Switch to use this once we have an outputFileName: o << "\n#line " << ++oline << " \"" << outputFileName << "\"\n";
     o << "{\n\tYYCTYPE yych;\n\tunsigned int yyaccept;\n";
+    oline += 3;
+
 
     if(bFlag)
        BitMap::gen(o, lbChar, ubChar);
 
     o << "\tgoto yy" << label << ";\n";
+    ++oline;
     (void) new Enter(head, label++);
 
     for(s = head; s; s = s->next)
@@ -657,6 +699,7 @@ void DFA::emit(ostream &o){
        s->go.genGoto(o, s->next);
     }
     o << "}\n";
+    ++oline;
 
     BitMap::first = NULL;
 
diff --git a/dfa.cc b/dfa.cc
index c1ff05458a783d8ec08f5f467c5bd002f1514d7f..fbdf0ffbfbfa233f2fe82dd32b0535405c7b032d 100644 (file)
--- a/dfa.cc
+++ b/dfa.cc
@@ -56,6 +56,7 @@ ostream& operator<<(ostream &o, const State &s){
     if(s.rule)
        o << " accepts " << s.rule->accept;
     o << "\n";
+    ++oline;
     uint lb = 0;
     for(uint i = 0; i < s.go.nSpans; ++i)
        lb = s.go.span[i].show(o, lb);
@@ -64,7 +65,10 @@ ostream& operator<<(ostream &o, const State &s){
 
 ostream& operator<<(ostream &o, const DFA &dfa){
     for(State *s = dfa.head; s; s = s->next)
+    {
        o << s << "\n\n";
+       ++oline;
+    }
     return o;
 }
 
index 79edbff9321076a97e6e069be80613ff0da540b8..f3249969de8d49bff9037246b425cc0c8440ca03 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -6,6 +6,7 @@
 extern char *fileName;
 extern bool sFlag;
 extern bool bFlag;
+extern unsigned int oline;
 
 extern uchar asc2ebc[256];
 extern uchar ebc2asc[256];
diff --git a/main.cc b/main.cc
index b831a8a98dfd24a4f2c2bc1e1585248038b9da7b..0c564235429962aa7ecb73fe705aaf46d551bb7a 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -10,6 +10,7 @@
 char *fileName;
 bool sFlag = false;
 bool bFlag = false;
+unsigned int oline = 1;
 
 using namespace std;
 
index 6d664005b329399a9979c36dd8f897932fe74008..c2cce9db2cc9021749b070f0a701797e57ae567d 100644 (file)
--- a/parser.cc
+++ b/parser.cc
@@ -1,14 +1,16 @@
-#ifndef lint
-static char yysccsid[] = "@(#)yaccpar  1.9 (Berkeley) 02/21/93";
-#endif
-#define YYBYACC 1
-#define YYMAJOR 1
-#define YYMINOR 9
-#define yyclearin (yychar=(-1))
-#define yyerrok (yyerrflag=0)
-#define YYRECOVERING (yyerrflag!=0)
-#define YYPREFIX "yy"
-#line 2 "parser.y"
+/* A Bison parser, made from parser.y
+   by GNU bison 1.35.  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+# define       CLOSE   257
+# define       ID      258
+# define       CODE    259
+# define       RANGE   260
+# define       STRING  261
+
+#line 1 "parser.y"
+
 
 #include <time.h>
 #include <iostream.h>
@@ -16,422 +18,948 @@ static char yysccsid[] = "@(#)yaccpar     1.9 (Berkeley) 02/21/93";
 #include <malloc.h>
 #include "globals.h"
 #include "parser.h"
+#include "version.h"
+
+extern "C"
+{
 int yyparse();
 int yylex();
 void yyerror(char*);
+}
 
 static uint accept;
 static RegExp *spec;
 static Scanner *in;
 
-#line 21 "parser.y"
+
+#line 26 "parser.y"
+#ifndef YYSTYPE
 typedef union {
     Symbol     *symbol;
     RegExp     *regexp;
     Token      *token;
     char       op;
-} YYSTYPE;
-#line 35 "y.tab.c"
-#define CLOSE 257
-#define ID 258
-#define CODE 259
-#define RANGE 260
-#define STRING 261
-#define YYERRCODE 256
-short yylhs[] = {                                        -1,
-    0,    0,    0,    9,    2,    3,    3,    4,    4,    5,
-    5,    6,    6,    7,    7,    1,    1,    8,    8,    8,
-    8,
+} yystype;
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+
+
+#define        YYFINAL         32
+#define        YYFLAG          -32768
+#define        YYNTBASE        15
+
+/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
+#define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 25)
+
+/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
+static const char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      13,    14,     2,     2,     2,     2,     2,    10,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     9,
+       2,     8,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,    12,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,    11,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     3,     4,     5,
+       6,     7
 };
-short yylen[] = {                                         2,
-    0,    2,    2,    4,    3,    0,    2,    1,    3,    1,
-    3,    1,    2,    1,    2,    1,    2,    1,    1,    1,
-    3,
+
+#if YYDEBUG
+static const short yyprhs[] =
+{
+       0,     0,     1,     4,     7,    12,    16,    17,    20,    22,
+      26,    28,    32,    34,    37,    39,    42,    44,    47,    49,
+      51,    53
 };
-short yydefred[] = {                                      1,
-    0,    0,   19,   20,    0,    2,    0,    0,    0,   12,
-    0,    3,    0,   18,    0,    0,    0,    0,    0,   13,
-   16,    0,    0,   21,    0,    0,    5,    0,   17,    4,
+static const short yyrhs[] =
+{
+      -1,    15,    17,     0,    15,    16,     0,     4,     8,    19,
+       9,     0,    19,    18,     5,     0,     0,    10,    19,     0,
+      20,     0,    19,    11,    20,     0,    21,     0,    20,    12,
+      21,     0,    22,     0,    21,    22,     0,    24,     0,    24,
+      23,     0,     3,     0,    23,     3,     0,     4,     0,     6,
+       0,     7,     0,    13,    19,    14,     0
 };
-short yydgoto[] = {                                       1,
-   22,    6,   18,    7,    8,    9,   10,   11,   12,
+
+#endif
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const short yyrline[] =
+{
+       0,    44,    47,    49,    52,    58,    62,    64,    68,    70,
+      74,    76,    83,    85,    89,    91,   107,   109,   113,   117,
+     119,   121
 };
-short yysindex[] = {                                      0,
-  -27,  -49,    0,    0,  -23,    0,  -44,  -84,  -23,    0,
- -243,    0,  -23,    0,  -39,  -23,  -23, -244,  -23,    0,
-    0, -239,  -53,    0, -104,  -84,    0,  -23,    0,    0,
+#endif
+
+
+#if (YYDEBUG) || defined YYERROR_VERBOSE
+
+/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
+static const char *const yytname[] =
+{
+  "$", "error", "$undefined.", "CLOSE", "ID", "CODE", "RANGE", "STRING", 
+  "'='", "';'", "'/'", "'|'", "'\\\\'", "'('", "')'", "spec", "decl", 
+  "rule", "look", "expr", "diff", "term", "factor", "close", "primary", 0
 };
-short yyrindex[] = {                                      0,
-    0,  -31,    0,    0,    0,    0, -227,  -17,  -20,    0,
-  -40,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  -36,    0,    0, -226,  -16,    0,  -19,    0,    0,
+#endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const short yyr1[] =
+{
+       0,    15,    15,    15,    16,    17,    18,    18,    19,    19,
+      20,    20,    21,    21,    22,    22,    23,    23,    24,    24,
+      24,    24
 };
-short yygindex[] = {                                      0,
-    0,    0,    0,   21,   18,   17,    1,    0,    0,
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const short yyr2[] =
+{
+       0,     0,     2,     2,     4,     3,     0,     2,     1,     3,
+       1,     3,     1,     2,     1,     2,     1,     2,     1,     1,
+       1,     3
 };
-#define YYTABLESIZE 243
-short yytable[] = {                                      14,
-   14,   24,   16,   15,   15,   30,   14,   19,   18,   20,
-   15,   13,    5,   21,   27,   18,    5,   29,   14,   17,
-   10,   11,   15,    8,    9,   15,   10,   11,   20,    8,
-    9,    6,    7,   23,   26,   28,   25,    0,   10,   11,
-    0,    8,    9,    0,    0,    0,    0,    0,    0,    0,
-    0,   14,    0,    0,    0,   15,    0,    0,    0,    0,
-   18,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   17,   10,   11,    0,    0,    0,    0,    0,    0,   17,
-    0,    0,    0,   14,   17,    0,    0,   15,    0,    0,
-    0,    0,   18,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   10,   11,    0,    8,    9,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,   14,   14,   14,
-   14,   15,   15,   15,   15,   18,   18,   18,   18,   18,
-    2,    0,    3,    4,   14,    0,    3,    4,   10,   11,
-    0,    8,    9,
+
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
+   doesn't specify something else to do.  Zero means the default is an
+   error. */
+static const short yydefact[] =
+{
+       1,     0,    18,    19,    20,     0,     3,     2,     6,     8,
+      10,    12,    14,     0,    18,     0,     0,     0,     0,     0,
+      13,    16,    15,     0,    21,     7,     9,     5,    11,    17,
+       4,     0,     0
 };
-short yycheck[] = {                                      40,
-   41,   41,   47,   40,   41,   59,   47,   92,   40,    9,
-   47,   61,   40,  257,  259,   47,   40,  257,   59,  124,
-   41,   41,   59,   41,   41,    5,   47,   47,   28,   47,
-   47,  259,  259,   13,   17,   19,   16,   -1,   59,   59,
-   -1,   59,   59,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   92,   -1,   -1,   -1,   92,   -1,   -1,   -1,   -1,
-   92,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  124,   92,   92,   -1,   -1,   -1,   -1,   -1,   -1,  124,
-   -1,   -1,   -1,  124,  124,   -1,   -1,  124,   -1,   -1,
-   -1,   -1,  124,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  124,  124,   -1,  124,  124,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  258,  259,  260,
-  261,  258,  259,  260,  261,  257,  258,  259,  260,  261,
-  258,   -1,  260,  261,  258,   -1,  260,  261,  259,  259,
-   -1,  259,  259,
+
+static const short yydefgoto[] =
+{
+       1,     6,     7,    18,     8,     9,    10,    11,    22,    12
 };
-#define YYFINAL 1
-#ifndef YYDEBUG
-#define YYDEBUG 0
-#endif
-#define YYMAXTOKEN 261
-#if YYDEBUG
-char *yyname[] = {
-"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,"'('","')'",0,0,0,0,0,"'/'",0,0,0,0,0,0,0,0,0,0,0,"';'",0,"'='",0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'\\\\'",0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-"CLOSE","ID","CODE","RANGE","STRING",
+
+static const short yypact[] =
+{
+  -32768,     1,    -4,-32768,-32768,    13,-32768,-32768,     5,     9,
+      13,-32768,    19,    13,-32768,    -8,    13,    13,     7,    13,
+  -32768,-32768,    20,     0,-32768,    14,     9,-32768,    13,-32768,
+  -32768,    24,-32768
+};
+
+static const short yypgoto[] =
+{
+  -32768,-32768,-32768,-32768,    -3,    10,    11,   -10,-32768,-32768
+};
+
+
+#define        YYLAST          30
+
+
+static const short yytable[] =
+{
+      20,    31,    15,    17,    13,     2,    24,     3,     4,    30,
+      23,    17,    27,    25,     5,    16,    17,    14,    20,     3,
+       4,    19,    21,    29,    32,    17,     5,    26,     0,     0,
+      28
 };
-char *yyrule[] = {
-"$accept : spec",
-"spec :",
-"spec : spec rule",
-"spec : spec decl",
-"decl : ID '=' expr ';'",
-"rule : expr look CODE",
-"look :",
-"look : '/' expr",
-"expr : diff",
-"expr : expr '|' diff",
-"diff : term",
-"diff : diff '\\\\' term",
-"term : factor",
-"term : term factor",
-"factor : primary",
-"factor : primary close",
-"close : CLOSE",
-"close : close CLOSE",
-"primary : ID",
-"primary : RANGE",
-"primary : STRING",
-"primary : '(' expr ')'",
+
+static const short yycheck[] =
+{
+      10,     0,     5,    11,     8,     4,    14,     6,     7,     9,
+      13,    11,     5,    16,    13,    10,    11,     4,    28,     6,
+       7,    12,     3,     3,     0,    11,    13,    17,    -1,    -1,
+      19
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/share/bison/bison.simple"
+
+/* Skeleton output parser for bison,
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software
+   Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser when
+   the %semantic_parser declaration is not specified in the grammar.
+   It was written by Richard Stallman by simplifying the hairy parser
+   used when %semantic_parser is specified.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+# if YYLSP_NEEDED
+  YYLTYPE yyls;
+# endif
 };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# if YYLSP_NEEDED
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))     \
+      + 2 * YYSTACK_GAP_MAX)
+# else
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
+      + YYSTACK_GAP_MAX)
+# endif
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         register YYSIZE_T yyi;                \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];            \
+       }                                       \
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (0)
+
 #endif
-#ifdef YYSTACKSIZE
-#undef YYMAXDEPTH
-#define YYMAXDEPTH YYSTACKSIZE
-#else
-#ifdef YYMAXDEPTH
-#define YYSTACKSIZE YYMAXDEPTH
-#else
-#define YYSTACKSIZE 500
-#define YYMAXDEPTH 500
+
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
 #endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT        goto yyabortlab
+#define YYERROR                goto yyerrlab1
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL         goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).
+
+   When YYLLOC_DEFAULT is run, CURRENT is set the location of the
+   first token.  By default, to implement support for ranges, extend
+   its range to the last symbol.  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)               \
+   Current.last_line   = Rhs[N].last_line;     \
+   Current.last_column = Rhs[N].last_column;
 #endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#if YYPURE
+# if YYLSP_NEEDED
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, &yylloc, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval, &yylloc)
+#  endif
+# else /* !YYLSP_NEEDED */
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval)
+#  endif
+# endif /* !YYLSP_NEEDED */
+#else /* !YYPURE */
+# define YYLEX                 yylex ()
+#endif /* !YYPURE */
+
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
 int yydebug;
-int yynerrs;
-int yyerrflag;
-int yychar;
-short *yyssp;
-YYSTYPE *yyvsp;
-YYSTYPE yyval;
-YYSTYPE yylval;
-short yyss[YYSTACKSIZE];
-YYSTYPE yyvs[YYSTACKSIZE];
-#define yystacksize YYSTACKSIZE
-#line 121 "parser.y"
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+#endif /* !YYDEBUG */
 
-void yyerror(char* s){
-    in->fatal(s);
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+\f
+#ifdef YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
 }
+#  endif
+# endif
 
-int yylex(){
-    return in->scan();
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
 }
+#  endif
+# endif
+#endif
+\f
+#line 315 "/usr/share/bison/bison.simple"
 
-void parse(int i, ostream &o){
-    char *     fnamebuf;
-    char *     token;
 
-    o << "/* Generated by re2c 0.5 on ";
-    time_t now = time(&now);
-    o.write(ctime(&now), 24);
-    o << " */\n";
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
 
-    in = new Scanner(i);
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
 
-    o << "#line " << in->line() << " \"";
-    if( fileName != NULL ) {
-       fnamebuf = strdup( fileName );
-    } else {
-       fnamebuf = strdup( "<stdin>" );
-    }
-    token = strtok( fnamebuf, "\\" );
-    for(;;) {
-       o << token;
-       token = strtok( NULL, "\\" );
-       if( token == NULL ) break;
-       o << "\\\\";
-    }
-    o << "\"\n";
-    free( fnamebuf );
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
+   variables are global, or local to YYPARSE.  */
+
+#define YY_DECL_NON_LSP_VARIABLES                      \
+/* The lookahead symbol.  */                           \
+int yychar;                                            \
+                                                       \
+/* The semantic value of the lookahead symbol. */      \
+YYSTYPE yylval;                                                \
+                                                       \
+/* Number of parse errors so far.  */                  \
+int yynerrs;
+
+#if YYLSP_NEEDED
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES                      \
+                                               \
+/* Location data for the lookahead symbol.  */ \
+YYLTYPE yylloc;
+#else
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES
+#endif
+
+
+/* If nonreentrant, generate the variables here. */
+
+#if !YYPURE
+YY_DECL_VARIABLES
+#endif  /* !YYPURE */
 
-    while(in->echo(o)){
-       yyparse();
-       if(spec)
-           genCode(o, spec);
-       o << "#line " << in->line() << "\n";
-    }
-}
-#line 235 "y.tab.c"
-#define YYABORT goto yyabort
-#define YYREJECT goto yyabort
-#define YYACCEPT goto yyaccept
-#define YYERROR goto yyerrlab
 int
-yyparse()
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
 {
-    register int yym, yyn, yystate;
-#if YYDEBUG
-    register char *yys;
-    extern char *getenv();
+  /* If reentrant, generate the variables here. */
+#if YYPURE
+  YY_DECL_VARIABLES
+#endif  /* !YYPURE */
 
-    if (yys = getenv("YYDEBUG"))
-    {
-        yyn = *yys;
-        if (yyn >= '0' && yyn <= '9')
-            yydebug = yyn - '0';
-    }
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack. */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+#if YYLSP_NEEDED
+  /* The location stack.  */
+  YYLTYPE yylsa[YYINITDEPTH];
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+#endif
+
+#if YYLSP_NEEDED
+# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+# define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+#if YYLSP_NEEDED
+  YYLTYPE yyloc;
 #endif
 
-    yynerrs = 0;
-    yyerrflag = 0;
-    yychar = (-1);
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule. */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+#if YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+  goto yysetstate;
 
-    yyssp = yyss;
-    yyvsp = yyvs;
-    *yyssp = yystate = 0;
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
 
-yyloop:
-    if (yyn = yydefred[yystate]) goto yyreduce;
-    if (yychar < 0)
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
     {
-        if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
-        if (yydebug)
-        {
-            yys = 0;
-            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-            if (!yys) yys = "illegal-symbol";
-            printf("%sdebug: state %d, reading %d (%s)\n",
-                    YYPREFIX, yystate, yychar, yys);
-        }
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  */
+# if YYLSP_NEEDED
+       YYLTYPE *yyls1 = yyls;
+       /* This used to be a conditional around just the two extra args,
+          but that might be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yyls1, yysize * sizeof (*yylsp),
+                   &yystacksize);
+       yyls = yyls1;
+# else
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yystacksize);
+# endif
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+# if YYLSP_NEEDED
+       YYSTACK_RELOCATE (yyls);
+# endif
+# undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+#if YYLSP_NEEDED
+      yylsp = yyls + yysize - 1;
 #endif
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
     }
-    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
-            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
     {
-#if YYDEBUG
-        if (yydebug)
-            printf("%sdebug: state %d, shifting to state %d\n",
-                    YYPREFIX, yystate, yytable[yyn]);
-#endif
-        if (yyssp >= yyss + yystacksize - 1)
-        {
-            goto yyoverflow;
-        }
-        *++yyssp = yystate = yytable[yyn];
-        *++yyvsp = yylval;
-        yychar = (-1);
-        if (yyerrflag > 0)  --yyerrflag;
-        goto yyloop;
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
     }
-    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
-            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)             /* This means end of input. */
     {
-        yyn = yytable[yyn];
-        goto yyreduce;
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
-    if (yyerrflag) goto yyinrecovery;
-#ifdef lint
-    goto yynewerror;
-#endif
-yynewerror:
-    yyerror("syntax error");
-#ifdef lint
-    goto yyerrlab;
-#endif
-yyerrlab:
-    ++yynerrs;
-yyinrecovery:
-    if (yyerrflag < 3)
+  else
     {
-        yyerrflag = 3;
-        for (;;)
-        {
-            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
-                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
-            {
-#if YYDEBUG
-                if (yydebug)
-                    printf("%sdebug: state %d, error recovery shifting\
- to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
-#endif
-                if (yyssp >= yyss + yystacksize - 1)
-                {
-                    goto yyoverflow;
-                }
-                *++yyssp = yystate = yytable[yyn];
-                *++yyvsp = yylval;
-                goto yyloop;
-            }
-            else
-            {
+      yychar1 = YYTRANSLATE (yychar);
+
 #if YYDEBUG
-                if (yydebug)
-                    printf("%sdebug: error recovery discarding state %d\n",
-                            YYPREFIX, *yyssp);
-#endif
-                if (yyssp <= yyss) goto yyabort;
-                --yyssp;
-                --yyvsp;
-            }
-        }
+     /* We have to keep this `#if YYDEBUG', since we use variables
+       which are defined only if `YYDEBUG' is set.  */
+      if (yydebug)
+       {
+         YYFPRINTF (stderr, "Next token is %d (%s",
+                    yychar, yytname[yychar1]);
+         /* Give the individual parser a way to print the precise
+            meaning of a token, for further debugging info.  */
+# ifdef YYPRINT
+         YYPRINT (stderr, yychar, yylval);
+# endif
+         YYFPRINTF (stderr, ")\n");
+       }
+#endif
     }
-    else
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
     {
-        if (yychar == 0) goto yyabort;
-#if YYDEBUG
-        if (yydebug)
-        {
-            yys = 0;
-            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-            if (!yys) yys = "illegal-symbol";
-            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
-                    YYPREFIX, yystate, yychar, yys);
-        }
-#endif
-        yychar = (-1);
-        goto yyloop;
+      if (yyn == YYFLAG)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
     }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
 yyreduce:
-#if YYDEBUG
-    if (yydebug)
-        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
-                YYPREFIX, yystate, yyn, yyrule[yyn]);
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to the semantic value of
+     the lookahead token.  This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+#if YYLSP_NEEDED
+  /* Similarly for the default location.  Let the user run additional
+     commands if for instance locations are ranges.  */
+  yyloc = yylsp[1-yylen];
+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
 #endif
-    yym = yylen[yyn];
-    yyval = yyvsp[1-yym];
-    switch (yyn)
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
     {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+  switch (yyn) {
+
 case 1:
-#line 40 "parser.y"
+#line 45 "parser.y"
 { accept = 0;
-                 spec = NULL; }
-break;
+                 spec = NULL; ;
+    break;}
 case 2:
-#line 43 "parser.y"
-{ spec = spec? mkAlt(spec, yyvsp[0].regexp) : yyvsp[0].regexp; }
-break;
-case 4:
 #line 48 "parser.y"
+{ spec = spec? mkAlt(spec, yyvsp[0].regexp) : yyvsp[0].regexp; ;
+    break;}
+case 4:
+#line 53 "parser.y"
 { if(yyvsp[-3].symbol->re)
                      in->fatal("sym already defined");
-                 yyvsp[-3].symbol->re = yyvsp[-1].regexp; }
-break;
+                 yyvsp[-3].symbol->re = yyvsp[-1].regexp; ;
+    break;}
 case 5:
-#line 54 "parser.y"
-{ yyval.regexp = new RuleOp(yyvsp[-2].regexp, yyvsp[-1].regexp, yyvsp[0].token, accept++); }
-break;
+#line 59 "parser.y"
+{ yyval.regexp = new RuleOp(yyvsp[-2].regexp, yyvsp[-1].regexp, yyvsp[0].token, accept++); ;
+    break;}
 case 6:
-#line 58 "parser.y"
-{ yyval.regexp = new NullOp; }
-break;
+#line 63 "parser.y"
+{ yyval.regexp = new NullOp; ;
+    break;}
 case 7:
-#line 60 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; }
-break;
+#line 65 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; ;
+    break;}
 case 8:
-#line 64 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; }
-break;
+#line 69 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; ;
+    break;}
 case 9:
-#line 66 "parser.y"
-{ yyval.regexp =  mkAlt(yyvsp[-2].regexp, yyvsp[0].regexp); }
-break;
+#line 71 "parser.y"
+{ yyval.regexp =  mkAlt(yyvsp[-2].regexp, yyvsp[0].regexp); ;
+    break;}
 case 10:
-#line 70 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; }
-break;
+#line 75 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; ;
+    break;}
 case 11:
-#line 72 "parser.y"
+#line 77 "parser.y"
 { yyval.regexp =  mkDiff(yyvsp[-2].regexp, yyvsp[0].regexp);
                  if(!yyval.regexp)
                       in->fatal("can only difference char sets");
-               }
-break;
+               ;
+    break;}
 case 12:
-#line 79 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; }
-break;
+#line 84 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; ;
+    break;}
 case 13:
-#line 81 "parser.y"
-{ yyval.regexp = new CatOp(yyvsp[-1].regexp, yyvsp[0].regexp); }
-break;
+#line 86 "parser.y"
+{ yyval.regexp = new CatOp(yyvsp[-1].regexp, yyvsp[0].regexp); ;
+    break;}
 case 14:
-#line 85 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; }
-break;
+#line 90 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; ;
+    break;}
 case 15:
-#line 87 "parser.y"
+#line 92 "parser.y"
 {
                    switch(yyvsp[0].op){
                    case '*':
@@ -444,88 +972,319 @@ case 15:
                        yyval.regexp = mkAlt(yyvsp[-1].regexp, new NullOp());
                        break;
                    }
-               }
-break;
+               ;
+    break;}
 case 16:
-#line 103 "parser.y"
-{ yyval.op = yyvsp[0].op; }
-break;
+#line 108 "parser.y"
+{ yyval.op = yyvsp[0].op; ;
+    break;}
 case 17:
-#line 105 "parser.y"
-{ yyval.op = (yyvsp[-1].op == yyvsp[0].op) ? yyvsp[-1].op : '*'; }
-break;
+#line 110 "parser.y"
+{ yyval.op = (yyvsp[-1].op == yyvsp[0].op) ? yyvsp[-1].op : '*'; ;
+    break;}
 case 18:
-#line 109 "parser.y"
+#line 114 "parser.y"
 { if(!yyvsp[0].symbol->re)
                      in->fatal("can't find symbol");
-                 yyval.regexp = yyvsp[0].symbol->re; }
-break;
+                 yyval.regexp = yyvsp[0].symbol->re; ;
+    break;}
 case 19:
-#line 113 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; }
-break;
+#line 118 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; ;
+    break;}
 case 20:
-#line 115 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; }
-break;
+#line 120 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; ;
+    break;}
 case 21:
-#line 117 "parser.y"
-{ yyval.regexp = yyvsp[-1].regexp; }
-break;
-#line 476 "y.tab.c"
+#line 122 "parser.y"
+{ yyval.regexp = yyvsp[-1].regexp; ;
+    break;}
+}
+
+#line 705 "/usr/share/bison/bison.simple"
+
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#if YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+#if YYLSP_NEEDED
+  *++yylsp = yyloc;
+#endif
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* defined (YYERROR_VERBOSE) */
+       yyerror ("parse error");
     }
-    yyssp -= yym;
-    yystate = *yyssp;
-    yyvsp -= yym;
-    yym = yylhs[yyn];
-    if (yystate == 0 && yym == 0)
+  goto yyerrlab1;
+
+
+/*--------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action |
+`--------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
     {
-#if YYDEBUG
-        if (yydebug)
-            printf("%sdebug: after reduction, shifting from state 0 to\
- state %d\n", YYPREFIX, YYFINAL);
-#endif
-        yystate = YYFINAL;
-        *++yyssp = YYFINAL;
-        *++yyvsp = yyval;
-        if (yychar < 0)
-        {
-            if ((yychar = yylex()) < 0) yychar = 0;
-#if YYDEBUG
-            if (yydebug)
-            {
-                yys = 0;
-                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-                if (!yys) yys = "illegal-symbol";
-                printf("%sdebug: state %d, reading %d (%s)\n",
-                        YYPREFIX, YYFINAL, yychar, yys);
-            }
-#endif
-        }
-        if (yychar == 0) goto yyaccept;
-        goto yyloop;
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+       YYABORT;
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yychar = YYEMPTY;
     }
-    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
-            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
-        yystate = yytable[yyn];
-    else
-        yystate = yydgoto[yym];
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;             /* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+
+/*-------------------------------------------------------------------.
+| yyerrdefault -- current state does not do anything special for the |
+| error token.                                                       |
+`-------------------------------------------------------------------*/
+yyerrdefault:
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+
+  /* If its default is to accept any token, ok.  Otherwise pop it.  */
+  yyn = yydefact[yystate];
+  if (yyn)
+    goto yydefault;
+#endif
+
+
+/*---------------------------------------------------------------.
+| yyerrpop -- pop the current state because it cannot handle the |
+| error token                                                    |
+`---------------------------------------------------------------*/
+yyerrpop:
+  if (yyssp == yyss)
+    YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#if YYLSP_NEEDED
+  yylsp--;
+#endif
+
 #if YYDEBUG
-    if (yydebug)
-        printf("%sdebug: after reduction, shifting from state %d \
-to state %d\n", YYPREFIX, *yyssp, yystate);
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "Error: state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
 #endif
-    if (yyssp >= yyss + yystacksize - 1)
+
+/*--------------.
+| yyerrhandle.  |
+`--------------*/
+yyerrhandle:
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
     {
-        goto yyoverflow;
+      if (yyn == YYFLAG)
+       goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+/*---------------------------------------------.
+| yyoverflowab -- parser overflow comes here.  |
+`---------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+#line 125 "parser.y"
+
+
+extern "C" {
+void yyerror(char* s){
+    in->fatal(s);
+}
+
+int yylex(){
+    return in->scan();
+}
+} // end extern "C"
+
+void line_source(unsigned int line, ostream& o)
+{
+    char *     fnamebuf;
+    char *     token;
+
+    o << "#line " << line << " \"";
+    if( fileName != NULL ) {
+       fnamebuf = strdup( fileName );
+    } else {
+       fnamebuf = strdup( "<stdin>" );
+    }
+    token = strtok( fnamebuf, "\\" );
+    for(;;) {
+       o << token;
+       token = strtok( NULL, "\\" );
+       if( token == NULL ) break;
+       o << "\\\\";
+    }
+    o << "\"\n";
+    ++oline;
+    free( fnamebuf );
+}
+
+void parse(int i, ostream &o){
+
+    o << "/* Generated by re2c " RE2C_VERSION " on ";
+    time_t now = time(&now);
+    o.write(ctime(&now), 24);
+    o << " */\n";
+    oline += 2;
+
+    in = new Scanner(i);
+
+    line_source(in->line(), o);
+
+    while(in->echo(o)){
+       yyparse();
+       if(spec)
+           genCode(o, spec);
+       line_source(in->line(), o);
     }
-    *++yyssp = yystate;
-    *++yyvsp = yyval;
-    goto yyloop;
-yyoverflow:
-    yyerror("yacc stack overflow");
-yyabort:
-    return (1);
-yyaccept:
-    return (0);
 }
index 56178a80544e4213cd86c05b696f18ef8222ee96..0225228fd3564f4c233c38849b2984c4dee98e7d 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -15,6 +15,7 @@ public:
     static Symbol *find(const SubStr&);
 };
 
+void line_source(unsigned int, ostream&);
 void parse(int, ostream&);
 
 #endif
diff --git a/parser.tab.h b/parser.tab.h
new file mode 100644 (file)
index 0000000..e443f00
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef BISON_PARSER_TAB_H
+# define BISON_PARSER_TAB_H
+
+#ifndef YYSTYPE
+typedef union {
+    Symbol     *symbol;
+    RegExp     *regexp;
+    Token      *token;
+    char       op;
+} yystype;
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+# define       CLOSE   257
+# define       ID      258
+# define       CODE    259
+# define       RANGE   260
+# define       STRING  261
+
+
+extern YYSTYPE yylval;
+
+#endif /* not BISON_PARSER_TAB_H */
index 8f2a7dce07826d7e7fbddb1d1abb21ec133e66f2..0202501a4c9e14c34b9af5bf337f0d089d1aa51e 100644 (file)
--- a/parser.y
+++ b/parser.y
@@ -6,9 +6,14 @@
 #include <malloc.h>
 #include "globals.h"
 #include "parser.h"
+#include "version.h"
+
+extern "C"
+{
 int yyparse();
 int yylex();
 void yyerror(char*);
+}
 
 static uint accept;
 static RegExp *spec;
@@ -119,6 +124,7 @@ primary     :       ID
 
 %%
 
+extern "C" {
 void yyerror(char* s){
     in->fatal(s);
 }
@@ -126,19 +132,14 @@ void yyerror(char* s){
 int yylex(){
     return in->scan();
 }
+} // end extern "C"
 
-void parse(int i, ostream &o){
+void line_source(unsigned int line, ostream& o)
+{
     char *     fnamebuf;
     char *     token;
 
-    o << "/* Generated by re2c 0.5 on ";
-    time_t now = time(&now);
-    o.write(ctime(&now), 24);
-    o << " */\n";
-
-    in = new Scanner(i);
-
-    o << "#line " << in->line() << " \"";
+    o << "#line " << line << " \"";
     if( fileName != NULL ) {
        fnamebuf = strdup( fileName );
     } else {
@@ -152,12 +153,26 @@ void parse(int i, ostream &o){
        o << "\\\\";
     }
     o << "\"\n";
+    ++oline;
     free( fnamebuf );
+}
+
+void parse(int i, ostream &o){
+
+    o << "/* Generated by re2c " RE2C_VERSION " on ";
+    time_t now = time(&now);
+    o.write(ctime(&now), 24);
+    o << " */\n";
+    oline += 2;
+
+    in = new Scanner(i);
+
+    line_source(in->line(), o);
 
     while(in->echo(o)){
        yyparse();
        if(spec)
            genCode(o, spec);
-       o << "#line " << in->line() << "\n";
+       line_source(in->line(), o);
     }
 }
index 576680f78125255fd757a5aeb39ad74e7e3ea84c..b8b03b9d96003ebcc0f5eed9178f15618339c630 100644 (file)
@@ -1,7 +1,6 @@
-/* Generated by re2c 0.5 on Sat Apr  6 20:23:48 2002 */
+/* Generated by re2c 0.9.2 on Sun Jan 11 21:32:00 2004 */
 #line 1 "scanner.re"
-#include <stdlib.h>
-#include <string.h>
+#include <stdlib.h> #include <string.h>
 #include <iostream.h>
 #include <unistd.h>
 #include "scanner.h"
@@ -58,13 +57,20 @@ char *Scanner::fill(char *cursor){
     return cursor;
 }
 
-#line 68
+#line 67 "scanner.re"
 
 
 int Scanner::echo(ostream &out){
     char *cursor = cur;
+
+    // Catch EOF
+    if (eof && cursor == eof)
+       return 0;
+
     tok = cursor;
 echo:
+
+#line 7 "re2c-output.c"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
@@ -79,15 +85,17 @@ yy2:        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if(yych == '*') goto yy7;
 yy3:
-#line 82
-       { goto echo; }
+#line 86 "scanner.re"
+{ goto echo; }
+#line 24 "re2c-output.c"
 yy4:   yych = *++YYCURSOR;
 yy5:
-#line 78
-       { if(cursor == eof) RETURN(0);
+#line 82 "scanner.re"
+{ if(cursor == eof) RETURN(0);
                                  out.write((char *)tok, cursor - tok);
                                  tok = pos = cursor; cline++;
                                  goto echo; }
+#line 32 "re2c-output.c"
 yy6:   yych = *++YYCURSOR;
        goto yy3;
 yy7:   yych = *++YYCURSOR;
@@ -106,12 +114,13 @@ yy12:     yych = *++YYCURSOR;
        if(yych != 'c') goto yy8;
 yy13:  yych = *++YYCURSOR;
 yy14:
-#line 75
-       { out.write((char *)tok, &cursor[-7] - tok);
+#line 79 "scanner.re"
+{ out.write((char *)tok, &cursor[-7] - tok);
                                  tok = cursor;
                                  RETURN(1); }
+#line 55 "re2c-output.c"
 }
-#line 83
+#line 87 "scanner.re"
 
 }
 
@@ -124,6 +133,8 @@ scan:
     tchar = cursor - pos;
     tline = cline;
     tok = cursor;
+
+#line 59 "re2c-output.c"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
@@ -179,33 +190,38 @@ yy15:
        }
 yy17:  yych = *++YYCURSOR;
 yy18:
-#line 96
-       { depth = 1;
+#line 100 "scanner.re"
+{ depth = 1;
                                  goto code;
                                }
+#line 119 "re2c-output.c"
 yy19:  yych = *++YYCURSOR;
        if(yych == '*') goto yy54;
 yy20:
-#line 115
-       { RETURN(*tok); }
+#line 119 "scanner.re"
+{ RETURN(*tok); }
+#line 125 "re2c-output.c"
 yy21:  yych = *++YYCURSOR;
        if(yych == '/') goto yy52;
 yy22:
-#line 117
-       { yylval.op = *tok;
+#line 121 "scanner.re"
+{ yylval.op = *tok;
                                  RETURN(CLOSE); }
+#line 132 "re2c-output.c"
 yy23:  yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if(yych != '\n')        goto yy48;
 yy24:
-#line 108
-       { fatal("bad string"); }
+#line 112 "scanner.re"
+{ fatal("bad string"); }
+#line 139 "re2c-output.c"
 yy25:  yyaccept = 1;
        yych = *(YYMARKER = ++YYCURSOR);
        if(yych != '\n')        goto yy42;
 yy26:
-#line 113
-       { fatal("bad character constant"); }
+#line 117 "scanner.re"
+{ fatal("bad character constant"); }
+#line 146 "re2c-output.c"
 yy27:  yych = *++YYCURSOR;
        goto yy20;
 yy28:  yych = *++YYCURSOR;
@@ -213,28 +229,32 @@ yy28:     yych = *++YYCURSOR;
 yy29:  yych = *++YYCURSOR;
        goto yy40;
 yy30:
-#line 120
-       { cur = cursor;
+#line 124 "scanner.re"
+{ cur = cursor;
                                  yylval.symbol = Symbol::find(token());
                                  return ID; }
+#line 158 "re2c-output.c"
 yy31:  yych = *++YYCURSOR;
        goto yy38;
 yy32:
-#line 124
-       { goto scan; }
+#line 128 "scanner.re"
+{ goto scan; }
+#line 164 "re2c-output.c"
 yy33:  yych = *++YYCURSOR;
 yy34:
-#line 126
-       { if(cursor == eof) RETURN(0);
+#line 130 "scanner.re"
+{ if(cursor == eof) RETURN(0);
                                  pos = cursor; cline++;
                                  goto scan;
                                }
+#line 172 "re2c-output.c"
 yy35:  yych = *++YYCURSOR;
 yy36:
-#line 131
-       { cerr << "unexpected character: " << *tok << endl;
+#line 135 "scanner.re"
+{ cerr << "unexpected character: " << *tok << endl;
                                  goto scan;
                                }
+#line 179 "re2c-output.c"
 yy37:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
@@ -276,10 +296,11 @@ yy44:     ++YYCURSOR;
        goto yy41;
 yy45:  yych = *++YYCURSOR;
 yy46:
-#line 110
-       { cur = cursor;
+#line 114 "scanner.re"
+{ cur = cursor;
                                  yylval.regexp = ranToRE(token());
                                  return RANGE; }
+#line 225 "re2c-output.c"
 yy47:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
@@ -297,25 +318,30 @@ yy49:     ++YYCURSOR;
        goto yy47;
 yy50:  yych = *++YYCURSOR;
 yy51:
-#line 105
-       { cur = cursor;
+#line 109 "scanner.re"
+{ cur = cursor;
                                  yylval.regexp = strToRE(token());
                                  return STRING; }
+#line 247 "re2c-output.c"
 yy52:  yych = *++YYCURSOR;
 yy53:
-#line 102
-       { tok = cursor;
+#line 106 "scanner.re"
+{ tok = cursor;
                                  RETURN(0); }
+#line 253 "re2c-output.c"
 yy54:  yych = *++YYCURSOR;
 yy55:
-#line 99
-       { depth = 1;
+#line 103 "scanner.re"
+{ depth = 1;
                                  goto comment; }
+#line 259 "re2c-output.c"
 }
-#line 134
+#line 138 "scanner.re"
 
 
 code:
+
+#line 263 "re2c-output.c"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
@@ -343,29 +369,33 @@ yy56:
        }
 yy58:  yych = *++YYCURSOR;
 yy59:
-#line 138
-       { if(--depth == 0){
+#line 142 "scanner.re"
+{ if(--depth == 0){
                                        cur = cursor;
                                        yylval.token = new Token(token(), tline);
                                        return CODE;
                                  }
                                  goto code; }
+#line 298 "re2c-output.c"
 yy60:  yych = *++YYCURSOR;
 yy61:
-#line 144
-       { ++depth;
+#line 148 "scanner.re"
+{ ++depth;
                                  goto code; }
+#line 304 "re2c-output.c"
 yy62:  yych = *++YYCURSOR;
 yy63:
-#line 146
-       { if(cursor == eof) fatal("missing '}'");
+#line 150 "scanner.re"
+{ if(cursor == eof) fatal("missing '}'");
                                  pos = cursor; cline++;
                                  goto code;
                                }
+#line 312 "re2c-output.c"
 yy64:  yych = *++YYCURSOR;
 yy65:
-#line 150
-       { goto code; }
+#line 154 "scanner.re"
+{ goto code; }
+#line 317 "re2c-output.c"
 yy66:  yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if(yych == '\n')        goto yy65;
@@ -409,10 +439,12 @@ yy74:     ++YYCURSOR;
        if(yych == '\n')        goto yy70;
        goto yy72;
 }
-#line 151
+#line 155 "scanner.re"
 
 
 comment:
+
+#line 363 "re2c-output.c"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
@@ -432,34 +464,38 @@ yy75:
 yy77:  yych = *++YYCURSOR;
        if(yych == '/') goto yy85;
 yy78:
-#line 165
-       { goto comment; }
+#line 169 "scanner.re"
+{ goto comment; }
+#line 385 "re2c-output.c"
 yy79:  yych = *++YYCURSOR;
        if(yych == '*') goto yy83;
        goto yy78;
 yy80:  yych = *++YYCURSOR;
 yy81:
-#line 161
-       { if(cursor == eof) RETURN(0);
+#line 165 "scanner.re"
+{ if(cursor == eof) RETURN(0);
                                  tok = pos = cursor; cline++;
                                  goto comment;
                                }
+#line 396 "re2c-output.c"
 yy82:  yych = *++YYCURSOR;
        goto yy78;
 yy83:  yych = *++YYCURSOR;
 yy84:
-#line 159
-       { ++depth;
+#line 163 "scanner.re"
+{ ++depth;
                                  goto comment; }
+#line 404 "re2c-output.c"
 yy85:  yych = *++YYCURSOR;
 yy86:
-#line 155
-       { if(--depth == 0)
+#line 159 "scanner.re"
+{ if(--depth == 0)
                                        goto scan;
                                    else
                                        goto comment; }
+#line 412 "re2c-output.c"
 }
-#line 166
+#line 170 "scanner.re"
 
 }
 
index 3275660ef6c9ca73ba153015a11e21a788bbf674..cbe48d1f25deecd57e2725a055b7c0c8f1e70f97 100644 (file)
--- a/substr.cc
+++ b/substr.cc
@@ -1,8 +1,14 @@
 #include <string.h>
 #include "substr.h"
+#include "globals.h"
 
 void SubStr::out(ostream& o) const {
     o.write(str, len);
+    for (int i = 0; i < len; ++i)
+    {
+       if (str[i] == '\n')
+           ++oline;
+    }
 }
 
 bool operator==(const SubStr &s1, const SubStr &s2){
diff --git a/version.h b/version.h
new file mode 100644 (file)
index 0000000..e2f8597
--- /dev/null
+++ b/version.h
@@ -0,0 +1 @@
+#define RE2C_VERSION "0.9.2"
diff --git a/y.tab.h b/y.tab.h
index 5642287b687d160897da0c743a9f06d5d5d31942..d7b3702d136ba9cf8e654bc0f7c676939f153cef 100644 (file)
--- a/y.tab.h
+++ b/y.tab.h
@@ -1,22 +1,12 @@
-#ifndef BISON_Y_TAB_H
-# define BISON_Y_TAB_H
-
-#ifndef YYSTYPE
+#define CLOSE 257
+#define ID 258
+#define CODE 259
+#define RANGE 260
+#define STRING 261
 typedef union {
     Symbol     *symbol;
     RegExp     *regexp;
     Token      *token;
     char       op;
-} yystype;
-# define YYSTYPE yystype
-#endif
-# define       CLOSE   257
-# define       ID      258
-# define       CODE    259
-# define       RANGE   260
-# define       STRING  261
-
-
+} YYSTYPE;
 extern YYSTYPE yylval;
-
-#endif /* not BISON_Y_TAB_H */