diff options
Diffstat (limited to 'src/build.y')
| -rw-r--r-- | src/build.y | 285 |
1 files changed, 68 insertions, 217 deletions
diff --git a/src/build.y b/src/build.y index d1f3945..a624418 100644 --- a/src/build.y +++ b/src/build.y | |||
| @@ -20,268 +20,119 @@ void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ); | |||
| 20 | %error-verbose | 20 | %error-verbose |
| 21 | %union { | 21 | %union { |
| 22 | char *strval; | 22 | char *strval; |
| 23 | int tval; | ||
| 23 | } | 24 | } |
| 24 | 25 | ||
| 25 | %token <strval> STRING "string literal" | 26 | %token <strval> STRING "string literal" |
| 26 | %token <strval> REGEXP "regular expression" | 27 | %token <strval> REGEXP "regular expression" |
| 28 | %token <tval> TARGETTYPE "target type" | ||
| 29 | %token <strval> FUNCTION "function name" | ||
| 27 | 30 | ||
| 28 | %token TOK_ADDSET "+=" | 31 | %token TOK_ADDSET "+=" |
| 29 | %token TOK_DEFAULT "default" | 32 | %token TOK_DEFAULT "default" |
| 30 | %token TOK_ACTION "action" | 33 | %token TOK_ACTION "action" |
| 31 | %token TOK_CREATE "create" | 34 | %token TOK_CHECK "check" |
| 32 | %token TOK_FILE "file" | 35 | %token TOK_CLEAN "clean" |
| 33 | %token TOK_FROM "from" | ||
| 34 | %token TOK_FILES "files" | ||
| 35 | %token TOK_IN "in" | ||
| 36 | %token TOK_USING "using" | ||
| 37 | %token TOK_RULE "rule" | 36 | %token TOK_RULE "rule" |
| 38 | %token TOK_REQUIRES "requires" | 37 | %token TOK_TARGET "target" |
| 39 | %token TOK_FOR "for" | ||
| 40 | %token TOK_SET "set" | 38 | %token TOK_SET "set" |
| 39 | %token TOK_INPUT "input" | ||
| 40 | %token TOK_FILTER "filter" | ||
| 41 | %token TOK_PREFIX "prefix" | ||
| 42 | %token TOK_REQUIRES "requires" | ||
| 41 | %token TOK_MATCHES "matches" | 43 | %token TOK_MATCHES "matches" |
| 42 | %token TOK_MATCHING "matching" | ||
| 43 | %token TOK_ALL "all" | ||
| 44 | %token TOK_ONE "one" | ||
| 45 | %token TOK_PERFORM "perform" | 44 | %token TOK_PERFORM "perform" |
| 46 | %token TOK_PRODUCES "produces" | 45 | %token TOK_PRODUCES "produces" |
| 47 | %token TOK_COMMAND "command" | 46 | |
| 48 | %token TOK_CHECK "check" | ||
| 49 | %token TOK_CLEAN "clean" | ||
| 50 | %token TOK_DIRECTORIES "directories" | ||
| 51 | %token TOK_TARGETS "targets" | ||
| 52 | %token TOK_EOL "end of line" | ||
| 53 | %token ',' ':' '=' | 47 | %token ',' ':' '=' |
| 54 | 48 | ||
| 55 | %destructor { delete[] $$; } STRING | 49 | %destructor { delete[] $$; } STRING |
| 56 | 50 | ||
| 57 | %% | 51 | %% |
| 58 | 52 | ||
| 53 | // General input format | ||
| 59 | input: | 54 | input: |
| 60 | | input fullline | 55 | | input rule |
| 56 | | input action | ||
| 57 | | input target | ||
| 61 | ; | 58 | ; |
| 62 | 59 | ||
| 63 | fullline: TOK_EOL | 60 | // Rule interpretation |
| 64 | | line TOK_EOL | 61 | rule: TOK_RULE STRING ':' rulecmds |
| 65 | ; | ||
| 66 | |||
| 67 | line: TOK_DEFAULT TOK_ACTION ':' | ||
| 68 | { | ||
| 69 | bld.add( new Action() ); | ||
| 70 | } | ||
| 71 | actionlst | ||
| 72 | | STRING TOK_ACTION ':' | ||
| 73 | { | ||
| 74 | bld.add( new Action( $1 ) ); | ||
| 75 | } | ||
| 76 | actionlst | ||
| 77 | | TOK_FOR fortypes TOK_MATCHING REGEXP | ||
| 78 | { | ||
| 79 | bld.setFilter( $4 ); | ||
| 80 | } | ||
| 81 | augments | ||
| 82 | { | ||
| 83 | bld.endList(); | ||
| 84 | } | ||
| 85 | listcmds | ||
| 86 | | STRING TOK_REQUIRES | ||
| 87 | { | ||
| 88 | bld.setTmp( $1 ); | ||
| 89 | bld.requiresRegexp( false ); | ||
| 90 | } | ||
| 91 | reqcompletion | ||
| 92 | | REGEXP TOK_REQUIRES | ||
| 93 | { | ||
| 94 | bld.setTmp( $1 ); | ||
| 95 | bld.requiresRegexp( true ); | ||
| 96 | } | ||
| 97 | reqcompletion | ||
| 98 | | listcmds | ||
| 99 | | TOK_FOR STRING | ||
| 100 | { | ||
| 101 | bld.startList( STRING ); | ||
| 102 | bld.addListItem( $2 ); | ||
| 103 | } | ||
| 104 | listcmds | ||
| 105 | { | ||
| 106 | |||
| 107 | } | ||
| 108 | | rule | ||
| 109 | ; | 62 | ; |
| 110 | 63 | ||
| 111 | fortypes: TOK_DIRECTORIES | 64 | rulecmds: rulecmd |
| 112 | { | 65 | | rulecmds ',' rulecmd |
| 113 | bld.startList( TOK_DIRECTORIES ); | ||
| 114 | } | ||
| 115 | | TOK_TARGETS | ||
| 116 | { | ||
| 117 | bld.startList( TOK_TARGETS ); | ||
| 118 | } | ||
| 119 | | TOK_FILES | ||
| 120 | { | ||
| 121 | bld.startList( TOK_FILES ); | ||
| 122 | } | ||
| 123 | ; | ||
| 124 | |||
| 125 | augments: | ||
| 126 | | TOK_IN STRING | ||
| 127 | { | ||
| 128 | bld.augmentList( $2 ); | ||
| 129 | } | ||
| 130 | ; | 66 | ; |
| 131 | 67 | ||
| 132 | reqcompletion: reqlst | 68 | rulecmd: TOK_MATCHES REGEXP |
| 133 | | TOK_FROM TOK_COMMAND STRING | 69 | | TOK_PRODUCES STRING |
| 134 | { | 70 | | TOK_REQUIRES list |
| 135 | bld.requiresFromCommand( bld.getTmp(), $3 ); | 71 | | TOK_INPUT TOK_FILTER REGEXP |
| 136 | } | 72 | | TOK_INPUT TOK_FILTER func |
| 137 | ; | 73 | | TOK_PERFORM func |
| 74 | ; | ||
| 138 | 75 | ||
| 139 | reqlst: STRING | 76 | // Action interpretation |
| 140 | { | 77 | action: TOK_DEFAULT TOK_ACTION ':' actioncmds |
| 141 | bld.requires( bld.getTmp(), $1 ); | 78 | | STRING TOK_ACTION ':' actioncmds |
| 142 | } | ||
| 143 | | reqlst ',' STRING | ||
| 144 | { | ||
| 145 | bld.requires( bld.getTmp(), $3 ); | ||
| 146 | } | ||
| 147 | ; | 79 | ; |
| 148 | 80 | ||
| 149 | listcmds: TOK_SET setexpr | 81 | actioncmds: actioncmd |
| 150 | | TOK_CREATE createwhat TOK_FROM createfrom TOK_USING createusing | 82 | | actioncmds ',' actioncmd |
| 151 | { | ||
| 152 | bld.endTarget(); | ||
| 153 | } | ||
| 154 | ; | ||
| 155 | |||
| 156 | createwhat: TOK_FILE STRING | ||
| 157 | { | ||
| 158 | bld.addTarget( TOK_FILE, $2 ); | ||
| 159 | } | ||
| 160 | ; | 83 | ; |
| 161 | 84 | ||
| 162 | createfrom: TOK_FILES TOK_IN | 85 | actioncmd: actioncmdtype list |
| 163 | { | 86 | ; |
| 164 | bld.setTargetInputType( TOK_FILES ); | ||
| 165 | } | ||
| 166 | createfromdirlst | ||
| 167 | ; | ||
| 168 | |||
| 169 | createfromdirlst: createfromdir | ||
| 170 | | createfromdirlst ',' createfromdir | ||
| 171 | ; | ||
| 172 | 87 | ||
| 173 | createfromdir: STRING | 88 | actioncmdtype: TOK_CHECK |
| 174 | { | 89 | | TOK_CLEAN |
| 175 | bld.addTargetInput( $1 ); | ||
| 176 | } | ||
| 177 | ; | 90 | ; |
| 178 | 91 | ||
| 179 | createusing: TOK_RULE STRING | 92 | // Target interpretation |
| 180 | { | ||
| 181 | bld.setTargetRule( $2 ); | ||
| 182 | } | ||
| 183 | ; | ||
| 184 | |||
| 185 | actionlst: action | ||
| 186 | | actionlst ',' action | ||
| 187 | ; | ||
| 188 | 93 | ||
| 189 | action: TOK_CHECK STRING | 94 | target: list ':' targetcmds |
| 190 | { | ||
| 191 | bld.add( new Command( Command::cmdCheck, $2 ) ); | ||
| 192 | } | ||
| 193 | | TOK_CHECK REGEXP | ||
| 194 | { | ||
| 195 | bld.addRegexCommand( Command::cmdCheck, $2 ); | ||
| 196 | } | ||
| 197 | | TOK_CLEAN STRING | ||
| 198 | { | ||
| 199 | bld.add( new Command( Command::cmdClean, $2 ) ); | ||
| 200 | } | ||
| 201 | | TOK_CLEAN REGEXP | ||
| 202 | { | ||
| 203 | bld.addRegexCommand( Command::cmdClean, $2 ); | ||
| 204 | } | ||
| 205 | ; | 95 | ; |
| 206 | 96 | ||
| 207 | setexpr: STRING '=' STRING | 97 | targetcmds: targetcmd |
| 208 | { | 98 | | targetcmds ',' targetcmd |
| 209 | bld.varSet( $1, $3 ); | 99 | ; |
| 210 | } | 100 | |
| 211 | | STRING TOK_ADDSET STRING | 101 | targetcmd: TOK_RULE STRING |
| 212 | { | 102 | | TOK_TARGET TOK_PREFIX STRING |
| 213 | bld.varAddSet( $1, $3 ); | 103 | | TOK_TARGET TARGETTYPE |
| 214 | } | 104 | | TOK_INPUT list |
| 215 | | STRING '=' TOK_FROM TOK_COMMAND STRING | 105 | | TOK_REQUIRES list |
| 216 | { | 106 | ; |
| 217 | bld.varSet( $1, bld.cmdToString( $5 ).c_str() ); | ||
| 218 | } | ||
| 219 | | STRING TOK_ADDSET TOK_FROM TOK_COMMAND STRING | ||
| 220 | { | ||
| 221 | bld.varSet( $1, bld.cmdToString( $5 ).c_str() ); | ||
| 222 | } | ||
| 223 | ; | ||
| 224 | 107 | ||
| 225 | rule: TOK_RULE STRING | 108 | // list goo |
| 226 | { | 109 | |
| 227 | bld.add( new Rule( $2 ) ); | 110 | list: listitem listfilter |
| 228 | } | 111 | | '[' listitems ']' listfilter |
| 229 | rulesublst TOK_PERFORM rulecompletion | ||
| 230 | ; | 112 | ; |
| 231 | 113 | ||
| 232 | rulesublst: rulesub | 114 | listfilter: |
| 233 | | rulesublst rulesub | 115 | | TOK_FILTER REGEXP |
| 116 | | TOK_FILTER func | ||
| 234 | ; | 117 | ; |
| 235 | 118 | ||
| 236 | rulesub: TOK_MATCHES rulematches | 119 | listitems: listitem |
| 237 | | TOK_PRODUCES produceslst | 120 | | listitems ',' listitem |
| 238 | ; | 121 | ; |
| 239 | 122 | ||
| 240 | produceslst: STRING | 123 | listitem: STRING |
| 241 | { | 124 | | func |
| 242 | bld.lastRule()->addProduces( $1 ); | 125 | ; |
| 243 | } | ||
| 244 | | produceslst ',' STRING | ||
| 245 | { | ||
| 246 | bld.lastRule()->addProduces( $3 ); | ||
| 247 | } | ||
| 248 | ; | ||
| 249 | 126 | ||
| 250 | rulematches: TOK_ALL REGEXP | 127 | // Function |
| 251 | { | ||
| 252 | try | ||
| 253 | { | ||
| 254 | bld.lastRule()->setMatches( Rule::matchAll, $2 ); | ||
| 255 | } | ||
| 256 | catch( BuildException &e ) | ||
| 257 | { | ||
| 258 | std::string s("RegExp compile error: "); | ||
| 259 | s += e.what(); | ||
| 260 | yyerror( &yyloc, bld, s.c_str() ); | ||
| 261 | return 1; | ||
| 262 | } | ||
| 263 | } | ||
| 264 | | TOK_ONE REGEXP | ||
| 265 | { | ||
| 266 | try | ||
| 267 | { | ||
| 268 | bld.lastRule()->setMatches( Rule::matchOne, $2 ); | ||
| 269 | } | ||
| 270 | catch( BuildException &e ) | ||
| 271 | { | ||
| 272 | std::string s("RegExp compile error: "); | ||
| 273 | s += e.what(); | ||
| 274 | yyerror( &yyloc, bld, s.c_str() ); | ||
| 275 | return 1; | ||
| 276 | } | ||
| 277 | } | ||
| 278 | ; | ||
| 279 | 128 | ||
| 280 | rulecompletion: TOK_COMMAND STRING | 129 | func: FUNCTION '(' funcparams ')' |
| 281 | { | 130 | ; |
| 282 | bld.lastRule()->setPerforms( Rule::perfCommand, $2 ); | 131 | |
| 283 | } | 132 | funcparams: |
| 284 | ; | 133 | | STRING |
| 134 | | funcparams ',' STRING | ||
| 135 | ; | ||
| 285 | 136 | ||
| 286 | %% | 137 | %% |
| 287 | 138 | ||
