major revamp, fully qualified names (FQName) used throughout lexer/parser.
diff --git a/hidl-gen_l.ll b/hidl-gen_l.ll
index cea965a..5e1bbea 100644
--- a/hidl-gen_l.ll
+++ b/hidl-gen_l.ll
@@ -5,6 +5,12 @@
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 "AST.h"
@@ -30,7 +36,7 @@
do { \
count(yyg); \
yylval->type = new ScalarType(ScalarType::kind); \
- return TYPENAME; \
+ return SCALAR; \
} while (0)
%}
@@ -71,8 +77,8 @@
"float" { SCALAR_TYPE(KIND_FLOAT); }
"double" { SCALAR_TYPE(KIND_DOUBLE); }
-"handle" { count(yyg); yylval->type = new HandleType; return TYPENAME; }
-"string" { count(yyg); yylval->type = new StringType; return TYPENAME; }
+"handle" { count(yyg); yylval->type = new HandleType; return SCALAR; }
+"string" { count(yyg); yylval->type = new StringType; return SCALAR; }
"(" { count(yyg); return('('); }
")" { count(yyg); return(')'); }
@@ -88,7 +94,10 @@
"." { count(yyg); return('.'); }
"=" { count(yyg); return('='); }
-{L}({L}|{D})* { count(yyg); return check_type(yyscanner, yyg); }
+{PATH}{VERSION}?"::"{PATH} { count(yyg); yylval->str = strdup(yytext); return FQNAME; }
+{VERSION}"::"{PATH} { 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); }
@@ -139,21 +148,6 @@
ECHO;
}
-int check_type(yyscan_t yyscanner, yyguts_t *yyg) {
- AST *ast = yyextra;
-
- Type *type = ast->lookupType(yytext);
- if (type != NULL) {
- yylval->type = new RefType(yytext, type);
-
- return TYPENAME;
- }
-
- yylval->str = strdup(yytext);
-
- return IDENTIFIER;
-}
-
void parseFile(AST *ast, const char *path) {
FILE *file = fopen(path, "rb");