diff options
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 ) |