blob: c72dc9ecc6b82be5df0ae00644d2b50c4cca0e10 [file] [log] [blame]
Adam Lesinskiffa16862014-01-23 18:17:42 -08001%{
Adam Lesinskiffa16862014-01-23 18:17:42 -08002#include <string.h>
3#include <stdlib.h>
Christopher Wileyf690be52015-09-14 15:19:10 -07004
5#include "aidl_language.h"
6#include "aidl_language_y.hpp"
7#include "parse_helpers.h"
8#include "search_path.h"
Adam Lesinskiffa16862014-01-23 18:17:42 -08009
Adam Lesinskiffa16862014-01-23 18:17:42 -080010// comment and whitespace handling
11// these functions save a copy of the buffer
12static void begin_extra_text(unsigned lineno, which_extra_text which);
13static void append_extra_text(char* text);
14static extra_text_type* get_extra_text(void); // you now own the object
15 // this returns
16static void drop_extra_text(void);
17
Casey Dahlin030977a2015-09-29 11:29:35 -070018using android::aidl::cpp_strdup;
19
Casey Dahlin3c6df362015-10-06 15:48:35 -070020#define RETURN_BUFFER(t) \
Adam Lesinskiffa16862014-01-23 18:17:42 -080021 do { \
Casey Dahlindd691812015-09-09 17:59:06 -070022 yylval->buffer.lineno = yyget_lineno(yyscanner); \
23 yylval->buffer.token = (t); \
Casey Dahlin030977a2015-09-29 11:29:35 -070024 yylval->buffer.data = cpp_strdup(yytext); \
Casey Dahlindd691812015-09-09 17:59:06 -070025 yylval->buffer.extra = get_extra_text(); \
Casey Dahlin3c6df362015-10-06 15:48:35 -070026 return (t); \
Adam Lesinskiffa16862014-01-23 18:17:42 -080027 } while(0)
28
Casey Dahlin1aa158e2015-09-14 15:26:57 -070029#define YY_USER_ACTION yylloc->columns(yyleng);
Adam Lesinskiffa16862014-01-23 18:17:42 -080030%}
31
32%option yylineno
33%option noyywrap
Casey Dahlindd691812015-09-09 17:59:06 -070034%option reentrant
35%option bison-bridge
Casey Dahlinfd2e08a2015-09-10 18:29:09 -070036%option bison-locations
Adam Lesinskiffa16862014-01-23 18:17:42 -080037
38%x COPYING LONG_COMMENT
39
40identifier [_a-zA-Z][_a-zA-Z0-9\.]*
Casey Dahlin1aa158e2015-09-14 15:26:57 -070041whitespace ([ \t\r]+)
Adam Lesinskiffa16862014-01-23 18:17:42 -080042idvalue (0|[1-9][0-9]*)
43
44%%
Casey Dahlin1aa158e2015-09-14 15:26:57 -070045%{
46 /* This happens at every call to yylex (every time we receive one token) */
47 yylloc->step();
48%}
Adam Lesinskiffa16862014-01-23 18:17:42 -080049
50
Casey Dahlin3c6df362015-10-06 15:48:35 -070051\%\%\{ { begin_extra_text(yylineno, COPY_TEXT);
52 BEGIN(COPYING); }
53<COPYING>\}\%\% { yylloc->step(); BEGIN(INITIAL); }
54<COPYING>.* { append_extra_text(yytext); }
55<COPYING>\n+ { yylloc->lines(yyleng); append_extra_text(yytext); }
Adam Lesinskiffa16862014-01-23 18:17:42 -080056
Casey Dahlin3c6df362015-10-06 15:48:35 -070057\/\* { begin_extra_text(yylineno,
58 (which_extra_text)LONG_COMMENT);
59 BEGIN(LONG_COMMENT); }
60<LONG_COMMENT>\n+ { yylloc->lines(yyleng); append_extra_text(yytext); }
61<LONG_COMMENT>[^*]* { append_extra_text(yytext); }
62<LONG_COMMENT>\*+[^/] { append_extra_text(yytext); }
63<LONG_COMMENT>\*+\/ { yylloc->step(); BEGIN(INITIAL); }
Adam Lesinskiffa16862014-01-23 18:17:42 -080064
Casey Dahlin3c6df362015-10-06 15:48:35 -070065\/\/.*\n { begin_extra_text(yylineno, SHORT_COMMENT);
66 append_extra_text(yytext);
67 yylloc->lines(1);
Casey Dahlin1aa158e2015-09-14 15:26:57 -070068 yylloc->step(); }
69
Casey Dahlin3c6df362015-10-06 15:48:35 -070070\n+ { yylloc->lines(yyleng); yylloc->step(); }
71{whitespace} {}
72<<EOF>> { yyterminate(); }
Adam Lesinskiffa16862014-01-23 18:17:42 -080073
Casey Dahlin3c6df362015-10-06 15:48:35 -070074 /* symbols */
75; { RETURN_BUFFER(';'); }
76\{ { RETURN_BUFFER('{'); }
77\} { RETURN_BUFFER('}'); }
Adam Lesinskiffa16862014-01-23 18:17:42 -080078
Casey Dahlin3c6df362015-10-06 15:48:35 -070079= { return '='; }
80, { return ','; }
81\. { return '.'; }
82\( { return '('; }
83\) { return ')'; }
84\[ { return '['; }
85\] { return ']'; }
86\< { return '<'; }
87\> { return '>'; }
Casey Dahlin5c69deb2015-10-01 14:44:12 -070088
Adam Lesinskiffa16862014-01-23 18:17:42 -080089 /* keywords */
Casey Dahlin3c6df362015-10-06 15:48:35 -070090parcelable { RETURN_BUFFER(yy::parser::token::PARCELABLE); }
91interface { RETURN_BUFFER(yy::parser::token::INTERFACE); }
92oneway { RETURN_BUFFER(yy::parser::token::ONEWAY); }
Adam Lesinskiffa16862014-01-23 18:17:42 -080093
Casey Dahlin3c6df362015-10-06 15:48:35 -070094import { return yy::parser::token::IMPORT; }
95package { return yy::parser::token::PACKAGE; }
96in { return yy::parser::token::IN; }
97out { return yy::parser::token::OUT; }
98inout { return yy::parser::token::INOUT; }
Casey Dahlinfd6fb482015-09-30 14:48:18 -070099
Casey Dahlin3c6df362015-10-06 15:48:35 -0700100 /* scalars */
101{idvalue} { RETURN_BUFFER(yy::parser::token::IDVALUE); }
102{identifier} { RETURN_BUFFER(yy::parser::token::IDENTIFIER); }
Adam Lesinskiffa16862014-01-23 18:17:42 -0800103
104 /* syntax error! */
Casey Dahlin3c6df362015-10-06 15:48:35 -0700105. { printf("UNKNOWN(%s)", yytext);
106 yylval->buffer.lineno = yylineno;
107 yylval->buffer.token = yy::parser::token::IDENTIFIER;
108 yylval->buffer.data = cpp_strdup(yytext);
109 return yy::parser::token::IDENTIFIER;
110 }
Adam Lesinskiffa16862014-01-23 18:17:42 -0800111
112%%
113
114// comment and whitespace handling
115// ================================================
116extra_text_type* g_extraText = NULL;
117extra_text_type* g_nextExtraText = NULL;
118
119void begin_extra_text(unsigned lineno, which_extra_text which)
120{
Casey Dahlin030977a2015-09-29 11:29:35 -0700121 extra_text_type* text = new extra_text_type();
Adam Lesinskiffa16862014-01-23 18:17:42 -0800122 text->lineno = lineno;
123 text->which = which;
124 text->data = NULL;
125 text->len = 0;
126 text->next = NULL;
127 if (g_nextExtraText == NULL) {
128 g_extraText = text;
129 } else {
130 g_nextExtraText->next = text;
131 }
132 g_nextExtraText = text;
133}
134
135void append_extra_text(char* text)
136{
137 if (g_nextExtraText->data == NULL) {
Casey Dahlin030977a2015-09-29 11:29:35 -0700138 g_nextExtraText->data = cpp_strdup(text);
Adam Lesinskiffa16862014-01-23 18:17:42 -0800139 g_nextExtraText->len = strlen(text);
140 } else {
141 char* orig = g_nextExtraText->data;
142 unsigned oldLen = g_nextExtraText->len;
143 unsigned len = strlen(text);
144 g_nextExtraText->len += len;
Casey Dahlin030977a2015-09-29 11:29:35 -0700145 g_nextExtraText->data = new char[g_nextExtraText->len+1];
Adam Lesinskiffa16862014-01-23 18:17:42 -0800146 memcpy(g_nextExtraText->data, orig, oldLen);
147 memcpy(g_nextExtraText->data+oldLen, text, len);
148 g_nextExtraText->data[g_nextExtraText->len] = '\0';
Casey Dahlin030977a2015-09-29 11:29:35 -0700149 delete[] orig;
Adam Lesinskiffa16862014-01-23 18:17:42 -0800150 }
151}
152
153extra_text_type*
154get_extra_text(void)
155{
156 extra_text_type* result = g_extraText;
157 g_extraText = NULL;
158 g_nextExtraText = NULL;
159 return result;
160}
161
162void drop_extra_text(void)
163{
164 extra_text_type* p = g_extraText;
165 while (p) {
166 extra_text_type* next = p->next;
Casey Dahlin030977a2015-09-29 11:29:35 -0700167 delete[] p->data;
168 delete p;
169 p = next;
Adam Lesinskiffa16862014-01-23 18:17:42 -0800170 }
171 g_extraText = NULL;
172 g_nextExtraText = NULL;
173}