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 23 %% 24 %{ 25 /* This happens at every call to yylex (every time we receive one token) */ 26 std::string extra_text; 27 yylloc->step(); 28 %} 29 30 31 \%\%\{ { extra_text += "/**"; BEGIN(COPYING); } 32 <COPYING>\}\%\% { extra_text += "**/"; yylloc->step(); BEGIN(INITIAL); } 33 <COPYING>.* { extra_text += yytext; } 34 <COPYING>\n+ { extra_text += yytext; yylloc->lines(yyleng); } 35 36 \/\* { extra_text += yytext; BEGIN(LONG_COMMENT); } 37 <LONG_COMMENT>\*+\/ { extra_text += yytext; yylloc->step(); BEGIN(INITIAL); } 38 <LONG_COMMENT>\*+ { extra_text += yytext; } 39 <LONG_COMMENT>\n+ { extra_text += yytext; yylloc->lines(yyleng); } 40 <LONG_COMMENT>[^*\n]+ { extra_text += yytext; } 41 42 \"[^\"]*\" { yylval->token = new AidlToken(yytext, extra_text); 43 return yy::parser::token::C_STR; } 44 45 \/\/.*\n { extra_text += yytext; yylloc->lines(1); yylloc->step(); } 46 47 \n+ { yylloc->lines(yyleng); yylloc->step(); } 48 {whitespace} {} 49 <<EOF>> { yyterminate(); } 50 51 /* symbols */ 52 ; { return ';'; } 53 \{ { return '{'; } 54 \} { return '}'; } 55 = { return '='; } 56 , { return ','; } 57 \. { return '.'; } 58 \( { return '('; } 59 \) { return ')'; } 60 \[ { return '['; } 61 \] { return ']'; } 62 \< { return '<'; } 63 \> { return '>'; } 64 65 /* keywords */ 66 parcelable { return yy::parser::token::PARCELABLE; } 67 import { return yy::parser::token::IMPORT; } 68 package { return yy::parser::token::PACKAGE; } 69 int { return yy::parser::token::INT; } 70 in { return yy::parser::token::IN; } 71 out { return yy::parser::token::OUT; } 72 inout { return yy::parser::token::INOUT; } 73 cpp_header { return yy::parser::token::CPP_HEADER; } 74 const { return yy::parser::token::CONST; } 75 @nullable { return yy::parser::token::ANNOTATION_NULLABLE; } 76 @utf8 { return yy::parser::token::ANNOTATION_UTF8; } 77 @utf8InCpp { return yy::parser::token::ANNOTATION_UTF8_CPP; } 78 79 interface { yylval->token = new AidlToken("interface", extra_text); 80 return yy::parser::token::INTERFACE; 81 } 82 oneway { yylval->token = new AidlToken("oneway", extra_text); 83 return yy::parser::token::ONEWAY; 84 } 85 86 /* scalars */ 87 {identifier} { yylval->token = new AidlToken(yytext, extra_text); 88 return yy::parser::token::IDENTIFIER; 89 } 90 {intvalue} { yylval->integer = std::stoi(yytext); 91 return yy::parser::token::INTVALUE; } 92 93 /* syntax error! */ 94 . { printf("UNKNOWN(%s)", yytext); 95 yylval->token = new AidlToken(yytext, extra_text); 96 return yy::parser::token::IDENTIFIER; 97 } 98 99 %% 100 101 // comment and whitespace handling 102 // ================================================ 103