the parser works properly, but it doesn't do anything yet
[platform/upstream/gstreamer.git] / gst / parse / grammar.y
1 %{
2 #include <glib.h>
3 #include <stdio.h>
4 #define YYDEBUG 1
5 #define YYERROR_VERBOSE 1
6 %}
7
8 %union {
9     double d;
10     gboolean b;
11     gint i;
12     gchar *s;
13 }
14
15 %token <s> IDENTIFIER STRING
16 %token <d> FLOAT
17 %token <i> INTEGER
18 %token <b> BOOLEAN
19
20 %left '{' '}' '(' ')'
21 %left '!' '='
22 %left '+'
23 %left '.'
24
25 %start graph
26 %%
27
28 id:     IDENTIFIER {}
29         ;
30
31 qid:            id
32         |       id '.' id
33         ;
34
35 value:          STRING {}
36         |       FLOAT {}
37         |       INTEGER {}
38         |       BOOLEAN {}
39         ;
40
41 property_value: qid '=' value
42         ;
43
44 element:        id
45         |       bin
46         ;
47
48 graph:          /* empty */
49         |       graph element
50         |       graph connection
51         |       graph property_value
52         ;
53
54 bin:            '{' graph '}'
55         |       id '.' '(' graph ')'
56         ;
57
58 connection:     lconnection
59         |       rconnection
60         |       bconnection
61         ;
62
63 lconnection:    qid '+' '!'
64         ;
65
66 rconnection:    '!' '+' qid
67         ;
68
69 bconnection:    '!'
70         |       qid '+' bconnection '+' qid
71         ;
72
73 %%
74
75 extern FILE *yyin;
76
77 int
78 yyerror (const char *s)
79 {
80   printf ("error: %s\n", s);
81   return -1;
82 }
83
84 int main (int argc, char **argv)
85 {
86     ++argv, --argc;  /* skip over program name */
87     if ( argc > 0 )
88         yyin = fopen (argv[0], "r");
89     else
90         yyin = stdin;
91     
92     return yyparse();
93 }