diff options
Diffstat (limited to 'frontends/verilog/verilog_lexer.l')
| -rw-r--r-- | frontends/verilog/verilog_lexer.l | 19 | 
1 files changed, 16 insertions, 3 deletions
| diff --git a/frontends/verilog/verilog_lexer.l b/frontends/verilog/verilog_lexer.l index 74e8dce7f..f6a3ac4db 100644 --- a/frontends/verilog/verilog_lexer.l +++ b/frontends/verilog/verilog_lexer.l @@ -99,6 +99,18 @@ YYLTYPE old_location;  #define YY_BUF_SIZE 65536  extern int frontend_verilog_yylex(YYSTYPE *yylval_param, YYLTYPE *yyloc_param); + +static bool isUserType(std::string &s) +{ +	// check current scope then outer scopes for a name +	for (auto it = user_type_stack.rbegin(); it != user_type_stack.rend(); ++it) { +		if ((*it)->count(s) > 0) { +			return true; +		} +	} +	return false; +} +  %}  %option yylineno @@ -376,9 +388,9 @@ supply1 { return TOK_SUPPLY1; }  	// package qualifier  	auto s = std::string("\\") + yytext;  	if (pkg_user_types.count(s) > 0) { -		// found it +		// package qualified typedefed name  		yylval->string = new std::string(s); -		return TOK_USER_TYPE; +		return TOK_PKG_USER_TYPE;  	}  	else {  		// backup before :: just return first part @@ -391,7 +403,8 @@ supply1 { return TOK_SUPPLY1; }  [a-zA-Z_$][a-zA-Z0-9_$]* {  	auto s = std::string("\\") + yytext; -	if (user_types.count(s) > 0) { +	if (isUserType(s)) { +		// previously typedefed name  		yylval->string = new std::string(s);  		return TOK_USER_TYPE;  	} | 
