19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%{ 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "aidl_language.h" 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint yyerror(char* errstr); 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint yylex(void); 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int yylineno; 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int count_brackets(const char*); 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%} 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token IMPORT 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token PACKAGE 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token IDENTIFIER 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token GENERIC 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token ARRAY 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token PARCELABLE 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token INTERFACE 227db766c3fec2795b08d237f29b972f474983684bJoe Onorato%token FLATTENABLE 23fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato%token RPC 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token IN 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token OUT 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token INOUT 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token ONEWAY 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%% 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdocument: 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_items { g_callbacks->document($1.document_item); } 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | headers document_items { g_callbacks->document($2.document_item); } 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectheaders: 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project package { } 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | imports { } 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | package imports { } 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage: 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PACKAGE { } 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimports: 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IMPORT { g_callbacks->import(&($1.buffer)); } 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | IMPORT imports { g_callbacks->import(&($1.buffer)); } 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdocument_items: 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { $$.document_item = NULL; } 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | document_items declaration { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ($2.document_item == NULL) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // error cases only 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_item_type* p = $1.document_item; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p && p->next) { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p=p->next; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->next = (document_item_type*)$2.document_item; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.document_item = (document_item_type*)$2.document_item; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | document_items error { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error don't know what to do with \"%s\"\n", g_currentFilename, 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $2.buffer.lineno, $2.buffer.data); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdeclaration: 77a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato parcelable_decl { $$.document_item = (document_item_type*)$1.user_data; } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | interface_decl { $$.document_item = (document_item_type*)$1.interface_item; } 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectparcelable_decl: 827db766c3fec2795b08d237f29b972f474983684bJoe Onorato PARCELABLE IDENTIFIER ';' { 83a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato user_data_type* b = (user_data_type*)malloc(sizeof(user_data_type)); 84a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato b->document_item.item_type = USER_DATA_TYPE; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->document_item.next = NULL; 86a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato b->keyword_token = $1.buffer; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->name = $2.buffer; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->package = g_currentPackage ? strdup(g_currentPackage) : NULL; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->semicolon_token = $3.buffer; 90a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato b->flattening_methods = PARCELABLE_DATA; 91a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato $$.user_data = b; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | PARCELABLE ';' { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name.\n", 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $1.buffer.lineno); 96a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato $$.user_data = NULL; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | PARCELABLE error ';' { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name, saw \"%s\".\n", 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $2.buffer.lineno, $2.buffer.data); 101a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato $$.user_data = NULL; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1037db766c3fec2795b08d237f29b972f474983684bJoe Onorato | FLATTENABLE IDENTIFIER ';' { 104a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato user_data_type* b = (user_data_type*)malloc(sizeof(user_data_type)); 105a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato b->document_item.item_type = USER_DATA_TYPE; 1067db766c3fec2795b08d237f29b972f474983684bJoe Onorato b->document_item.next = NULL; 107a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato b->keyword_token = $1.buffer; 1087db766c3fec2795b08d237f29b972f474983684bJoe Onorato b->name = $2.buffer; 1097db766c3fec2795b08d237f29b972f474983684bJoe Onorato b->package = g_currentPackage ? strdup(g_currentPackage) : NULL; 1107db766c3fec2795b08d237f29b972f474983684bJoe Onorato b->semicolon_token = $3.buffer; 111a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato b->flattening_methods = PARCELABLE_DATA | RPC_DATA; 112a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato $$.user_data = b; 1137db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 1147db766c3fec2795b08d237f29b972f474983684bJoe Onorato | FLATTENABLE ';' { 1157db766c3fec2795b08d237f29b972f474983684bJoe Onorato fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name.\n", 1167db766c3fec2795b08d237f29b972f474983684bJoe Onorato g_currentFilename, $1.buffer.lineno); 117a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato $$.user_data = NULL; 1187db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 1197db766c3fec2795b08d237f29b972f474983684bJoe Onorato | FLATTENABLE error ';' { 1207db766c3fec2795b08d237f29b972f474983684bJoe Onorato fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name, saw \"%s\".\n", 1217db766c3fec2795b08d237f29b972f474983684bJoe Onorato g_currentFilename, $2.buffer.lineno, $2.buffer.data); 122a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato $$.user_data = NULL; 1237db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 1247db766c3fec2795b08d237f29b972f474983684bJoe Onorato 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface_header: 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INTERFACE { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)malloc(sizeof(interface_type)); 130fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato c->document_item.item_type = INTERFACE_TYPE_BINDER; 131fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato c->document_item.next = NULL; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->interface_token = $1.buffer; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->oneway = false; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&c->oneway_token, 0, sizeof(buffer_type)); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->comments_token = &c->interface_token; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.interface_obj = c; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ONEWAY INTERFACE { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)malloc(sizeof(interface_type)); 140fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato c->document_item.item_type = INTERFACE_TYPE_BINDER; 141fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato c->document_item.next = NULL; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->interface_token = $2.buffer; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->oneway = true; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->oneway_token = $1.buffer; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->comments_token = &c->oneway_token; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.interface_obj = c; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 148fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato | RPC { 149fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato interface_type* c = (interface_type*)malloc(sizeof(interface_type)); 150fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato c->document_item.item_type = INTERFACE_TYPE_RPC; 151fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato c->document_item.next = NULL; 152fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato c->interface_token = $1.buffer; 153fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato c->oneway = false; 154fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato memset(&c->oneway_token, 0, sizeof(buffer_type)); 155fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato c->comments_token = &c->interface_token; 156fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato $$.interface_obj = c; 157fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato } 158fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato ; 159fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato 160fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onoratointerface_keywords: 161fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato INTERFACE 162fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato | RPC 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface_decl: 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_header IDENTIFIER '{' interface_items '}' { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = $1.interface_obj; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->name = $2.buffer; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->package = g_currentPackage ? strdup(g_currentPackage) : NULL; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->open_brace_token = $3.buffer; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->interface_items = $4.interface_item; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->close_brace_token = $5.buffer; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.interface_obj = c; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 175fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato | interface_keywords error '{' interface_items '}' { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error in interface declaration. Expected type name, saw \"%s\"\n", 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $2.buffer.lineno, $2.buffer.data); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.document_item = NULL; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 180fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato | interface_keywords error '}' { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error in interface declaration. Expected type name, saw \"%s\"\n", 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $2.buffer.lineno, $2.buffer.data); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.document_item = NULL; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface_items: 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { $$.interface_item = NULL; } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | interface_items method_decl { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_item_type* p=$1.interface_item; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p && p->next) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p=p->next; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->next = (interface_item_type*)$2.method; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.interface_item = (interface_item_type*)$2.method; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | interface_items error ';' { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error before ';' (expected method declaration)\n", 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $3.buffer.lineno); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmethod_decl: 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type IDENTIFIER '(' arg_list ')' ';' { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_type *method = (method_type*)malloc(sizeof(method_type)); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->interface_item.item_type = METHOD_TYPE; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->interface_item.next = NULL; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->type = $1.type; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->oneway = false; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&method->oneway_token, 0, sizeof(buffer_type)); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->name = $2.buffer; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->open_paren_token = $3.buffer; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->args = $4.arg; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->close_paren_token = $5.buffer; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->semicolon_token = $6.buffer; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->comments_token = &method->type.type; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.method = method; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ONEWAY type IDENTIFIER '(' arg_list ')' ';' { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_type *method = (method_type*)malloc(sizeof(method_type)); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->interface_item.item_type = METHOD_TYPE; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->interface_item.next = NULL; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->oneway = true; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->oneway_token = $1.buffer; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->type = $2.type; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->name = $3.buffer; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->open_paren_token = $4.buffer; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->args = $5.arg; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->close_paren_token = $6.buffer; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->semicolon_token = $7.buffer; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->comments_token = &method->oneway_token; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.method = method; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectarg_list: 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { $$.arg = NULL; } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | arg { $$ = $1; } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | arg_list ',' arg { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ($$.arg != NULL) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // only NULL on error 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg_type *p = $1.arg; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p && p->next) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p=p->next; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $3.arg->comma_token = $2.buffer; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->next = $3.arg; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | error { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error in parameter list\n", g_currentFilename, $1.buffer.lineno); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.arg = NULL; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectarg: 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project direction type IDENTIFIER { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg_type* arg = (arg_type*)malloc(sizeof(arg_type)); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&arg->comma_token, 0, sizeof(buffer_type)); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->direction = $1.buffer; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type = $2.type; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->name = $3.buffer; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->next = NULL; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.arg = arg; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttype: 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IDENTIFIER { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.type = $1.buffer; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init_buffer_type(&$$.type.array_token, yylineno); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.dimension = 0; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | IDENTIFIER ARRAY { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.type = $1.buffer; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.array_token = $2.buffer; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.dimension = count_brackets($2.buffer.data); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | GENERIC { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.type = $1.buffer; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init_buffer_type(&$$.type.array_token, yylineno); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.dimension = 0; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdirection: 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { init_buffer_type(&$$.buffer, yylineno); } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | IN { $$.buffer = $1.buffer; } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | OUT { $$.buffer = $1.buffer; } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | INOUT { $$.buffer = $1.buffer; } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%% 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ctype.h> 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint g_error = 0; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint yyerror(char* errstr) 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: %s\n", g_currentFilename, yylineno, errstr); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_error = 1; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid init_buffer_type(buffer_type* buf, int lineno) 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf->lineno = lineno; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf->token = 0; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf->data = NULL; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf->extra = NULL; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int count_brackets(const char* s) 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int n=0; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*s) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*s == '[') n++; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s++; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return n; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 331