Home | History | Annotate | Download | only in aidl
      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