Add parser helper rule for class identifiers
There are a few places in the grammar that follow the pattern of `implicit_class_handle '.' hierarchy_identifier` and then splice the two identifier paths into a single one. Factor this into a common helper rule to avoid duplicated code. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
9810ce6e60
commit
967e3455fe
55
parse.y
55
parse.y
|
|
@ -639,7 +639,7 @@ static void current_function_set_statement(const YYLTYPE&loc, std::vector<Statem
|
||||||
%type <let_port_lst> let_port_list_opt let_port_list
|
%type <let_port_lst> let_port_list_opt let_port_list
|
||||||
%type <let_port_itm> let_port_item
|
%type <let_port_itm> let_port_item
|
||||||
|
|
||||||
%type <pform_name> hierarchy_identifier implicit_class_handle
|
%type <pform_name> hierarchy_identifier implicit_class_handle class_hierarchy_identifier
|
||||||
%type <expr> assignment_pattern expression expr_mintypmax
|
%type <expr> assignment_pattern expression expr_mintypmax
|
||||||
%type <expr> expr_primary_or_typename expr_primary
|
%type <expr> expr_primary_or_typename expr_primary
|
||||||
%type <expr> class_new dynamic_array_new let_default_opt
|
%type <expr> class_new dynamic_array_new let_default_opt
|
||||||
|
|
@ -1536,6 +1536,15 @@ implicit_class_handle /* IEEE1800-2005: A.8.4 */
|
||||||
| K_super { $$ = pform_create_super(); }
|
| K_super { $$ = pform_create_super(); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
/* `this` or `super` followed by an identifier */
|
||||||
|
class_hierarchy_identifier
|
||||||
|
: implicit_class_handle '.' hierarchy_identifier
|
||||||
|
{ $1->splice($1->end(), *$3);
|
||||||
|
delete $3;
|
||||||
|
$$ = $1;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
/* SystemVerilog adds support for the increment/decrement
|
/* SystemVerilog adds support for the increment/decrement
|
||||||
expressions, which look like a++, --a, etc. These are primaries
|
expressions, which look like a++, --a, etc. These are primaries
|
||||||
but are in their own rules because they can also be
|
but are in their own rules because they can also be
|
||||||
|
|
@ -3759,17 +3768,11 @@ expr_primary
|
||||||
delete $2;
|
delete $2;
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| implicit_class_handle '.' hierarchy_identifier '(' expression_list_with_nuls ')'
|
| class_hierarchy_identifier '(' expression_list_with_nuls ')'
|
||||||
{ pform_name_t*t_name = $1;
|
{ list<PExpr*>*expr_list = $3;
|
||||||
while (! $3->empty()) {
|
|
||||||
t_name->push_back($3->front());
|
|
||||||
$3->pop_front();
|
|
||||||
}
|
|
||||||
list<PExpr*>*expr_list = $5;
|
|
||||||
strip_tail_items(expr_list);
|
strip_tail_items(expr_list);
|
||||||
PECallFunction*tmp = pform_make_call_function(@1, *t_name, *expr_list);
|
PECallFunction*tmp = pform_make_call_function(@1, *$1, *expr_list);
|
||||||
delete $1;
|
delete $1;
|
||||||
delete $3;
|
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| SYSTEM_IDENTIFIER '(' expression_list_proper ')'
|
| SYSTEM_IDENTIFIER '(' expression_list_proper ')'
|
||||||
|
|
@ -3803,16 +3806,10 @@ expr_primary
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
| implicit_class_handle '.' hierarchy_identifier
|
| class_hierarchy_identifier
|
||||||
{ pform_name_t*t_name = $1;
|
{ PEIdent*tmp = new PEIdent(*$1);
|
||||||
while (! $3->empty()) {
|
FILE_NAME(tmp, @1);
|
||||||
t_name->push_back($3->front());
|
|
||||||
$3->pop_front();
|
|
||||||
}
|
|
||||||
PEIdent*tmp = new PEIdent(*t_name);
|
|
||||||
FILE_NAME(tmp,@1);
|
|
||||||
delete $1;
|
delete $1;
|
||||||
delete $3;
|
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4610,17 +4607,11 @@ lpvalue
|
||||||
delete $1;
|
delete $1;
|
||||||
}
|
}
|
||||||
|
|
||||||
| implicit_class_handle '.' hierarchy_identifier
|
| class_hierarchy_identifier
|
||||||
{ pform_name_t*t_name = $1;
|
{ PEIdent*tmp = new PEIdent(*$1);
|
||||||
while (!$3->empty()) {
|
|
||||||
t_name->push_back($3->front());
|
|
||||||
$3->pop_front();
|
|
||||||
}
|
|
||||||
PEIdent*tmp = new PEIdent(*t_name);
|
|
||||||
FILE_NAME(tmp, @1);
|
FILE_NAME(tmp, @1);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
delete $1;
|
delete $1;
|
||||||
delete $3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
| '{' expression_list_proper '}'
|
| '{' expression_list_proper '}'
|
||||||
|
|
@ -6650,17 +6641,11 @@ statement_item /* This is roughly statement_item in the LRM */
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
| implicit_class_handle '.' hierarchy_identifier '(' expression_list_with_nuls ')' ';'
|
| class_hierarchy_identifier '(' expression_list_with_nuls ')' ';'
|
||||||
{ pform_name_t*t_name = $1;
|
{ PCallTask*tmp = new PCallTask(*$1, *$3);
|
||||||
while (! $3->empty()) {
|
|
||||||
t_name->push_back($3->front());
|
|
||||||
$3->pop_front();
|
|
||||||
}
|
|
||||||
PCallTask*tmp = new PCallTask(*t_name, *$5);
|
|
||||||
FILE_NAME(tmp, @1);
|
FILE_NAME(tmp, @1);
|
||||||
delete $1;
|
delete $1;
|
||||||
delete $3;
|
delete $3;
|
||||||
delete $5;
|
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue