blob: e797abb575f305d775faa1c8d6cbfa6441f76468 [file] [log] [blame]
%{
#include <string.h>
#include <stdlib.h>
#include "ast.h"
#include "hidl_language_y.h"
#define YY_USER_ACTION yylloc->columns(yyleng);
%}
%option yylineno
%option noyywrap
%option reentrant
%option bison-bridge
%option bison-locations
%x LONG_COMMENT LINE_COMMENT STRING
identifier [_a-zA-Z]([_a-zA-Z0-9]|\:\:)*
whitespace ([ \t\r]+)
intvalue [-+]?(0[0-7']*|[1-9][0-9']*|0[xX][0-9a-fA-F']+|0[bB][01']+)((l|L|ll|LL)?(u|U)?|(u|U)?(l|L|ll|LL)?)
%%
%{
/* This happens at every call to yylex (every time we receive one token) */
std::string extra_text;
yylloc->step();
%}
\/\* { extra_text = yytext; BEGIN(LONG_COMMENT); }
<LONG_COMMENT>\*+\/ { extra_text += yytext;
yylval->element = new CommentElement(extra_text, "",
yylloc->begin.line);
yylloc->step(); BEGIN(INITIAL); /*return yy::parser::token::COMMENT;*/ }
<LONG_COMMENT>\*+ { extra_text += yytext; }
<LONG_COMMENT>\n+ { extra_text += yytext; yylloc->lines(yyleng); }
<LONG_COMMENT>[^*\n]+ { extra_text += yytext; }
\"([^\"]|\\\")*\" { yylval->element = new StringElement(yytext,
yylloc->begin.line);
return yy::parser::token::C_STR; }
\'([^\\']|\\.)\' { yylval->element = new IntElement(yytext, extra_text,
yylloc->begin.line);
return yy::parser::token::C_CHAR; }
\/\/.*\n { yylval->element = new CommentElement(yytext, "",
yylloc->begin.line);
yylloc->lines(1);
yylloc->step();
/*return yy::parser::token::COMMENT;*/ }
\n+ { yylloc->lines(yyleng); yylloc->step(); }
{whitespace} {}
<<EOF>> { yyterminate(); }
/* symbols */
; { return ';'; }
: { return ':'; }
\{ { return '{'; }
\} { return '}'; }
= { return '='; }
, { return ','; }
@ { return '@'; }
\. { return '.'; }
\( { return '('; }
\) { return ')'; }
\[ { return '['; }
\] { return ']'; }
\< { return '<'; }
\> { return '>'; }
\|\| { return yy::parser::token::OR; }
&& { return yy::parser::token::AND; }
\| { return '|'; }
\^ { return '^'; }
& { return '&'; }
== { return yy::parser::token::EQ; }
!= { return yy::parser::token::NE; }
\<= { return yy::parser::token::LE; }
\>= { return yy::parser::token::GE; }
\>\> { return yy::parser::token::RSHIFT; }
\<\< { return yy::parser::token::LSHIFT; }
\+ { return '+'; }
- { return '-'; }
\* { return '*'; }
\/ { return '/'; }
% { return '%'; }
~ { return '~'; }
! { return '!'; }
/* keywords */
const { return yy::parser::token::CONST; }
oneway { return yy::parser::token::ONEWAY; }
struct { return yy::parser::token::STRUCT; }
union { return yy::parser::token::UNION; }
enum { return yy::parser::token::ENUM; }
typedef { return yy::parser::token::TYPEDEF; }
version { return yy::parser::token::VERSION; }
package { return yy::parser::token::PACKAGE; }
interface { return yy::parser::token::INTERFACE; }
generates { return yy::parser::token::GENERATES; }
selects { return yy::parser::token::SELECTS; }
import { return yy::parser::token::IMPORT; }
ref { return yy::parser::token::REF; }
vec { return yy::parser::token::VEC; }
on { return yy::parser::token::ON; }
int8_t { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::INT8; }
int16_t { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::INT16; }
int32_t { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::INT32; }
int64_t { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::INT64; }
uint8_t { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::UINT8; }
uint16_t { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::UINT16; }
uint32_t { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::UINT32; }
uint64_t { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::UINT64; }
char { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::CHAR; }
opaque { yylval->type = new ScalarType(new NameElement(yytext, extra_text,
yylloc->begin.line)); return yy::parser::token::OPAQUE; }
handle { yylval->type = new HandleType(); return yy::parser::token::HANDLE; }
string { yylval->type = new StringType(); return yy::parser::token::STRINGTOK; }
/* scalars */
{identifier} { yylval->element = new NameElement(yytext, extra_text,
yylloc->begin.line);
return yy::parser::token::IDENTIFIER;
}
{intvalue} { yylval->element = new IntElement(yytext, extra_text,
yylloc->begin.line);
return yy::parser::token::INTVALUE; }
/* syntax Error! */
. { printf("UNKNOWN(%s)", yytext);
yylval->element = new ErrorElement(yytext, extra_text, yylloc->begin.line);
return yy::parser::token::IDENTIFIER;
}
%%
// comment and whitespace handling
// ================================================