diff options
author | Mike Buland <eichlan@xagasoft.com> | 2006-07-30 06:39:27 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2006-07-30 06:39:27 +0000 |
commit | 900976d2d74e0de57858b265c2ef0d17a29e921a (patch) | |
tree | 3d7e0c804b2bb5163d2998158b7c1f6e1891240c /src | |
parent | 28e92029752693ffe33de12c10de3e7bd39a3c94 (diff) | |
download | build-900976d2d74e0de57858b265c2ef0d17a29e921a.tar.gz build-900976d2d74e0de57858b265c2ef0d17a29e921a.tar.bz2 build-900976d2d74e0de57858b265c2ef0d17a29e921a.tar.xz build-900976d2d74e0de57858b265c2ef0d17a29e921a.zip |
Found out all of the c++ stuff in bison broke in 2.2, now we have to pick a
version, there is no way around it nicely.
Diffstat (limited to 'src')
-rw-r--r-- | src/build.l | 77 | ||||
-rw-r--r-- | src/build.y | 91 | ||||
-rw-r--r-- | src/builder.cpp | 34 | ||||
-rw-r--r-- | src/builder.h | 36 | ||||
-rw-r--r-- | src/main.cpp | 9 |
5 files changed, 243 insertions, 4 deletions
diff --git a/src/build.l b/src/build.l index 6daaa94..6a80f45 100644 --- a/src/build.l +++ b/src/build.l | |||
@@ -1,4 +1,20 @@ | |||
1 | int lineNum = 1; | 1 | %{ |
2 | # include <string> | ||
3 | # include "builder.h" | ||
4 | # include "build.tab.h" | ||
5 | # include "stringrep.h" | ||
6 | |||
7 | std::string strbuf; | ||
8 | %} | ||
9 | |||
10 | %x strsq | ||
11 | %x strdq | ||
12 | %x comment | ||
13 | %option noyywrap nounput batch debug | ||
14 | |||
15 | %{ | ||
16 | # define YY_USER_ACTION yylloc->columns (yyleng); | ||
17 | %} | ||
2 | %% | 18 | %% |
3 | 19 | ||
4 | [,:=] return yytext[0]; | 20 | [,:=] return yytext[0]; |
@@ -23,9 +39,62 @@ | |||
23 | "produces" return TOK_PRODUCES; | 39 | "produces" return TOK_PRODUCES; |
24 | "command" return TOK_COMMAND; | 40 | "command" return TOK_COMMAND; |
25 | 41 | ||
42 | "..."\n /* elipsis line continuation */ | ||
26 | \n+ return TOX_EOL; | 43 | \n+ return TOX_EOL; |
27 | [ \t\r]* | 44 | [ \t\r]* /* whitespace */ |
45 | |||
46 | \/\/.* /* single line comment */ | ||
47 | "#".* /* single line comment */ | ||
48 | |||
49 | [^ \t\r\n\'\"]+ { | ||
50 | yylval.strval = stringdup( yytext ); | ||
51 | return STRING; | ||
52 | } | ||
53 | |||
54 | \" { | ||
55 | BEGIN( strdq ); | ||
56 | strbuf = ""; | ||
57 | } | ||
58 | \' { | ||
59 | BEGIN( strsq ); | ||
60 | strbuf = ""; | ||
61 | } | ||
62 | |||
63 | <strdq>[^\\\n\"]+ { | ||
64 | strbuf += yytext; | ||
65 | } | ||
66 | |||
67 | <strsq>[^\\\n\']+ { | ||
68 | strbuf += yytext; | ||
69 | } | ||
70 | |||
71 | <strdq,strsq>\\n strbuf += "\n"; | ||
72 | <strdq,strsq>\\t strbuf += "\t"; | ||
73 | <strdq,strsq>\\r strbuf += "\r"; | ||
74 | <strdq,strsq>\\b strbuf += "\b"; | ||
75 | <strdq,strsq>\\f strbuf += "\f"; | ||
76 | |||
77 | <strdq>\" { | ||
78 | BEGIN( INITIAL ); | ||
79 | yylval->strval = stringdup( strbuf.c_str() ); | ||
80 | return STRING; | ||
81 | } | ||
82 | |||
83 | <strsq>\' { | ||
84 | BEGIN( INITIAL ); | ||
85 | yylval->strval = stringdup( strbuf.c_str() ); | ||
86 | return STRING; | ||
87 | } | ||
88 | |||
89 | |||
90 | void Builder::scanBegin() | ||
91 | { | ||
92 | if( !(yyin = fopen( file.c_str(), "r" )) ) | ||
93 | error( std::string("cannot open ") + file ); | ||
94 | } | ||
28 | 95 | ||
29 | \/\/.* | 96 | void Builder::scanEnd() |
30 | "#".* | 97 | { |
98 | fclose( yyin ); | ||
99 | } | ||
31 | 100 | ||
diff --git a/src/build.y b/src/build.y index e69de29..600b923 100644 --- a/src/build.y +++ b/src/build.y | |||
@@ -0,0 +1,91 @@ | |||
1 | %skeleton "lalr1.cc" | ||
2 | %define "parser_class_name" "BuildParser" | ||
3 | %defines | ||
4 | %{ | ||
5 | # include <string> | ||
6 | # include "builder.h" | ||
7 | # include "build.tab.h" | ||
8 | %} | ||
9 | |||
10 | %parse-param { Builder &bld } | ||
11 | %lex-param { Builder &bld } | ||
12 | |||
13 | %locations | ||
14 | %initial-action | ||
15 | { | ||
16 | @$.begin.filename = @$.end.filename = &bld.file; | ||
17 | } | ||
18 | |||
19 | %debug | ||
20 | %error-verbose | ||
21 | %union { | ||
22 | char *strval; | ||
23 | } | ||
24 | |||
25 | %token <strval> STRING "string literal" | ||
26 | |||
27 | %token TOK_ADDSET "+=" | ||
28 | %token TOK_DEFAULT "keyword 'default'" | ||
29 | %token TOK_ACTION "keyword 'action'" | ||
30 | %token TOK_CREATE "keyword 'create'" | ||
31 | %token TOK_FILE "keyword 'file'" | ||
32 | %token TOK_FROM "keyword 'from'" | ||
33 | %token TOK_FILES "keyword 'files'" | ||
34 | %token TOK_IN "keyword 'in'" | ||
35 | %token TOK_USING "keyword 'using'" | ||
36 | %token TOK_RULE "keyword 'rule'" | ||
37 | %token TOK_REQUIRES "keyword 'requires'" | ||
38 | %token TOK_FOR "keyword 'for'" | ||
39 | %token TOK_SET "keyword 'set'" | ||
40 | %token TOK_MATCHES "keyword 'matches'" | ||
41 | %token TOK_ALL "keyword 'all'" | ||
42 | %token TOK_ONE "keyword 'one'" | ||
43 | %token TOK_PERFORM "keyword 'perform'" | ||
44 | %token TOK_PRODUCES "keyword 'produces'" | ||
45 | %token TOK_COMMAND "keyword 'command'" | ||
46 | %token TOK_EOL "end of line" | ||
47 | |||
48 | %destructor { delete[] $$; } STRING | ||
49 | |||
50 | %% | ||
51 | |||
52 | input: | ||
53 | | input line | ||
54 | ; | ||
55 | |||
56 | line: stuff TOK_EOL { printf("\n"); } | ||
57 | ; | ||
58 | |||
59 | stuff: | ||
60 | | stuff token | ||
61 | ; | ||
62 | |||
63 | token: TOK_ADDSET { printf("+= "); } | ||
64 | | TOK_DEFAULT { printf("default "); } | ||
65 | | TOK_ACTION { printf("action "); } | ||
66 | | TOK_CREATE { printf("create "); } | ||
67 | | TOK_FILE { printf("file "); } | ||
68 | | TOK_FROM { printf("from "); } | ||
69 | | TOK_FILES { printf("files "); } | ||
70 | | TOK_IN { printf("in "); } | ||
71 | | TOK_USING { printf("using "); } | ||
72 | | TOK_RULE { printf("rule "); } | ||
73 | | TOK_REQUIRES { printf("requires "); } | ||
74 | | TOK_FOR { printf("for "); } | ||
75 | | TOK_SET { printf("set "); } | ||
76 | | TOK_MATCHES { printf("matches "); } | ||
77 | | TOK_ALL { printf("all "); } | ||
78 | | TOK_ONE { printf("one "); } | ||
79 | | TOK_PERFORM { printf("perform "); } | ||
80 | | TOK_PRODUCES { printf("produces "); } | ||
81 | | TOK_COMMAND { printf("command "); } | ||
82 | ; | ||
83 | |||
84 | %% | ||
85 | |||
86 | void yy::BuildParser::error( const yy::BuildParser::location_type &l, | ||
87 | const std::string &m ) | ||
88 | { | ||
89 | bld.error( l, m ); | ||
90 | } | ||
91 | |||
diff --git a/src/builder.cpp b/src/builder.cpp new file mode 100644 index 0000000..8c72fef --- /dev/null +++ b/src/builder.cpp | |||
@@ -0,0 +1,34 @@ | |||
1 | #include <iostream> | ||
2 | |||
3 | #include "builder.h" | ||
4 | #include "build.tab.h" | ||
5 | |||
6 | Builder::Builder() | ||
7 | { | ||
8 | } | ||
9 | |||
10 | Builder::~Builder() | ||
11 | { | ||
12 | } | ||
13 | |||
14 | void Builder::load( const char *sFN ) | ||
15 | { | ||
16 | file = sFN; | ||
17 | |||
18 | scanBegin(); | ||
19 | yy::BuildParser parser( *this ); | ||
20 | parser.set_debug_level( false ); | ||
21 | parser.parse(); | ||
22 | scanEnd(); | ||
23 | } | ||
24 | |||
25 | void Builder::error( const yy::location &l, const std::string &m ) | ||
26 | { | ||
27 | std::cerr << l << ": " << m << std::endl; | ||
28 | } | ||
29 | |||
30 | void Builder::error( const std::string &m ) | ||
31 | { | ||
32 | std::cerr << m << std::endl; | ||
33 | } | ||
34 | |||
diff --git a/src/builder.h b/src/builder.h new file mode 100644 index 0000000..e379608 --- /dev/null +++ b/src/builder.h | |||
@@ -0,0 +1,36 @@ | |||
1 | #ifndef BUILDER_H | ||
2 | #define BUILDER_H | ||
3 | |||
4 | #include <string> | ||
5 | |||
6 | union YYSTYPE; | ||
7 | |||
8 | namespace yy | ||
9 | { | ||
10 | class location; | ||
11 | class BuildParser; | ||
12 | } | ||
13 | class Builder; | ||
14 | |||
15 | #define YY_DECL int yylex( YYSTYPE *yylval_param, yy::location *yylloc, Builder &bld ) | ||
16 | YY_DECL; | ||
17 | |||
18 | class Builder | ||
19 | { | ||
20 | public: | ||
21 | Builder(); | ||
22 | virtual ~Builder(); | ||
23 | |||
24 | void load( const char *sFN ); | ||
25 | |||
26 | void error( const yy::location &l, const std::string &m ); | ||
27 | void error( const std::string &m ); | ||
28 | |||
29 | std::string file; | ||
30 | |||
31 | private: | ||
32 | void scanBegin(); | ||
33 | void scanEnd(); | ||
34 | }; | ||
35 | |||
36 | #endif | ||
diff --git a/src/main.cpp b/src/main.cpp index e69de29..7e130bc 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
@@ -0,0 +1,9 @@ | |||
1 | #include "builder.h" | ||
2 | |||
3 | int main() | ||
4 | { | ||
5 | Builder bld; | ||
6 | |||
7 | bld.load("congo"); | ||
8 | } | ||
9 | |||