You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.8 KiB
106 lines
3.8 KiB
%{ |
|
#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 |
|
// ================================================
|
|
|