29348cbfb38b4ebce8faf5b2ff29a4ba813ac0da
[qtgstreamer:qtgstreamer.git] / parser.y
1 /*
2     Copyright (C) 2010  George Kiagiadakis <kiagiadakis.george@gmail.com>
3
4     This library is free software; you can redistribute it and/or modify
5     it under the terms of the GNU Lesser General Public License as published
6     by the Free Software Foundation; either version 2.1 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU Lesser General Public License
15     along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 %{
18 #include "yystype.h"
19 #include "generator.h"
20
21 int yylex(CodeGen *codegen);
22 void yyerror(CodeGen *codegen, const char *msg);
23
24 %}
25
26 %parse-param {CodeGen *codegen}
27 %lex-param {CodeGen *codegen}
28
29 %start header
30
31 %token REGISTER_TYPE_BEGIN
32        SCOPE_RESOLUTION_OPERATOR
33        REGISTER_TYPE_END
34        INSTRUCTIONS_BEGIN
35        INSTRUCTIONS_ASSIGN_OPERATOR
36        INSTRUCTIONS_SEPARATOR
37        INSTRUCTIONS_END
38        ENUM_KEYWORD
39        LEFT_BRACE
40        RIGHT_BRACE
41        COMMA
42        SEMICOLON
43
44 %token <Id> IDENTIFIER
45 %destructor { delete $$; } IDENTIFIER
46
47 %type <IdList> enum_list
48 %destructor { delete $$; } enum_list
49
50 %type <Id> optional_enum_id
51 %destructor { delete $$; } optional_enum_id
52
53 %type <HashMap> optional_instructions
54 %destructor { delete $$; } optional_instructions
55
56 %type <HashMap> instruction_list
57 %destructor { delete $$; } instruction_list
58
59 %type <Pair> instruction
60 %destructor { delete $$; } instruction
61
62 %%
63
64 header: header expression | expression | /*empty*/;
65
66 expression : enum_def | type_registration;
67
68 enum_def:
69     ENUM_KEYWORD IDENTIFIER LEFT_BRACE optional_instructions enum_list RIGHT_BRACE SEMICOLON
70     {
71         codegen->addEnum(*$5, *$4);
72         delete $2;
73         delete $4;
74         delete $5;
75     };
76
77 enum_list:
78     enum_list COMMA IDENTIFIER
79     {
80         $$ = $1;
81         $$->append(*$3);
82         delete $3;
83     }
84     | IDENTIFIER
85     {
86         $$ = new QList<QByteArray>();
87         $$->append(*$1);
88         delete $1;
89     };
90
91
92 type_registration:
93     REGISTER_TYPE_BEGIN IDENTIFIER SCOPE_RESOLUTION_OPERATOR IDENTIFIER optional_enum_id REGISTER_TYPE_END optional_instructions
94     {
95         codegen->addTypeRegistration(*$2, *$4, *$5, *$7);
96         delete $2;
97         delete $4;
98         delete $5;
99         delete $7;
100     };
101
102 optional_enum_id:
103     SCOPE_RESOLUTION_OPERATOR IDENTIFIER
104     {
105         $$ = $2;
106     }
107     | /*empty*/
108     {
109         $$ = new QByteArray();
110     };
111
112
113 optional_instructions:
114     INSTRUCTIONS_BEGIN instruction_list INSTRUCTIONS_END
115     {
116         $$ = $2;
117     }
118     | /*empty*/
119     {
120         $$ = new QHash<QByteArray, QByteArray>();
121     };
122
123 instruction_list:
124     instruction_list INSTRUCTIONS_SEPARATOR instruction
125     {
126         $$ = $1;
127         $$->insert($3->first, $3->second);
128         delete $3;
129     }
130     | instruction
131     {
132         $$ = new QHash<QByteArray, QByteArray>();
133         $$->insert($1->first, $1->second);
134         delete $1;
135     };
136
137 instruction:
138     IDENTIFIER INSTRUCTIONS_ASSIGN_OPERATOR IDENTIFIER
139     {
140         $$ = new QPair<QByteArray, QByteArray>();
141         $$->first = *$1;
142         $$->second = *$3;
143         delete $1;
144         delete $3;
145     }
146     | IDENTIFIER
147     {
148         $$ = new QPair<QByteArray, QByteArray>();
149         $$->first = *$1;
150         delete $1;
151     };
152
153
154 %%
155
156 void yyerror(CodeGen *codegen, const char *msg)
157 {
158     codegen->fatalError(msg);
159 }