106 lines
3.8 KiB
LLVM
106 lines
3.8 KiB
LLVM
%{
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "aidl_language.h"
|
|
#include "aidl_language_y.h"
|
|
|
|
#define YY_USER_ACTION yylloc->columns(yyleng);
|
|
%}
|
|
|
|
%option yylineno
|
|
%option noyywrap
|
|
%option reentrant
|
|
%option bison-bridge
|
|
%option bison-locations
|
|
|
|
%x COPYING LONG_COMMENT
|
|
|
|
identifier [_a-zA-Z][_a-zA-Z0-9]*
|
|
whitespace ([ \t\r]+)
|
|
intvalue [-+]?(0|[1-9][0-9]*)
|
|
hexvalue 0[x|X][0-9a-fA-F]+
|
|
|
|
%%
|
|
%{
|
|
/* This happens at every call to yylex (every time we receive one token) */
|
|
std::string extra_text;
|
|
yylloc->step();
|
|
%}
|
|
|
|
|
|
\%\%\{ { extra_text += "/**"; BEGIN(COPYING); }
|
|
<COPYING>\}\%\% { extra_text += "**/"; yylloc->step(); BEGIN(INITIAL); }
|
|
<COPYING>.* { extra_text += yytext; }
|
|
<COPYING>\n+ { extra_text += yytext; yylloc->lines(yyleng); }
|
|
|
|
\/\* { extra_text += yytext; BEGIN(LONG_COMMENT); }
|
|
<LONG_COMMENT>\*+\/ { extra_text += yytext; yylloc->step(); BEGIN(INITIAL); }
|
|
<LONG_COMMENT>\*+ { extra_text += yytext; }
|
|
<LONG_COMMENT>\n+ { extra_text += yytext; yylloc->lines(yyleng); }
|
|
<LONG_COMMENT>[^*\n]+ { extra_text += yytext; }
|
|
|
|
\"[^\"]*\" { yylval->token = new AidlToken(yytext, extra_text);
|
|
return yy::parser::token::C_STR; }
|
|
|
|
\/\/.*\n { extra_text += yytext; yylloc->lines(1); yylloc->step(); }
|
|
|
|
\n+ { yylloc->lines(yyleng); yylloc->step(); }
|
|
{whitespace} {}
|
|
<<EOF>> { yyterminate(); }
|
|
|
|
/* symbols */
|
|
; { return ';'; }
|
|
\{ { return '{'; }
|
|
\} { return '}'; }
|
|
= { return '='; }
|
|
, { return ','; }
|
|
\. { return '.'; }
|
|
\( { return '('; }
|
|
\) { return ')'; }
|
|
\[ { return '['; }
|
|
\] { return ']'; }
|
|
\< { return '<'; }
|
|
\> { return '>'; }
|
|
|
|
/* keywords */
|
|
parcelable { return yy::parser::token::PARCELABLE; }
|
|
import { return yy::parser::token::IMPORT; }
|
|
package { return yy::parser::token::PACKAGE; }
|
|
int { return yy::parser::token::INT; }
|
|
String { return yy::parser::token::STRING; }
|
|
in { return yy::parser::token::IN; }
|
|
out { return yy::parser::token::OUT; }
|
|
inout { return yy::parser::token::INOUT; }
|
|
cpp_header { return yy::parser::token::CPP_HEADER; }
|
|
const { return yy::parser::token::CONST; }
|
|
@nullable { return yy::parser::token::ANNOTATION_NULLABLE; }
|
|
@utf8 { return yy::parser::token::ANNOTATION_UTF8; }
|
|
@utf8InCpp { return yy::parser::token::ANNOTATION_UTF8_CPP; }
|
|
|
|
interface { yylval->token = new AidlToken("interface", extra_text);
|
|
return yy::parser::token::INTERFACE;
|
|
}
|
|
oneway { yylval->token = new AidlToken("oneway", extra_text);
|
|
return yy::parser::token::ONEWAY;
|
|
}
|
|
|
|
/* scalars */
|
|
{identifier} { yylval->token = new AidlToken(yytext, extra_text);
|
|
return yy::parser::token::IDENTIFIER;
|
|
}
|
|
{intvalue} { yylval->integer = std::stoi(yytext);
|
|
return yy::parser::token::INTVALUE; }
|
|
{hexvalue} { yylval->token = new AidlToken(yytext, extra_text);
|
|
return yy::parser::token::HEXVALUE; }
|
|
|
|
/* syntax error! */
|
|
. { printf("UNKNOWN(%s)", yytext);
|
|
yylval->token = new AidlToken(yytext, extra_text);
|
|
return yy::parser::token::IDENTIFIER;
|
|
}
|
|
|
|
%%
|
|
|
|
// comment and whitespace handling
|
|
// ================================================
|