diff options
author | Mike Buland <eichlan@xagasoft.com> | 2006-07-31 08:07:12 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2006-07-31 08:07:12 +0000 |
commit | 9139f1df4cda80b91ab68e5de27e85eaa4c54682 (patch) | |
tree | 87fadb2618ee8228f7184aa14bfa2b21741e3f49 /src/build.y | |
parent | 113fc467a7170a8a564049c64d1036dd10e6abac (diff) | |
download | build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.tar.gz build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.tar.bz2 build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.tar.xz build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.zip |
I still can't get the pymake file to auto-make the bison and flex .c files, but
besides that everything is looking great. There's only one thing left to parse
and interpret before we can try actually building something.
Diffstat (limited to 'src/build.y')
-rw-r--r-- | src/build.y | 142 |
1 files changed, 121 insertions, 21 deletions
diff --git a/src/build.y b/src/build.y index 45a84f1..8345b1f 100644 --- a/src/build.y +++ b/src/build.y | |||
@@ -4,6 +4,8 @@ | |||
4 | # include "builder.h" | 4 | # include "builder.h" |
5 | # include "action.h" | 5 | # include "action.h" |
6 | # include "command.h" | 6 | # include "command.h" |
7 | # include "rule.h" | ||
8 | # include "filetarget.h" | ||
7 | # include "build.tab.h" | 9 | # include "build.tab.h" |
8 | void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ); | 10 | void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ); |
9 | %} | 11 | %} |
@@ -28,25 +30,25 @@ void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ); | |||
28 | %token <strval> REGEXP "regular expression" | 30 | %token <strval> REGEXP "regular expression" |
29 | 31 | ||
30 | %token TOK_ADDSET "+=" | 32 | %token TOK_ADDSET "+=" |
31 | %token TOK_DEFAULT "keyword 'default'" | 33 | %token TOK_DEFAULT "default" |
32 | %token TOK_ACTION "keyword 'action'" | 34 | %token TOK_ACTION "action" |
33 | %token TOK_CREATE "keyword 'create'" | 35 | %token TOK_CREATE "create" |
34 | %token TOK_FILE "keyword 'file'" | 36 | %token TOK_FILE "file" |
35 | %token TOK_FROM "keyword 'from'" | 37 | %token TOK_FROM "from" |
36 | %token TOK_FILES "keyword 'files'" | 38 | %token TOK_FILES "files" |
37 | %token TOK_IN "keyword 'in'" | 39 | %token TOK_IN "in" |
38 | %token TOK_USING "keyword 'using'" | 40 | %token TOK_USING "using" |
39 | %token TOK_RULE "keyword 'rule'" | 41 | %token TOK_RULE "rule" |
40 | %token TOK_REQUIRES "keyword 'requires'" | 42 | %token TOK_REQUIRES "requires" |
41 | %token TOK_FOR "keyword 'for'" | 43 | %token TOK_FOR "for" |
42 | %token TOK_SET "keyword 'set'" | 44 | %token TOK_SET "set" |
43 | %token TOK_MATCHES "keyword 'matches'" | 45 | %token TOK_MATCHES "matches" |
44 | %token TOK_ALL "keyword 'all'" | 46 | %token TOK_ALL "all" |
45 | %token TOK_ONE "keyword 'one'" | 47 | %token TOK_ONE "one" |
46 | %token TOK_PERFORM "keyword 'perform'" | 48 | %token TOK_PERFORM "perform" |
47 | %token TOK_PRODUCES "keyword 'produces'" | 49 | %token TOK_PRODUCES "produces" |
48 | %token TOK_COMMAND "keyword 'command'" | 50 | %token TOK_COMMAND "command" |
49 | %token TOK_CHECK "keyword 'check'" | 51 | %token TOK_CHECK "check" |
50 | %token TOK_EOL "end of line" | 52 | %token TOK_EOL "end of line" |
51 | %token ',' ':' '=' | 53 | %token ',' ':' '=' |
52 | 54 | ||
@@ -73,9 +75,40 @@ line: TOK_DEFAULT TOK_ACTION ':' | |||
73 | } | 75 | } |
74 | actionlst | 76 | actionlst |
75 | | TOK_CREATE createwhat TOK_FROM createfrom TOK_USING createusing | 77 | | TOK_CREATE createwhat TOK_FROM createfrom TOK_USING createusing |
78 | | STRING TOK_REQUIRES | ||
79 | { | ||
80 | bld.setTmp( $1 ); | ||
81 | } | ||
82 | reqlst | ||
83 | | listcmds | ||
84 | | TOK_FOR STRING | ||
85 | { | ||
86 | bld.setContext( $2 ); | ||
87 | } | ||
88 | listcmds | ||
89 | { | ||
90 | bld.setContext(); | ||
91 | } | ||
92 | | rule | ||
76 | ; | 93 | ; |
77 | 94 | ||
78 | createwhat: TOK_FILE STRING { printf("target: %s\n", $2 ); } | 95 | reqlst: STRING |
96 | { | ||
97 | bld.requires( bld.getTmp(), $1 ); | ||
98 | } | ||
99 | | reqlst ',' STRING | ||
100 | { | ||
101 | bld.requires( bld.getTmp(), $3 ); | ||
102 | } | ||
103 | ; | ||
104 | |||
105 | listcmds: TOK_SET setexpr | ||
106 | ; | ||
107 | |||
108 | createwhat: TOK_FILE STRING | ||
109 | { | ||
110 | bld.add( new FileTarget( $2 ) ); | ||
111 | } | ||
79 | ; | 112 | ; |
80 | 113 | ||
81 | createfrom: TOK_FILES TOK_IN createfromdirlst | 114 | createfrom: TOK_FILES TOK_IN createfromdirlst |
@@ -88,7 +121,10 @@ createfromdirlst: createfromdir | |||
88 | createfromdir: STRING { printf(" srcdir: %s\n", $1 ); } | 121 | createfromdir: STRING { printf(" srcdir: %s\n", $1 ); } |
89 | ; | 122 | ; |
90 | 123 | ||
91 | createusing: TOK_RULE STRING { printf(" rule: %s\n", $2 ); } | 124 | createusing: TOK_RULE STRING |
125 | { | ||
126 | bld.lastTarget()->setRule( $2 ); | ||
127 | } | ||
92 | ; | 128 | ; |
93 | 129 | ||
94 | actionlst: action | 130 | actionlst: action |
@@ -101,6 +137,70 @@ action: TOK_CHECK STRING | |||
101 | } | 137 | } |
102 | ; | 138 | ; |
103 | 139 | ||
140 | setexpr: STRING '=' STRING | ||
141 | { | ||
142 | bld.varSet( $1, $3 ); | ||
143 | } | ||
144 | | STRING TOK_ADDSET STRING | ||
145 | { | ||
146 | bld.varAddSet( $1, $3 ); | ||
147 | } | ||
148 | ; | ||
149 | |||
150 | rule: TOK_RULE STRING | ||
151 | { | ||
152 | bld.add( new Rule( $2 ) ); | ||
153 | } | ||
154 | rulesublst TOK_PERFORM rulecompletion | ||
155 | ; | ||
156 | |||
157 | rulesublst: rulesub | ||
158 | | rulesublst rulesub | ||
159 | ; | ||
160 | |||
161 | rulesub: TOK_MATCHES rulematches | ||
162 | | TOK_PRODUCES STRING | ||
163 | { | ||
164 | bld.lastRule()->setProduces( $2 ); | ||
165 | } | ||
166 | ; | ||
167 | |||
168 | rulematches: TOK_ALL REGEXP | ||
169 | { | ||
170 | try | ||
171 | { | ||
172 | bld.lastRule()->setMatches( Rule::matchAll, $2 ); | ||
173 | } | ||
174 | catch( BuildException &e ) | ||
175 | { | ||
176 | std::string s("RegExp compile error: "); | ||
177 | s += e.what(); | ||
178 | yyerror( &yyloc, bld, s.c_str() ); | ||
179 | return 1; | ||
180 | } | ||
181 | } | ||
182 | | TOK_ONE REGEXP | ||
183 | { | ||
184 | try | ||
185 | { | ||
186 | bld.lastRule()->setMatches( Rule::matchOne, $2 ); | ||
187 | } | ||
188 | catch( BuildException &e ) | ||
189 | { | ||
190 | std::string s("RegExp compile error: "); | ||
191 | s += e.what(); | ||
192 | yyerror( &yyloc, bld, s.c_str() ); | ||
193 | return 1; | ||
194 | } | ||
195 | } | ||
196 | ; | ||
197 | |||
198 | rulecompletion: TOK_COMMAND STRING | ||
199 | { | ||
200 | bld.lastRule()->setPerforms( Rule::perfCommand, $2 ); | ||
201 | } | ||
202 | ; | ||
203 | |||
104 | %% | 204 | %% |
105 | 205 | ||
106 | void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ) | 206 | void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ) |