aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2006-07-30 06:39:27 +0000
committerMike Buland <eichlan@xagasoft.com>2006-07-30 06:39:27 +0000
commit900976d2d74e0de57858b265c2ef0d17a29e921a (patch)
tree3d7e0c804b2bb5163d2998158b7c1f6e1891240c
parent28e92029752693ffe33de12c10de3e7bd39a3c94 (diff)
downloadbuild-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.
-rw-r--r--pymake.conf88
-rw-r--r--src/build.l77
-rw-r--r--src/build.y91
-rw-r--r--src/builder.cpp34
-rw-r--r--src/builder.h36
-rw-r--r--src/main.cpp9
6 files changed, 331 insertions, 4 deletions
diff --git a/pymake.conf b/pymake.conf
new file mode 100644
index 0000000..83d9885
--- /dev/null
+++ b/pymake.conf
@@ -0,0 +1,88 @@
1### pymake by ~3o~ph()g (neonphog.com) ###
2## This skeleton file was generated by pymake... please edit for your project.
3
4## Global flag section, uncomment to set flags which will be applied to all
5CXXFLAGS: -Ilibbu++/src
6LDFLAGS: -Llibbu++ -lbu++
7
8## A simple command to build everything in this directory, and output
9## an executable with the name 'main'
10[BUILD]
11DIR: src
12COMMAND: exe
13OUTPUT: build
14
15## To run a command, like a legacy 'make' command, issue the following:
16#[RUN]
17#COMMAND: make -C testsrc/legacy #this command will normally be run
18#CLEAN: make -C testsrc/legacy clean #this command will be run on '-c'
19
20## A more complicated build example
21#[BUILD]
22#COMMAND: exe
23#OUTPUT: the_one
24#DIR: testsrc/one
25#FILE: testsrc/share/test.cpp
26#CXXFLAGS: -Itestsrc/share
27#LDFLAGS: -lreadline
28
29## The [DIRBUILD] macro expands into many [BUILD] sections:
30#[DIRBUILD]
31#COMMAND: exe
32#OUTPUT: db{NAME}.so #{NAME} will be replaced with the directory name
33#ROOT: testsrc/db
34#CXXFLAGS -Itestsrc/share
35#LDFLAGS: -lreadline
36
37## The [OVERRIDE] directive allows you to append flags to specific targets
38#[OVERRIDE]
39#FILE: testsrc/db/mysql/main.o
40#CXXFLAGS: -I../..
41
42### The following are the build commands and triggers ###
43### These are the default gnu g++ build commands ###
44
45### Compile trigger ###
46## Takes c++ source code, builds an object file
47## Includes function for dependancy checking
48[TRIGGER]
49INPUT: .cpp #take input of *.cpp files
50OUTPUT: .o #output .o files
51COMMAND: g++ -c {INPUT} {CXXFLAGS} -I{DIR} -o {OUTPUT}
52CHECK: g++ -M {INPUT} {CXXFLAGS} -I{DIR}
53
54[TRIGGER]
55INPUT: .c #take input of *.cpp files
56OUTPUT: .o #output .o files
57COMMAND: g++ -c {INPUT} {CXXFLAGS} -I{DIR} -o {OUTPUT}
58CHECK: g++ -M {INPUT} {CXXFLAGS} -I{DIR}
59
60[TRIGGER]
61INPUT .y
62OUTPUT: .tab.c
63COMMAND: bison {INPUT}
64
65[TRIGGER]
66INPUT .l
67OUTPUT: .yy.c
68COMMAND: flex --bison-bridge -o {OUTPUT} {INPUT}
69
70### Executable command ###
71## Use this command if you want a simple executable
72[COMMAND]
73NAME: exe
74COMMAND: g++ {INPUT} {LDFLAGS} -o {OUTPUT}
75
76### Library command ###
77## Use this command if you wish to create a library
78[COMMAND]
79NAME: lib
80COMMAND: ar cr{ARFLAGS} {OUTPUT} {INPUT}
81
82### Strange example ###
83## The following trigger will take all *.q files, strip all '&'s from them
84## and generate a .cpp file, which will then be compiled using the cpp trigger.
85#[TRIGGER]
86#INPUT: .q
87#OUTPUT: .cpp
88#COMMAND: sed -e "s/&//g" {INPUT} > {OUTPUT}
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
7std::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
90void Builder::scanBegin()
91{
92 if( !(yyin = fopen( file.c_str(), "r" )) )
93 error( std::string("cannot open ") + file );
94}
28 95
29\/\/.* 96void 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
52input:
53 | input line
54 ;
55
56line: stuff TOK_EOL { printf("\n"); }
57 ;
58
59stuff:
60 | stuff token
61 ;
62
63token: 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
86void 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
6Builder::Builder()
7{
8}
9
10Builder::~Builder()
11{
12}
13
14void 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
25void Builder::error( const yy::location &l, const std::string &m )
26{
27 std::cerr << l << ": " << m << std::endl;
28}
29
30void 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
6union YYSTYPE;
7
8namespace yy
9{
10 class location;
11 class BuildParser;
12}
13class Builder;
14
15#define YY_DECL int yylex( YYSTYPE *yylval_param, yy::location *yylloc, Builder &bld )
16YY_DECL;
17
18class Builder
19{
20public:
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
31private:
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
3int main()
4{
5 Builder bld;
6
7 bld.load("congo");
8}
9