1 %{ 2 #include <string.h> 3 #include <stdlib.h> 4 5 #include "aidl_language.h" 6 #include "aidl_language_y.h" 7 8 #define YY_USER_ACTION yylloc->columns(yyleng); 9 %} 10 11 %option yylineno 12 %option noyywrap 13 %option reentrant 14 %option bison-bridge 15 %option bison-locations 16 17 %x COPYING LONG_COMMENT 18 19 identifier [_a-zA-Z][_a-zA-Z0-9]* 20 whitespace ([ \t\r]+) 21 intvalue [-+]?(0|[1-9][0-9]*) 22 hexvalue 0[x|X][0-9a-fA-F]+ 23 24 %% 25 %{ 26 /* This happens at every call to yylex (every time we receive one token) */ 27 std::string extra_text; 28 yylloc->step(); 29 %} 30 31 32 \%\%\{ { extra_text += "/**"; BEGIN(COPYING); } 33 <COPYING>\}\%\% { extra_text += "**/"; yylloc->step(); BEGIN(INITIAL); } 34 <COPYING>.* { extra_text += yytext; } 35 <COPYING>\n+ { extra_text += yytext; yylloc->lines(yyleng); } 36 37 \/\* { extra_text += yytext; BEGIN(LONG_COMMENT); } 38 <LONG_COMMENT>\*+\/ { extra_text += yytext; yylloc->step(); BEGIN(INITIAL); } 39 <LONG_COMMENT>\*+ { extra_text += yytext; } 40 <LONG_COMMENT>\n+ { extra_text += yytext; yylloc->lines(yyleng); } 41 <LONG_COMMENT>[^*\n]+ { extra_text += yytext; } 42 43 \"[^\"]*\" { yylval->token = new AidlToken(yytext, extra_text); 44 return yy::parser::token::C_STR; } 45 46 \/\/.*\n { extra_text += yytext; yylloc->lines(1); yylloc->step(); } 47 48 \n+ { yylloc->lines(yyleng); yylloc->step(); } 49 {whitespace} {} 50 <<EOF>> { yyterminate(); } 51 52 /* symbols */ 53 ; { return ';'; } 54 \{ { return '{'; } 55 \} { return '}'; } 56 = { return '='; } 57 , { return ','; } 58 \. { return '.'; } 59 \( { return '('; } 60 \) { return ')'; } 61 \[ { return '['; } 62 \] { return ']'; } 63 \< { return '<'; } 64 \> { return '>'; } 65 66 /* keywords */ 67 parcelable { return yy::parser::token::PARCELABLE; } 68 import { return yy::parser::token::IMPORT; } 69 package { return yy::parser::token::PACKAGE; } 70 int { return yy::parser::token::INT; } 71 String { return yy::parser::token::STRING; } 72 in { return yy::parser::token::IN; } 73 out { return yy::parser::token::OUT; } 74 inout { return yy::parser::token::INOUT; } 75 cpp_header { return yy::parser::token::CPP_HEADER; } 76 const { return yy::parser::token::CONST; } 77 @nullable { return yy::parser::token::ANNOTATION_NULLABLE; } 78 @utf8 { return yy::parser::token::ANNOTATION_UTF8; } 79 @utf8InCpp { return yy::parser::token::ANNOTATION_UTF8_CPP; } 80 81 interface { yylval->token = new AidlToken("interface", extra_text); 82 return yy::parser::token::INTERFACE; 83 } 84 oneway { yylval->token = new AidlToken("oneway", extra_text); 85 return yy::parser::token::ONEWAY; 86 } 87 88 /* scalars */ 89 {identifier} { yylval->token = new AidlToken(yytext, extra_text); 90 return yy::parser::token::IDENTIFIER; 91 } 92 {intvalue} { yylval->integer = std::stoi(yytext); 93 return yy::parser::token::INTVALUE; } 94 {hexvalue} { yylval->token = new AidlToken(yytext, extra_text); 95 return yy::parser::token::HEXVALUE; } 96 97 /* syntax error! */ 98 . { printf("UNKNOWN(%s)", yytext); 99 yylval->token = new AidlToken(yytext, extra_text); 100 return yy::parser::token::IDENTIFIER; 101 } 102 103 %% 104 105 // comment and whitespace handling 106 // ================================================ 107