1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%{
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "aidl_language.h"
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdio.h>
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdlib.h>
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <string.h>
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint yyerror(char* errstr);
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint yylex(void);
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern int yylineno;
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic int count_brackets(const char*);
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%}
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token IMPORT
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token PACKAGE
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token IDENTIFIER
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token IDVALUE
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token GENERIC
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token ARRAY
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token PARCELABLE
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token INTERFACE
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token FLATTENABLE
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token RPC
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token IN
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token OUT
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token INOUT
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%token ONEWAY
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%%
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskidocument:
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        document_items                          { g_callbacks->document($1.document_item); }
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   headers document_items                  { g_callbacks->document($2.document_item); }
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiheaders:
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        package                                 { }
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   imports                                 { }
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   package imports                         { }
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage:
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        PACKAGE                                 { }
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimports:
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        IMPORT                                  { g_callbacks->import(&($1.buffer)); }
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   IMPORT imports                          { g_callbacks->import(&($1.buffer)); }
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskidocument_items:
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                { $$.document_item = NULL; }
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   document_items declaration              {
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    if ($2.document_item == NULL) {
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        // error cases only
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$ = $1;
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    } else {
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        document_item_type* p = $1.document_item;
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        while (p && p->next) {
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                            p=p->next;
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        }
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        if (p) {
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                            p->next = (document_item_type*)$2.document_item;
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                            $$ = $1;
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        } else {
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                            $$.document_item = (document_item_type*)$2.document_item;
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        }
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                }
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    | document_items error                      {
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    fprintf(stderr, "%s:%d: syntax error don't know what to do with \"%s\"\n", g_currentFilename,
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                            $2.buffer.lineno, $2.buffer.data);
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    $$ = $1;
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                }
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskideclaration:
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        parcelable_decl                            { $$.document_item = (document_item_type*)$1.user_data; }
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   interface_decl                             { $$.document_item = (document_item_type*)$1.interface_item; }
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiparcelable_decl:
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        PARCELABLE IDENTIFIER ';'                   {
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        user_data_type* b = (user_data_type*)malloc(sizeof(user_data_type));
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->document_item.item_type = USER_DATA_TYPE;
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->document_item.next = NULL;
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->keyword_token = $1.buffer;
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->name = $2.buffer;
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->package = g_currentPackage ? strdup(g_currentPackage) : NULL;
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->semicolon_token = $3.buffer;
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->flattening_methods = PARCELABLE_DATA;
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.user_data = b;
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   PARCELABLE ';'                              {
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name.\n",
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                                     g_currentFilename, $1.buffer.lineno);
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.user_data = NULL;
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   PARCELABLE error ';'                        {
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name, saw \"%s\".\n",
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                                     g_currentFilename, $2.buffer.lineno, $2.buffer.data);
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.user_data = NULL;
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   FLATTENABLE IDENTIFIER ';'                  {
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        user_data_type* b = (user_data_type*)malloc(sizeof(user_data_type));
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->document_item.item_type = USER_DATA_TYPE;
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->document_item.next = NULL;
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->keyword_token = $1.buffer;
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->name = $2.buffer;
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->package = g_currentPackage ? strdup(g_currentPackage) : NULL;
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->semicolon_token = $3.buffer;
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        b->flattening_methods = PARCELABLE_DATA | RPC_DATA;
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.user_data = b;
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   FLATTENABLE ';'                             {
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name.\n",
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                                     g_currentFilename, $1.buffer.lineno);
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.user_data = NULL;
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   FLATTENABLE error ';'                       {
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name, saw \"%s\".\n",
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                                     g_currentFilename, $2.buffer.lineno, $2.buffer.data);
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.user_data = NULL;
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiinterface_header:
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        INTERFACE                                  {
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        interface_type* c = (interface_type*)malloc(sizeof(interface_type));
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->document_item.item_type = INTERFACE_TYPE_BINDER;
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->document_item.next = NULL;
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->interface_token = $1.buffer;
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->oneway = false;
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        memset(&c->oneway_token, 0, sizeof(buffer_type));
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->comments_token = &c->interface_token;
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.interface_obj = c;
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                   }
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   ONEWAY INTERFACE                           {
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        interface_type* c = (interface_type*)malloc(sizeof(interface_type));
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->document_item.item_type = INTERFACE_TYPE_BINDER;
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->document_item.next = NULL;
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->interface_token = $2.buffer;
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->oneway = true;
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->oneway_token = $1.buffer;
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->comments_token = &c->oneway_token;
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.interface_obj = c;
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                   }
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   RPC                                        {
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        interface_type* c = (interface_type*)malloc(sizeof(interface_type));
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->document_item.item_type = INTERFACE_TYPE_RPC;
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->document_item.next = NULL;
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->interface_token = $1.buffer;
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->oneway = false;
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        memset(&c->oneway_token, 0, sizeof(buffer_type));
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->comments_token = &c->interface_token;
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.interface_obj = c;
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                   }
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiinterface_keywords:
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        INTERFACE
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   RPC
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiinterface_decl:
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        interface_header IDENTIFIER '{' interface_items '}' {
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        interface_type* c = $1.interface_obj;
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->name = $2.buffer;
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->package = g_currentPackage ? strdup(g_currentPackage) : NULL;
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->open_brace_token = $3.buffer;
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->interface_items = $4.interface_item;
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        c->close_brace_token = $5.buffer;
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.interface_obj = c;
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   interface_keywords error '{' interface_items '}'     {
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        fprintf(stderr, "%s:%d: syntax error in interface declaration.  Expected type name, saw \"%s\"\n",
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                                    g_currentFilename, $2.buffer.lineno, $2.buffer.data);
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.document_item = NULL;
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   interface_keywords error '}'                {
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        fprintf(stderr, "%s:%d: syntax error in interface declaration.  Expected type name, saw \"%s\"\n",
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                                    g_currentFilename, $2.buffer.lineno, $2.buffer.data);
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.document_item = NULL;
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiinterface_items:
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    { $$.interface_item = NULL; }
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   interface_items method_decl                 {
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        interface_item_type* p=$1.interface_item;
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        while (p && p->next) {
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                            p=p->next;
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        }
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        if (p) {
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                            p->next = (interface_item_type*)$2.method;
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                            $$ = $1;
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        } else {
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                            $$.interface_item = (interface_item_type*)$2.method;
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        }
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   interface_items error ';'                   {
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        fprintf(stderr, "%s:%d: syntax error before ';' (expected method declaration)\n",
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                                    g_currentFilename, $3.buffer.lineno);
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$ = $1;
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskimethod_decl:
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        type IDENTIFIER '(' arg_list ')' ';'  {
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method_type *method = (method_type*)malloc(sizeof(method_type));
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->interface_item.item_type = METHOD_TYPE;
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->interface_item.next = NULL;
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->oneway = false;
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->type = $1.type;
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        memset(&method->oneway_token, 0, sizeof(buffer_type));
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->name = $2.buffer;
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->open_paren_token = $3.buffer;
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->args = $4.arg;
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->close_paren_token = $5.buffer;
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->hasId = false;
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        memset(&method->equals_token, 0, sizeof(buffer_type));
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        memset(&method->id, 0, sizeof(buffer_type));
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->semicolon_token = $6.buffer;
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->comments_token = &method->type.type;
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.method = method;
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   ONEWAY type IDENTIFIER '(' arg_list ')' ';'  {
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method_type *method = (method_type*)malloc(sizeof(method_type));
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->interface_item.item_type = METHOD_TYPE;
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->interface_item.next = NULL;
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->oneway = true;
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->oneway_token = $1.buffer;
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->type = $2.type;
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->name = $3.buffer;
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->open_paren_token = $4.buffer;
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->args = $5.arg;
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->close_paren_token = $6.buffer;
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->hasId = false;
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        memset(&method->equals_token, 0, sizeof(buffer_type));
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        memset(&method->id, 0, sizeof(buffer_type));
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->semicolon_token = $7.buffer;
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->comments_token = &method->oneway_token;
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.method = method;
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |    type IDENTIFIER '(' arg_list ')' '=' IDVALUE ';'  {
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method_type *method = (method_type*)malloc(sizeof(method_type));
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->interface_item.item_type = METHOD_TYPE;
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->interface_item.next = NULL;
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->oneway = false;
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        memset(&method->oneway_token, 0, sizeof(buffer_type));
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->type = $1.type;
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->name = $2.buffer;
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->open_paren_token = $3.buffer;
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->args = $4.arg;
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->close_paren_token = $5.buffer;
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->hasId = true;
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->equals_token = $6.buffer;
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->id = $7.buffer;
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->semicolon_token = $8.buffer;
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->comments_token = &method->type.type;
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.method = method;
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   ONEWAY type IDENTIFIER '(' arg_list ')' '=' IDVALUE ';'  {
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method_type *method = (method_type*)malloc(sizeof(method_type));
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->interface_item.item_type = METHOD_TYPE;
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->interface_item.next = NULL;
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->oneway = true;
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->oneway_token = $1.buffer;
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->type = $2.type;
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->name = $3.buffer;
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->open_paren_token = $4.buffer;
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->args = $5.arg;
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->close_paren_token = $6.buffer;
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->hasId = true;
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->equals_token = $7.buffer;
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->id = $8.buffer;
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->semicolon_token = $9.buffer;
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        method->comments_token = &method->oneway_token;
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                        $$.method = method;
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                    }
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiarg_list:
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                { $$.arg = NULL; }
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   arg                     { $$ = $1; }
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   arg_list ',' arg        {
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    if ($$.arg != NULL) {
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        // only NULL on error
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        $$ = $1;
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        arg_type *p = $1.arg;
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        while (p && p->next) {
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                            p=p->next;
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        }
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        $3.arg->comma_token = $2.buffer;
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        p->next = $3.arg;
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    }
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                }
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   error                   {
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    fprintf(stderr, "%s:%d: syntax error in parameter list\n", g_currentFilename, $1.buffer.lineno);
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    $$.arg = NULL;
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                }
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiarg:
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        direction type IDENTIFIER     {
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                arg_type* arg = (arg_type*)malloc(sizeof(arg_type));
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                memset(&arg->comma_token, 0, sizeof(buffer_type));
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                arg->direction = $1.buffer;
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                arg->type = $2.type;
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                arg->name = $3.buffer;
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                arg->next = NULL;
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                $$.arg = arg;
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                      }
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitype:
319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        IDENTIFIER              {
320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    $$.type.type = $1.buffer;
321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    init_buffer_type(&$$.type.array_token, yylineno);
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    $$.type.dimension = 0;
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                }
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   IDENTIFIER ARRAY        {
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    $$.type.type = $1.buffer;
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    $$.type.array_token = $2.buffer;
327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    $$.type.dimension = count_brackets($2.buffer.data);
328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                }
329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   GENERIC                 {
330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    $$.type.type = $1.buffer;
331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    init_buffer_type(&$$.type.array_token, yylineno);
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    $$.type.dimension = 0;
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                }
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskidirection:
337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    { init_buffer_type(&$$.buffer, yylineno); }
338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   IN          { $$.buffer = $1.buffer; }
339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   OUT         { $$.buffer = $1.buffer; }
340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    |   INOUT       { $$.buffer = $1.buffer; }
341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ;
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%%
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <ctype.h>
346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdio.h>
347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint g_error = 0;
349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint yyerror(char* errstr)
351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fprintf(stderr, "%s:%d: %s\n", g_currentFilename, yylineno, errstr);
353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    g_error = 1;
354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return 1;
355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid init_buffer_type(buffer_type* buf, int lineno)
358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buf->lineno = lineno;
360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buf->token = 0;
361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buf->data = NULL;
362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buf->extra = NULL;
363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic int count_brackets(const char* s)
366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int n=0;
368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*s) {
369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (*s == '[') n++;
370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s++;
371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return n;
373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
374