Initial German translation of the build tutorial
[anjuta.git] / plugins / am-project / am-parser.y
blob11fffe0a0bf08ede8a9bccb2ebac201285bbc8c0
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * am-parser.y
4 * Copyright (C) Sébastien Granjoux 2009 <seb.sfo@free.fr>
6 * main.c is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * main.c is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "am-scanner.h"
22 #include "am-parser.h"
24 #include <stdlib.h>
26 #define YYDEBUG 1
28 /* Token location is found directly from token value, there is no need to
29 * maintain a separate location variable */
30 #define YYLLOC_DEFAULT(Current, Rhs, N) ((Current) = YYRHSLOC(Rhs, (N) ? 1 : 0))
34 %token END_OF_FILE
35 %token END_OF_LINE '\n'
36 %token SPACE
37 %token TAB '\t'
38 %token COMMENT '#'
39 %token MACRO
40 %token VARIABLE
41 %token COLON ':'
42 %token DOUBLE_COLON "::"
43 %token ORDER '|'
44 %token SEMI_COLON ';'
45 %token EQUAL '='
46 %token IMMEDIATE_EQUAL ":="
47 %token CONDITIONAL_EQUAL "?="
48 %token APPEND "+="
49 %token CHARACTER
50 %token NAME
51 %token AM_VARIABLE
53 %token INCLUDE
55 %token SUBDIRS
56 %token DIST_SUBDIRS
57 %token _DATA
58 %token _HEADERS
59 %token _LIBRARIES
60 %token _LISP
61 %token _LTLIBRARIES
62 %token _MANS
63 %token _PROGRAMS
64 %token _PYTHON
65 %token _JAVA
66 %token _SCRIPTS
67 %token _SOURCES
68 %token _TEXINFOS
69 %token _DIR
70 %token _LDFLAGS
71 %token _CPPFLAGS
72 %token _CFLAGS
73 %token _CXXFLAGS
74 %token _JAVACFLAGS
75 %token _VALAFLAGS
76 %token _FCFLAGS
77 %token _OBJCFLAGS
78 %token _LFLAGS
79 %token _YFLAGS
80 %token TARGET_LDFLAGS
81 %token TARGET_CPPFLAGS
82 %token TARGET_CFLAGS
83 %token TARGET_CXXFLAGS
84 %token TARGET_JAVACFLAGS
85 %token TARGET_VALAFLAGS
86 %token TARGET_FCFLAGS
87 %token TARGET_OBJCFLAGS
88 %token TARGET_LFLAGS
89 %token TARGET_YFLAGS
90 %token TARGET_DEPENDENCIES
91 %token TARGET_LIBADD
92 %token TARGET_LDADD
95 %defines
97 %define api.pure
98 %define api.push_pull "push"
100 %parse-param {AmpAmScanner* scanner}
101 %lex-param {AmpAmScanner* scanner}
103 %name-prefix="amp_am_yy"
105 %locations
107 %start file
109 %expect 1
111 %debug
113 %verbose
117 //amp_am_yydebug = 1;
119 static gint
120 amp_am_automake_variable (AnjutaToken *token)
122 switch (anjuta_token_get_type (anjuta_token_last (token)))
124 case SUBDIRS: return AM_TOKEN_SUBDIRS;
125 case DIST_SUBDIRS: return AM_TOKEN_DIST_SUBDIRS;
126 case _DATA: return AM_TOKEN__DATA;
127 case _HEADERS: return AM_TOKEN__HEADERS;
128 case _LIBRARIES: return AM_TOKEN__LIBRARIES;
129 case _LISP: return AM_TOKEN__LISP;
130 case _LTLIBRARIES: return AM_TOKEN__LTLIBRARIES;
131 case _MANS: return AM_TOKEN__MANS;
132 case _PROGRAMS: return AM_TOKEN__PROGRAMS;
133 case _PYTHON: return AM_TOKEN__PYTHON;
134 case _JAVA: return AM_TOKEN__JAVA;
135 case _SCRIPTS: return AM_TOKEN__SCRIPTS;
136 case _SOURCES: return AM_TOKEN__SOURCES;
137 case _TEXINFOS: return AM_TOKEN__TEXINFOS;
138 case _DIR: return AM_TOKEN_DIR;
139 case _LDFLAGS: return AM_TOKEN__LDFLAGS;
140 case _CPPFLAGS: return AM_TOKEN__CPPFLAGS;
141 case _CFLAGS: return AM_TOKEN__CFLAGS;
142 case _CXXFLAGS: return AM_TOKEN__CXXFLAGS;
143 case _JAVACFLAGS: return AM_TOKEN__JAVACFLAGS;
144 case _VALAFLAGS: return AM_TOKEN__VALAFLAGS;
145 case _FCFLAGS: return AM_TOKEN__FCFLAGS;
146 case _OBJCFLAGS: return AM_TOKEN__OBJCFLAGS;
147 case _LFLAGS: return AM_TOKEN__LFLAGS;
148 case _YFLAGS: return AM_TOKEN__YFLAGS;
149 case TARGET_LDFLAGS: return AM_TOKEN_TARGET_LDFLAGS;
150 case TARGET_CPPFLAGS: return AM_TOKEN_TARGET_CPPFLAGS;
151 case TARGET_CFLAGS: return AM_TOKEN_TARGET_CFLAGS;
152 case TARGET_CXXFLAGS: return AM_TOKEN_TARGET_CXXFLAGS;
153 case TARGET_JAVACFLAGS: return AM_TOKEN_TARGET_JAVACFLAGS;
154 case TARGET_VALAFLAGS: return AM_TOKEN_TARGET_VALAFLAGS;
155 case TARGET_FCFLAGS: return AM_TOKEN_TARGET_FCFLAGS;
156 case TARGET_OBJCFLAGS: return AM_TOKEN_TARGET_OBJCFLAGS;
157 case TARGET_LFLAGS: return AM_TOKEN_TARGET_LFLAGS;
158 case TARGET_YFLAGS: return AM_TOKEN_TARGET_YFLAGS;
159 case TARGET_DEPENDENCIES: return AM_TOKEN_TARGET_DEPENDENCIES;
160 case TARGET_LIBADD: return AM_TOKEN_TARGET_LIBADD;
161 case TARGET_LDADD: return AM_TOKEN_TARGET_LDADD;
163 default: return ANJUTA_TOKEN_NAME;
171 /* File cannot be empty, there at least the END_OF_FILE token */
172 file:
173 statement
174 | file statement
177 statement:
178 end_of_line
179 | space end_of_line
180 | definition end_of_line
181 | am_variable end_of_line
182 | include end_of_line
183 | line end_of_line
184 | rule command_list
187 am_variable:
188 optional_space automake_head optional_space equal_token value_list {
189 $$ = anjuta_token_new_static (amp_am_automake_variable ($2), NULL);
190 if ($1 != NULL) anjuta_token_set_type ($1, ANJUTA_TOKEN_START);
191 anjuta_token_merge ($$, $2);
192 if ($3 != NULL) anjuta_token_set_type ($3, ANJUTA_TOKEN_NEXT);
193 anjuta_token_merge ($$, $4);
194 anjuta_token_merge ($$, $5);
195 amp_am_scanner_set_am_variable (scanner, $$);
197 | optional_space automake_head optional_space equal_token
199 AnjutaToken *list;
200 list = anjuta_token_new_static (ANJUTA_TOKEN_LIST, NULL);
201 anjuta_token_insert_after ($4, list);
202 $$ = anjuta_token_new_static (amp_am_automake_variable ($2), NULL);
203 anjuta_token_merge ($$, $2);
204 anjuta_token_merge ($$, list);
205 amp_am_scanner_set_am_variable (scanner, $$);
209 include:
210 optional_space include_token value_list {
211 $$ = anjuta_token_new_static (ANJUTA_TOKEN_LIST, NULL);
212 anjuta_token_merge ($$, $2);
213 anjuta_token_merge ($$, $3);
214 amp_am_scanner_include (scanner, $$);
217 definition:
218 head_list equal_token value_list {
219 $$ = anjuta_token_new_static (ANJUTA_TOKEN_DEFINITION, NULL);
220 anjuta_token_merge_own_children ($1);
221 anjuta_token_merge ($$, $1);
222 anjuta_token_merge ($$, $2);
223 anjuta_token_merge ($$, $3);
224 amp_am_scanner_update_variable (scanner, $$);
226 | head_list equal_token {
227 AnjutaToken *list;
228 list = anjuta_token_new_static (ANJUTA_TOKEN_LIST, NULL);
229 anjuta_token_insert_after ($2, list);
230 $$ = anjuta_token_new_static (ANJUTA_TOKEN_DEFINITION, NULL);
231 anjuta_token_merge_own_children ($1);
232 anjuta_token_merge ($$, $1);
233 anjuta_token_merge ($$, $2);
234 anjuta_token_merge ($$, list);
235 amp_am_scanner_update_variable (scanner, $$);
239 rule:
240 depend_list end_of_line
241 | depend_list SEMI_COLON command_line END_OF_LINE
242 | depend_list SEMI_COLON command_line END_OF_FILE
245 depend_list:
246 head_list rule_token prerequisite_list
249 command_list:
250 /* empty */
251 | command_list TAB command_line END_OF_LINE
252 | command_list TAB command_line END_OF_FILE
255 line:
256 head_list
259 /* Lists
260 *----------------------------------------------------------------------------*/
262 end_of_line:
263 END_OF_LINE {
264 anjuta_token_set_type ($1, ANJUTA_TOKEN_EOL);
265 $$ = NULL;
267 | END_OF_FILE {
268 $$ = NULL;
270 | COMMENT {
271 anjuta_token_set_type ($1, ANJUTA_TOKEN_COMMENT);
272 $$ = NULL;
276 not_eol_list:
277 /* empty */
278 | not_eol_list not_eol_token
281 prerequisite_list:
282 /* empty */
283 | space
284 | optional_space prerequisite_list_body optional_space
287 prerequisite_list_body:
288 prerequisite
289 | prerequisite_list_body space prerequisite
292 head_list:
293 optional_space head_list_body optional_space {
294 $$ = anjuta_token_merge_previous ($2, $1);
295 anjuta_token_merge ($$, $3);
299 head_list_body:
300 head {
301 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
302 anjuta_token_merge ($$, $1);
304 | head_list_body space next_head {
305 anjuta_token_merge ($1, $2);
306 anjuta_token_merge ($1, $3);
308 | automake_head space next_head {
309 anjuta_token_merge ($1, $2);
310 anjuta_token_merge ($1, $3);
314 value_list:
315 space {
316 $$ = anjuta_token_new_static (ANJUTA_TOKEN_LIST, NULL);
317 if ($1 != NULL) anjuta_token_set_type ($1, ANJUTA_TOKEN_START);
318 anjuta_token_merge ($$, $1);
320 | optional_space value_list_body optional_space {
321 if ($1 != NULL) anjuta_token_set_type ($1, ANJUTA_TOKEN_START);
322 if ($3 != NULL) anjuta_token_set_type ($3, ANJUTA_TOKEN_LAST);
323 anjuta_token_merge_previous ($2, $1);
324 anjuta_token_merge ($2, $3);
325 $$ = $2;
328 value_list_body:
329 value {
330 $$ = anjuta_token_new_static (ANJUTA_TOKEN_LIST, NULL);
331 anjuta_token_merge ($$, $1);
333 | value_list_body space value {
334 anjuta_token_set_type ($2, ANJUTA_TOKEN_NEXT);
335 anjuta_token_merge ($1, $2);
336 anjuta_token_merge ($1, $3);
342 command_line:
343 /* empty */
344 | command_line command_token
347 /* Items
348 *----------------------------------------------------------------------------*/
350 optional_space:
351 /* empty */ {
352 $$ = NULL;
354 | space
357 space:
358 space_token {
359 $$ = anjuta_token_new_static (ANJUTA_TOKEN_SPACE, NULL);
360 anjuta_token_merge ($$, $1);
362 /*| space_variable {
363 $$ = anjuta_token_new_static (ANJUTA_TOKEN_SPACE, NULL);
364 anjuta_token_merge ($$, $1);
366 | space space_token {
367 anjuta_token_merge ($1, $2);
369 /*| space space_variable {
370 anjuta_token_merge ($1, $2);
374 automake_head:
375 automake_token {
376 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
377 anjuta_token_merge ($$, $1);
379 | target_automake_token {
380 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
381 anjuta_token_merge ($$, $1);
383 | head target_automake_token {
384 anjuta_token_merge ($1, $2);
386 | automake_head target_automake_token {
387 anjuta_token_merge ($1, $2);
391 head:
392 head_token {
393 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
394 anjuta_token_merge ($$, $1);
396 | ac_variable {
397 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
398 anjuta_token_merge ($$, $1);
400 | variable {
401 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
402 anjuta_token_merge ($$, $1);
404 | head head_token {
405 anjuta_token_merge ($1, $2);
407 | head automake_token {
408 anjuta_token_merge ($1, $2);
410 | head include_token {
411 anjuta_token_merge ($1, $2);
413 | head variable {
414 anjuta_token_merge ($1, $2);
416 | head ac_variable {
417 anjuta_token_merge ($1, $2);
419 | automake_head head_token {
420 anjuta_token_merge ($1, $2);
422 | automake_head automake_token {
423 anjuta_token_merge ($1, $2);
425 | automake_head include_token {
426 anjuta_token_merge ($1, $2);
428 | automake_head variable {
429 anjuta_token_merge ($1, $2);
431 | automake_head ac_variable {
432 anjuta_token_merge ($1, $2);
436 next_head:
437 head_token {
438 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
439 anjuta_token_merge ($$, $1);
441 | ac_variable {
442 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
443 anjuta_token_merge ($$, $1);
445 | variable {
446 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
447 anjuta_token_merge ($$, $1);
449 | automake_token {
450 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
451 anjuta_token_merge ($$, $1);
453 | target_automake_token {
454 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
455 anjuta_token_merge ($$, $1);
457 | include_token {
458 $$ = anjuta_token_new_static (ANJUTA_TOKEN_NAME, NULL);
459 anjuta_token_merge ($$, $1);
461 | next_head head_token {
462 anjuta_token_merge ($1, $2);
464 | next_head automake_token {
465 anjuta_token_merge ($1, $2);
467 | next_head include_token {
468 anjuta_token_merge ($1, $2);
470 | next_head variable {
471 anjuta_token_merge ($1, $2);
473 | next_head ac_variable {
474 anjuta_token_merge ($1, $2);
478 value:
479 value_token {
480 $$ = anjuta_token_new_static (ANJUTA_TOKEN_ARGUMENT, NULL);
481 anjuta_token_merge ($$, $1);
483 | variable {
484 $$ = anjuta_token_new_static (ANJUTA_TOKEN_ARGUMENT, NULL);
485 anjuta_token_merge ($$, $1);
487 | ac_variable {
488 $$ = anjuta_token_new_static (ANJUTA_TOKEN_ARGUMENT, NULL);
489 anjuta_token_merge ($$, $1);
491 | value value_token {
492 anjuta_token_merge ($1, $2);
494 | value variable {
495 anjuta_token_merge ($1, $2);
497 | value ac_variable {
498 anjuta_token_merge ($1, $2);
502 prerequisite:
503 name_prerequisite
506 name_prerequisite:
507 prerequisite_token
508 | variable
509 | ac_variable
510 | name_prerequisite prerequisite_token
511 | name_prerequisite variable
512 | name_prerequisite ac_variable
515 variable:
516 VARIABLE {
517 amp_am_scanner_parse_variable (scanner, $$);
521 ac_variable:
522 MACRO {
523 amp_am_scanner_parse_ac_variable (scanner, $$);
527 /* Tokens
528 *----------------------------------------------------------------------------*/
530 not_eol_token:
531 word_token
532 | space_token
535 prerequisite_token:
536 name_token
537 | automake_token
538 | target_automake_token
539 | equal_token
540 | rule_token
543 command_token:
544 name_token
545 | variable_token
546 | automake_token
547 | target_automake_token
548 | equal_token
549 | rule_token
550 | depend_token
551 | include_token
552 | space_token
553 | comment_token
556 value_token:
557 name_token
558 | equal_token
559 | rule_token
560 | depend_token
561 | include_token
562 | automake_token
563 | target_automake_token
566 head_token:
567 name_token
568 | depend_token
571 space_token:
572 SPACE
573 | TAB
576 comment_token:
577 COMMENT
580 equal_token:
581 EQUAL
582 | IMMEDIATE_EQUAL
583 | CONDITIONAL_EQUAL
584 | APPEND
587 rule_token:
588 COLON
589 | DOUBLE_COLON
592 depend_token:
593 SEMI_COLON
596 word_token:
597 name_token
598 | equal_token
599 | rule_token
600 | depend_token
604 name_token:
605 NAME
606 | CHARACTER
607 | ORDER
610 variable_token:
611 VARIABLE
612 | MACRO
615 automake_token:
616 SUBDIRS
617 | DIST_SUBDIRS
618 | _LDFLAGS
619 | _CPPFLAGS
620 | _CFLAGS
621 | _CXXFLAGS
622 | _JAVACFLAGS
623 | _VALAFLAGS
624 | _FCFLAGS
625 | _OBJCFLAGS
626 | _LFLAGS
627 | _YFLAGS
630 target_automake_token:
631 _DATA
632 | _HEADERS
633 | _LIBRARIES
634 | _LISP
635 | _LTLIBRARIES
636 | _MANS
637 | _PROGRAMS
638 | _PYTHON
639 | _JAVA
640 | _SCRIPTS
641 | _SOURCES
642 | _TEXINFOS
643 | _DIR
644 | TARGET_LDFLAGS
645 | TARGET_CPPFLAGS
646 | TARGET_CFLAGS
647 | TARGET_CXXFLAGS
648 | TARGET_JAVACFLAGS
649 | TARGET_VALAFLAGS
650 | TARGET_FCFLAGS
651 | TARGET_OBJCFLAGS
652 | TARGET_LFLAGS
653 | TARGET_YFLAGS
654 | TARGET_DEPENDENCIES
655 | TARGET_LIBADD
656 | TARGET_LDADD
659 include_token:
660 INCLUDE