1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef enum { 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski NO_EXTRA_TEXT = 0, 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SHORT_COMMENT, 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski LONG_COMMENT, 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski COPY_TEXT, 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski WHITESPACE 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} which_extra_text; 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct extra_text_type { 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned lineno; 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski which_extra_text which; 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski char* data; 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned len; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski struct extra_text_type* next; 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} extra_text_type; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct buffer_type { 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned lineno; 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned token; 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski char *data; 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski extra_text_type* extra; 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} buffer_type; 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct type_type { 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type type; 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type array_token; 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int dimension; 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} type_type; 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct arg_type { 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type comma_token; // empty in the first one in the list 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type direction; 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski type_type type; 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type name; 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski struct arg_type *next; 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} arg_type; 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum { 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski METHOD_TYPE 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct interface_item_type { 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned item_type; 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski struct interface_item_type* next; 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} interface_item_type; 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct method_type { 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski interface_item_type interface_item; 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski type_type type; 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool oneway; 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type oneway_token; 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type name; 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type open_paren_token; 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski arg_type* args; 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type close_paren_token; 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool hasId; 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type equals_token; 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type id; 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // XXX missing comments/copy text here 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type semicolon_token; 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type* comments_token; // points into this structure, DO NOT DELETE 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int assigned_id; 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} method_type; 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum { 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski USER_DATA_TYPE = 12, 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski INTERFACE_TYPE_BINDER, 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski INTERFACE_TYPE_RPC 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct document_item_type { 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned item_type; 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski struct document_item_type* next; 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} document_item_type; 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// for user_data_type.flattening_methods 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum { 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski PARCELABLE_DATA = 0x1, 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski RPC_DATA = 0x2 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct user_data_type { 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski document_item_type document_item; 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type keyword_token; // only the first one 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski char* package; 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type name; 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type semicolon_token; 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int flattening_methods; 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} user_data_type; 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct interface_type { 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski document_item_type document_item; 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type interface_token; 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool oneway; 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type oneway_token; 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski char* package; 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type name; 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type open_brace_token; 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski interface_item_type* interface_items; 105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type close_brace_token; 106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type* comments_token; // points into this structure, DO NOT DELETE 107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} interface_type; 108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef union lexer_type { 110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski buffer_type buffer; 111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski type_type type; 112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski arg_type *arg; 113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski method_type* method; 114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski interface_item_type* interface_item; 115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski interface_type* interface_obj; 116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski user_data_type* user_data; 117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski document_item_type* document_item; 118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} lexer_type; 119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define YYSTYPE lexer_type 122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if __cplusplus 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern "C" { 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif 126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint parse_aidl(char const *); 128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// strips off the leading whitespace, the "import" text 130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// also returns whether it's a local or system import 131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// we rely on the input matching the import regex from below 132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskichar* parse_import_statement(const char* text); 133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// in, out or inout 135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum { 136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski IN_PARAMETER = 1, 137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski OUT_PARAMETER = 2, 138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski INOUT_PARAMETER = 3 139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint convert_direction(const char* direction); 141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// callbacks from within the parser 143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// these functions all take ownership of the strings 144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct ParserCallbacks { 145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void (*document)(document_item_type* items); 146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void (*import)(buffer_type* statement); 147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} ParserCallbacks; 148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern ParserCallbacks* g_callbacks; 150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// true if there was an error parsing, false otherwise 152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern int g_error; 153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// the name of the file we're currently parsing 155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern char const* g_currentFilename; 156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// the package name for our current file 158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern char const* g_currentPackage; 159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef enum { 161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski STATEMENT_INSIDE_INTERFACE 162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} error_type; 163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid init_buffer_type(buffer_type* buf, int lineno); 165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if __cplusplus 168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif 170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H 173