blob: d2066a99f896a198b44b4b73fddab1418767c28f [file] [log] [blame]
D [0-9]
L [a-zA-Z_]
H [a-fA-F0-9]
E [Ee][+-]?{D}+
FS (f|F|l|L)
IS (u|U|l|L)*
COMPONENT {L}({L}|{D})*
DOT [.]
PATH {COMPONENT}({DOT}{COMPONENT})*
AT [@]
VERSION {AT}{D}+{DOT}{D}+
%{
#include "Annotation.h"
#include "AST.h"
#include "CompoundType.h"
#include "EnumType.h"
#include "HandleType.h"
#include "Method.h"
#include "ScalarType.h"
#include "StringType.h"
#include "hidl-gen_y.h"
#include <assert.h>
using namespace android;
void count(struct yyguts_t *yyg);
void comment(yyscan_t yyscanner, struct yyguts_t *yyg);
int check_type(yyscan_t yyscanner, struct yyguts_t *yyg);
#define SCALAR_TYPE(kind) \
do { \
count(yyg); \
yylval->type = new ScalarType(ScalarType::kind); \
return SCALAR; \
} while (0)
%}
%option reentrant
%option bison-bridge
%option extra-type="android::AST *"
%%
"/*" { comment(yyscanner, yyg); }
"//"[^\r\n]* { /* skip C++ style comment */ }
"const" { count(yyg); return(CONST); }
"enum" { count(yyg); return(ENUM); }
"extends" { count(yyg); return(EXTENDS); }
"generates" { count(yyg); return(GENERATES); }
"import" { count(yyg); return(IMPORT); }
"interface" { count(yyg); return(INTERFACE); }
"package" { count(yyg); return(PACKAGE); }
"struct" { count(yyg); return(STRUCT); }
"typedef" { count(yyg); return(TYPEDEF); }
"union" { count(yyg); return(UNION); }
"vec" { count(yyg); return(VEC); }
"oneway" { count(yyg); return(ONEWAY); }
"char" { SCALAR_TYPE(KIND_CHAR); }
"bool" { SCALAR_TYPE(KIND_BOOL); }
"opaque" { SCALAR_TYPE(KIND_OPAQUE); }
"int8_t" { SCALAR_TYPE(KIND_INT8); }
"uint8_t" { SCALAR_TYPE(KIND_UINT8); }
"int16_t" { SCALAR_TYPE(KIND_INT16); }
"uint16_t" { SCALAR_TYPE(KIND_UINT16); }
"int32_t" { SCALAR_TYPE(KIND_INT32); }
"uint32_t" { SCALAR_TYPE(KIND_UINT32); }
"int64_t" { SCALAR_TYPE(KIND_INT64); }
"uint64_t" { SCALAR_TYPE(KIND_UINT64); }
"float" { SCALAR_TYPE(KIND_FLOAT); }
"double" { SCALAR_TYPE(KIND_DOUBLE); }
"handle" { count(yyg); yylval->type = new HandleType; return SCALAR; }
"string" { count(yyg); yylval->type = new StringType; return SCALAR; }
"(" { count(yyg); return('('); }
")" { count(yyg); return(')'); }
"<" { count(yyg); return('<'); }
">" { count(yyg); return('>'); }
"{" { count(yyg); return('{'); }
"}" { count(yyg); return('}'); }
"[" { count(yyg); return('['); }
"]" { count(yyg); return(']'); }
":" { count(yyg); return(':'); }
";" { count(yyg); return(';'); }
"," { count(yyg); return(','); }
"." { count(yyg); return('.'); }
"=" { count(yyg); return('='); }
"+" { count(yyg); return('+'); }
"@" { count(yyg); return('@'); }
{PATH}{VERSION}?"::"{PATH} { count(yyg); yylval->str = strdup(yytext); return FQNAME; }
{VERSION}"::"{PATH} { count(yyg); yylval->str = strdup(yytext); return FQNAME; }
{PATH}{VERSION} { count(yyg); yylval->str = strdup(yytext); return FQNAME; }
{COMPONENT}({DOT}{COMPONENT})+ { count(yyg); yylval->str = strdup(yytext); return FQNAME; }
{COMPONENT} { count(yyg); yylval->str = strdup(yytext); return IDENTIFIER; }
0[xX]{H}+{IS}? { count(yyg); yylval->str = strdup(yytext); return(INTEGER); }
0{D}+{IS}? { count(yyg); yylval->str = strdup(yytext); return(INTEGER); }
{D}+{IS}? { count(yyg); yylval->str = strdup(yytext); return(INTEGER); }
L?\"(\\.|[^\\"])*\" { count(yyg); yylval->str = strdup(yytext); return(STRING_LITERAL); }
[ \t\v\n\f] { count(yyg); }
. { /* ignore bad characters */ }
%%
int yywrap(yyscan_t) {
return 1;
}
void comment(yyscan_t yyscanner, yyguts_t *yyg) {
char c, c1;
loop:
while ((c = yyinput(yyscanner)) != '*' && c != 0)
putchar(c);
if ((c1 = yyinput(yyscanner)) != '/' && c != 0)
{
unput(c1);
goto loop;
}
if (c != 0) {
putchar(c1);
}
}
int column = 0;
void count(yyguts_t *yyg) {
int i;
for (i = 0; yytext[i] != '\0'; i++)
if (yytext[i] == '\n')
column = 0;
else if (yytext[i] == '\t')
column += 8 - (column % 8);
else
column++;
ECHO;
}
status_t parseFile(AST *ast, const char *path) {
FILE *file = fopen(path, "rb");
if (file == NULL) {
return -errno;
}
yyscan_t scanner;
yylex_init_extra(ast, &scanner);
ast->setScanner(scanner);
yyset_in(file, scanner);
int res = yyparse(ast);
yylex_destroy(scanner);
ast->setScanner(NULL);
fclose(file);
file = NULL;
if (res != 0) {
return UNKNOWN_ERROR;
}
return OK;
}