add some hacky code to allow passing sfc files with -b
[openc2e.git] / cataloglexer.re2c
blobe8d9f31c37e11f4ce735840a2a83d33484b35f5d
1 // vim: set ft=cpp noet ts=4 sw=4 :
3 // make sure we have the header imports that bison's horrible .h file needs
4 #include <string>
5 #include <list>
7 #include "catalogue.tab.hpp"
8 #include "Catalogue.h"
9 #include <cctype>
10 #include <sstream>
11 #include <cassert>
13 const char *Catalogue::catalogue_parse_p = NULL;
14 int Catalogue::yylineno = -1;
16 void Catalogue::yyinit(const char *buf) {
17         catalogue_parse_p = buf;
18         yylineno = 1;
21 int Catalogue::catalex() {
22         const char *basep;
23         const char *YYMARKER;
24         assert(catalogue_parse_p);
25 start:
26         basep = catalogue_parse_p;
27         
28         /*!re2c
29 re2c:define:YYCTYPE = "unsigned char";
30 re2c:define:YYCURSOR = catalogue_parse_p;
31 re2c:yyfill:enable = 0;
32 re2c:yych:conversion = 1;
33 re2c:indent:top = 1;
35 any                     = [\001-\377];
36 eoi                     = [\000];
37 comment         = [#*][^\r\n\000]*;
38 whitespace  = ( comment | [ \t\r] ) *;
39 newline         = [\n];
40 tag                     = "TAG";
41 array           = "ARRAY";
42 override        = "OVERRIDE";
43 number          = [0-9]+;
44 quote           = ["];
45 backslash   = [\\];
47 eoi { goto eoi; }
48 whitespace { goto start; }
49 newline { yylineno++; goto start; }
50 tag { return CTOK_TAG; }
51 array { return CTOK_ARRAY; }
52 override { return CTOK_OVERRIDE; }
53 number { catalval.number = atoi(basep); return CTOK_INT; }
54 quote { goto str; }
55 any { catalogueParseError(); }
57 str:
58         {
59                 std::ostringstream temp;
60 strloop:
61                 basep = catalogue_parse_p;
63 /*!re2c
64         backslash any { temp << catalogue_descape(basep[1]); goto strloop; }
65         quote { catalval.string = new std::string(temp.str()); return CTOK_STR; }
66         backslash ? eoi { catalogueParseError("premature end of input"); }
67         newline { temp << basep[0]; yylineno++; goto strloop; }
68         any { temp << basep[0]; goto strloop; }
70         }
71 eoi:
72         {
73                 catalogue_parse_p = NULL;
74                 return 0;
75         }