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");