%.cc: %.re
-@if test -x re2c; then \
echo "re2c -s $< >$@"; \
- re2c -s $< >$@; \
+ ./re2c -s $< >$@; \
else \
echo "cp -f bootstrap/$@ $@"; \
cp -f bootstrap/$@ $@; \
mv -f y.tab.c parser.cc
re2c: README re2c.1 $(OBJS)
- $(CC) -o $@ $(OBJS) $(LDFLAGS) -lstdc++
+ $(CC) -o $@ $(OBJS) $(LDFLAGS)
re2c.ps:
gunzip -c doc/loplas.ps.gz > re2c.ps
-re2c
-----
+re2c Version 0.9.2
+------------------
-Version 0.9.1
Originally written by Peter Bumbulis (peter@csg.uwaterloo.ca)
Currently maintained by Brian Young (bayoung@acm.org)
The re2c distribution can be found at:
- http://www.tildeslash.org/re2c/index.html
-
-The source distribution is available from:
-
- http://www.tildeslash.org/re2c/re2c-0.9.1.tar.gz
+ http://sourceforge.net/projects/re2c/
This distribution is a cleaned up version of the 0.5 release
maintained by me (Brian Young). Several bugs were fixed as well
as code cleanup for warning free compilation. It has been developed
-and tested with egcs 1.0.2 and gcc 2.7.2.3 on Linux x86. Peter
-Bumbulis' original release can be found at:
+and tested with egcs 1.0.2 and gcc 2.7.2.3, 2.96 and 3.3.1 on Linux
+x86. You can compile your own version with other gcc version if you
+have yacc or any working bison version (tested up to bison 1.875).
+
+You can install this software by simple typing the following commands:
+ make
+ make install
+
+Or you can create a rpm package and install it by the following commands:
+ make makerpm
+ ./makerpm <release>
+ rpm -Uhv <packagedir>/re2c-0.9.2-<release>.rpm
+
+Here <realease> should be a number like 1. And <packagedir> must equal
+the directory where the makerpm step has written the generated rpm to.
+
+Peter Bumbulis' original release can be found at:
ftp://csg.uwaterloo.ca/pub/peter/re2c.0.5.tar.gz
than a flex based scanner, and its input model is much more
flexible.
-Patches and requests for features will be entertained. Areas of
+Patches and requests for features will be entertained. Areas of
particular interest to me are porting (a Solaris and an NT
version will be forthcoming) and wide character support. Note
that the code is already quite portable and should be buildable
#define BSIZE 8192
-#define YYCTYPE uchar
+#define YYCTYPE char
#define YYCURSOR cursor
#define YYLIMIT lim
#define YYMARKER ptr
;
}
-uchar *Scanner::fill(uchar *cursor){
+char *Scanner::fill(char *cursor){
if(!eof){
uint cnt = tok - bot;
if(cnt){
lim -= cnt;
}
if((top - lim) < BSIZE){
- uchar *buf = new uchar[(lim - bot) + BSIZE];
+ char *buf = new char[(lim - bot) + BSIZE];
memcpy(buf, tok, lim - tok);
tok = buf;
ptr = &buf[ptr - bot];
int Scanner::echo(ostream &out){
- uchar *cursor = cur;
+ char *cursor = cur;
tok = cursor;
echo:
{
int Scanner::scan(){
- uchar *cursor = cur;
+ char *cursor = cur;
uint depth;
scan:
#line 1 "parser.y"
+/* $Id$ */
+
#include <time.h>
#include <iostream.h>
#include <string.h>
static RegExp *spec;
static Scanner *in;
+/* Bison version 1.875 emits a definition that is not working
+ * with several g++ version. Hence we disable it here.
+ */
+#if defined(__GNUC__)
+#define __attribute__(x)
+#endif
+
-#line 26 "parser.y"
+#line 35 "parser.y"
#ifndef YYSTYPE
typedef union {
Symbol *symbol;
/* 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
+ 0, 53, 56, 58, 61, 67, 71, 73, 77, 79,
+ 83, 85, 92, 94, 98, 100, 116, 118, 122, 126,
+ 128, 130
};
#endif
switch (yyn) {
case 1:
-#line 45 "parser.y"
+#line 54 "parser.y"
{ accept = 0;
- spec = NULL; ;
- break;}
+ spec = NULL; }
+ break;
case 2:
-#line 48 "parser.y"
-{ spec = spec? mkAlt(spec, yyvsp[0].regexp) : yyvsp[0].regexp; ;
- break;}
+#line 57 "parser.y"
+{ spec = spec? mkAlt(spec, yyvsp[0].regexp) : yyvsp[0].regexp; }
+ break;
case 4:
-#line 53 "parser.y"
+#line 62 "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 59 "parser.y"
-{ yyval.regexp = new RuleOp(yyvsp[-2].regexp, yyvsp[-1].regexp, yyvsp[0].token, accept++); ;
- break;}
+#line 68 "parser.y"
+{ yyval.regexp = new RuleOp(yyvsp[-2].regexp, yyvsp[-1].regexp, yyvsp[0].token, accept++); }
+ break;
case 6:
-#line 63 "parser.y"
-{ yyval.regexp = new NullOp; ;
- break;}
+#line 72 "parser.y"
+{ yyval.regexp = new NullOp; }
+ break;
case 7:
-#line 65 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; ;
- break;}
+#line 74 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; }
+ break;
case 8:
-#line 69 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; ;
- break;}
+#line 78 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; }
+ break;
case 9:
-#line 71 "parser.y"
-{ yyval.regexp = mkAlt(yyvsp[-2].regexp, yyvsp[0].regexp); ;
- break;}
+#line 80 "parser.y"
+{ yyval.regexp = mkAlt(yyvsp[-2].regexp, yyvsp[0].regexp); }
+ break;
case 10:
-#line 75 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; ;
- break;}
+#line 84 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; }
+ break;
case 11:
-#line 77 "parser.y"
+#line 86 "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 84 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; ;
- break;}
+#line 93 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; }
+ break;
case 13:
-#line 86 "parser.y"
-{ yyval.regexp = new CatOp(yyvsp[-1].regexp, yyvsp[0].regexp); ;
- break;}
+#line 95 "parser.y"
+{ yyval.regexp = new CatOp(yyvsp[-1].regexp, yyvsp[0].regexp); }
+ break;
case 14:
-#line 90 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; ;
- break;}
+#line 99 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; }
+ break;
case 15:
-#line 92 "parser.y"
+#line 101 "parser.y"
{
switch(yyvsp[0].op){
case '*':
yyval.regexp = mkAlt(yyvsp[-1].regexp, new NullOp());
break;
}
- ;
- break;}
+ }
+ break;
case 16:
-#line 108 "parser.y"
-{ yyval.op = yyvsp[0].op; ;
- break;}
+#line 117 "parser.y"
+{ yyval.op = yyvsp[0].op; }
+ break;
case 17:
-#line 110 "parser.y"
-{ yyval.op = (yyvsp[-1].op == yyvsp[0].op) ? yyvsp[-1].op : '*'; ;
- break;}
+#line 119 "parser.y"
+{ yyval.op = (yyvsp[-1].op == yyvsp[0].op) ? yyvsp[-1].op : '*'; }
+ break;
case 18:
-#line 114 "parser.y"
+#line 123 "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 118 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; ;
- break;}
+#line 127 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; }
+ break;
case 20:
-#line 120 "parser.y"
-{ yyval.regexp = yyvsp[0].regexp; ;
- break;}
+#line 129 "parser.y"
+{ yyval.regexp = yyvsp[0].regexp; }
+ break;
case 21:
-#line 122 "parser.y"
-{ yyval.regexp = yyvsp[-1].regexp; ;
- break;}
+#line 131 "parser.y"
+{ yyval.regexp = yyvsp[-1].regexp; }
+ break;
}
#line 705 "/usr/share/bison/bison.simple"
#endif
return yyresult;
}
-#line 125 "parser.y"
+#line 134 "parser.y"
extern "C" {
+./"
+./" $Id$
+./"
+.TH RE2C 1 "8 April 1994" "Version 0.9.2"
.ds re \fBre2c\fP
.ds le \fBlex\fP
.ds rx regular expression
.ds lx \fIl\fP-expression
-.TH RE2C 1 "8 April 1994" "Version 0.5"
\"$Log$
-\"Revision 1.1 2003/12/13 04:58:20 nuffer
-\"Initial revision
+\"Revision 1.2 2004/01/31 17:02:47 nuffer
+\"Fixed things so they compile.
+\"
+\"Revision 1.1 2004/01/31 15:44:39 nuffer
+\"Applied patch from Marcus Boerger
\"
\"Revision 1.2 1994/04/16 15:50:32 peter
\"Fix bug in simple example.
-/* Generated by re2c 0.9.2 on Sun Jan 11 21:32:00 2004 */
+/* Generated by re2c 0.5 on Sat May 15 11:35:52 1999 */
#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"
return cursor;
}
-#line 67 "scanner.re"
+#line 68
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;
yych = *(YYMARKER = ++YYCURSOR);
if(yych == '*') goto yy7;
yy3:
-#line 86 "scanner.re"
-{ goto echo; }
-#line 24 "re2c-output.c"
+#line 82
+ { goto echo; }
yy4: yych = *++YYCURSOR;
yy5:
-#line 82 "scanner.re"
-{ if(cursor == eof) RETURN(0);
- out.write((char *)tok, cursor - tok);
+#line 78
+ { if(cursor == eof) RETURN(0);
+ out.write(tok, cursor - tok);
tok = pos = cursor; cline++;
goto echo; }
-#line 32 "re2c-output.c"
yy6: yych = *++YYCURSOR;
goto yy3;
yy7: yych = *++YYCURSOR;
if(yych != 'c') goto yy8;
yy13: yych = *++YYCURSOR;
yy14:
-#line 79 "scanner.re"
-{ out.write((char *)tok, &cursor[-7] - tok);
+#line 75
+ { out.write(tok, &cursor[-7] - tok);
tok = cursor;
RETURN(1); }
-#line 55 "re2c-output.c"
}
-#line 87 "scanner.re"
+#line 83
}
tchar = cursor - pos;
tline = cline;
tok = cursor;
-
-#line 59 "re2c-output.c"
{
YYCTYPE yych;
unsigned int yyaccept;
}
yy17: yych = *++YYCURSOR;
yy18:
-#line 100 "scanner.re"
-{ depth = 1;
+#line 96
+ { depth = 1;
goto code;
}
-#line 119 "re2c-output.c"
yy19: yych = *++YYCURSOR;
if(yych == '*') goto yy54;
yy20:
-#line 119 "scanner.re"
-{ RETURN(*tok); }
-#line 125 "re2c-output.c"
+#line 115
+ { RETURN(*tok); }
yy21: yych = *++YYCURSOR;
if(yych == '/') goto yy52;
yy22:
-#line 121 "scanner.re"
-{ yylval.op = *tok;
+#line 117
+ { yylval.op = *tok;
RETURN(CLOSE); }
-#line 132 "re2c-output.c"
yy23: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if(yych != '\n') goto yy48;
yy24:
-#line 112 "scanner.re"
-{ fatal("bad string"); }
-#line 139 "re2c-output.c"
+#line 108
+ { fatal("bad string"); }
yy25: yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR);
if(yych != '\n') goto yy42;
yy26:
-#line 117 "scanner.re"
-{ fatal("bad character constant"); }
-#line 146 "re2c-output.c"
+#line 113
+ { fatal("bad character constant"); }
yy27: yych = *++YYCURSOR;
goto yy20;
yy28: yych = *++YYCURSOR;
yy29: yych = *++YYCURSOR;
goto yy40;
yy30:
-#line 124 "scanner.re"
-{ cur = cursor;
+#line 120
+ { cur = cursor;
yylval.symbol = Symbol::find(token());
return ID; }
-#line 158 "re2c-output.c"
yy31: yych = *++YYCURSOR;
goto yy38;
yy32:
-#line 128 "scanner.re"
-{ goto scan; }
-#line 164 "re2c-output.c"
+#line 124
+ { goto scan; }
yy33: yych = *++YYCURSOR;
yy34:
-#line 130 "scanner.re"
-{ if(cursor == eof) RETURN(0);
+#line 126
+ { if(cursor == eof) RETURN(0);
pos = cursor; cline++;
goto scan;
}
-#line 172 "re2c-output.c"
yy35: yych = *++YYCURSOR;
yy36:
-#line 135 "scanner.re"
-{ cerr << "unexpected character: " << *tok << endl;
+#line 131
+ { cerr << "unexpected character: " << *tok << endl;
goto scan;
}
-#line 179 "re2c-output.c"
yy37: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy41;
yy45: yych = *++YYCURSOR;
yy46:
-#line 114 "scanner.re"
-{ cur = cursor;
+#line 110
+ { cur = cursor;
yylval.regexp = ranToRE(token());
return RANGE; }
-#line 225 "re2c-output.c"
yy47: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
goto yy47;
yy50: yych = *++YYCURSOR;
yy51:
-#line 109 "scanner.re"
-{ cur = cursor;
+#line 105
+ { cur = cursor;
yylval.regexp = strToRE(token());
return STRING; }
-#line 247 "re2c-output.c"
yy52: yych = *++YYCURSOR;
yy53:
-#line 106 "scanner.re"
-{ tok = cursor;
+#line 102
+ { tok = cursor;
RETURN(0); }
-#line 253 "re2c-output.c"
yy54: yych = *++YYCURSOR;
yy55:
-#line 103 "scanner.re"
-{ depth = 1;
+#line 99
+ { depth = 1;
goto comment; }
-#line 259 "re2c-output.c"
}
-#line 138 "scanner.re"
+#line 134
code:
-
-#line 263 "re2c-output.c"
{
YYCTYPE yych;
unsigned int yyaccept;
}
yy58: yych = *++YYCURSOR;
yy59:
-#line 142 "scanner.re"
-{ if(--depth == 0){
+#line 138
+ { 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 148 "scanner.re"
-{ ++depth;
+#line 144
+ { ++depth;
goto code; }
-#line 304 "re2c-output.c"
yy62: yych = *++YYCURSOR;
yy63:
-#line 150 "scanner.re"
-{ if(cursor == eof) fatal("missing '}'");
+#line 146
+ { if(cursor == eof) fatal("missing '}'");
pos = cursor; cline++;
goto code;
}
-#line 312 "re2c-output.c"
yy64: yych = *++YYCURSOR;
yy65:
-#line 154 "scanner.re"
-{ goto code; }
-#line 317 "re2c-output.c"
+#line 150
+ { goto code; }
yy66: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if(yych == '\n') goto yy65;
if(yych == '\n') goto yy70;
goto yy72;
}
-#line 155 "scanner.re"
+#line 151
comment:
-
-#line 363 "re2c-output.c"
{
YYCTYPE yych;
unsigned int yyaccept;
yy77: yych = *++YYCURSOR;
if(yych == '/') goto yy85;
yy78:
-#line 169 "scanner.re"
-{ goto comment; }
-#line 385 "re2c-output.c"
+#line 165
+ { goto comment; }
yy79: yych = *++YYCURSOR;
if(yych == '*') goto yy83;
goto yy78;
yy80: yych = *++YYCURSOR;
yy81:
-#line 165 "scanner.re"
-{ if(cursor == eof) RETURN(0);
+#line 161
+ { 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 163 "scanner.re"
-{ ++depth;
+#line 159
+ { ++depth;
goto comment; }
-#line 404 "re2c-output.c"
yy85: yych = *++YYCURSOR;
yy86:
-#line 159 "scanner.re"
-{ if(--depth == 0)
+#line 155
+ { if(--depth == 0)
goto scan;
else
goto comment; }
-#line 412 "re2c-output.c"
}
-#line 170 "scanner.re"
+#line 166
}
class Scanner {
private:
int in;
- uchar *bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof;
+ char *bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof;
uint tchar, tline, cline;
private:
- uchar *fill(uchar*);
+ char *fill(char*);
public:
Scanner(int);
int echo(ostream&);
#define BSIZE 8192
-#define YYCTYPE uchar
+#define YYCTYPE char
#define YYCURSOR cursor
#define YYLIMIT lim
#define YYMARKER ptr
;
}
-uchar *Scanner::fill(uchar *cursor){
+char *Scanner::fill(char *cursor){
if(!eof){
uint cnt = tok - bot;
if(cnt){
lim -= cnt;
}
if((top - lim) < BSIZE){
- uchar *buf = new uchar[(lim - bot) + BSIZE];
+ char *buf = new char[(lim - bot) + BSIZE];
memcpy(buf, tok, lim - tok);
tok = buf;
ptr = &buf[ptr - bot];
*/
int Scanner::echo(ostream &out){
- uchar *cursor = cur;
+ char *cursor = cur;
// Catch EOF
if (eof && cursor == eof)
int Scanner::scan(){
- uchar *cursor = cur;
+ char *cursor = cur;
uint depth;
scan:
-#define CLOSE 257
-#define ID 258
-#define CODE 259
-#define RANGE 260
-#define STRING 261
+#ifndef BISON_Y_TAB_H
+# define BISON_Y_TAB_H
+
+#ifndef YYSTYPE
typedef union {
Symbol *symbol;
RegExp *regexp;
Token *token;
char op;
-} YYSTYPE;
+} 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_Y_TAB_H */