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