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 
     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