From: Eric B. <er...@us...> - 2003-11-25 21:11:08
|
Update of /cvsroot/gobo-eiffel/gobo/library/tools/eiffel/parser In directory sc8-pr-cvs1:/tmp/cvs-serv24314/library/tools/eiffel/parser Modified Files: et_ast_factory.e et_decorated_ast_factory.e et_eiffel_parser.y et_eiffel_parser_skeleton.e Log Message: Implemented cat-and-dog mechanism when routines have an argument whose type contains a formal generic parameter. Index: et_ast_factory.e =================================================================== RCS file: /cvsroot/gobo-eiffel/gobo/library/tools/eiffel/parser/et_ast_factory.e,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -r1.24 -r1.25 *** et_ast_factory.e 21 Oct 2003 16:37:45 -0000 1.24 --- et_ast_factory.e 25 Nov 2003 21:11:03 -0000 1.25 *************** *** 1141,1144 **** --- 1141,1156 ---- end + new_actual_parameter (a_type: ET_TYPE): ET_ACTUAL_PARAMETER is + -- New actual parameter + do + Result := a_type + end + + new_actual_parameter_comma (a_parameter: ET_ACTUAL_PARAMETER; a_comma: ET_SYMBOL): ET_ACTUAL_PARAMETER_ITEM is + -- New actual_parameter-comma + do + Result := a_parameter + end + new_actual_parameters (a_left, a_right: ET_SYMBOL; nb: INTEGER): ET_ACTUAL_PARAMETER_LIST is -- New actual generic parameter list with given capacity *************** *** 1400,1403 **** --- 1412,1427 ---- end + new_constraint_actual_parameter (a_type: ET_CONSTRAINT_TYPE): ET_CONSTRAINT_ACTUAL_PARAMETER is + -- New actual parameter appearing in a generic constraint + do + Result := a_type + end + + new_constraint_actual_parameter_comma (a_parameter: ET_CONSTRAINT_ACTUAL_PARAMETER; a_comma: ET_SYMBOL): ET_CONSTRAINT_ACTUAL_PARAMETER_ITEM is + -- New constraint_actual_parameter-comma + do + Result := a_parameter + end + new_constraint_actual_parameters (a_left, a_right: ET_SYMBOL; nb: INTEGER): ET_CONSTRAINT_ACTUAL_PARAMETER_LIST is -- New constraint actual generic parameter list with given capacity *************** *** 1436,1445 **** create Result.make (a_type_mark, a_name) end - end - - new_constraint_type_comma (a_type: ET_CONSTRAINT_TYPE; a_comma: ET_SYMBOL): ET_CONSTRAINT_TYPE_ITEM is - -- New constraint_type-comma - do - Result := a_type end --- 1460,1463 ---- Index: et_decorated_ast_factory.e =================================================================== RCS file: /cvsroot/gobo-eiffel/gobo/library/tools/eiffel/parser/et_decorated_ast_factory.e,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -r1.9 -r1.10 *** et_decorated_ast_factory.e 21 Oct 2003 16:37:45 -0000 1.9 --- et_decorated_ast_factory.e 25 Nov 2003 21:11:03 -0000 1.10 *************** *** 131,134 **** --- 131,135 ---- new_verbatim_string, new_actual_arguments, + new_actual_parameter_comma, new_actual_parameters, new_agent_actual_argument_comma, *************** *** 154,160 **** new_constant_attribute, new_constrained_formal_parameter, new_constraint_actual_parameters, new_constraint_creator, - new_constraint_type_comma, new_convert_feature_comma, new_convert_features, --- 155,161 ---- new_constant_attribute, new_constrained_formal_parameter, + new_constraint_actual_parameter_comma, new_constraint_actual_parameters, new_constraint_creator, new_convert_feature_comma, new_convert_features, *************** *** 1279,1282 **** --- 1280,1293 ---- end + new_actual_parameter_comma (a_parameter: ET_ACTUAL_PARAMETER; a_comma: ET_SYMBOL): ET_ACTUAL_PARAMETER_ITEM is + -- New actual_parameter-comma + do + if a_comma = Void then + Result := a_parameter + elseif a_parameter /= Void then + create {ET_ACTUAL_PARAMETER_COMMA} Result.make (a_parameter, a_comma) + end + end + new_actual_parameters (a_left, a_right: ET_SYMBOL; nb: INTEGER): ET_ACTUAL_PARAMETER_LIST is -- New actual generic parameter list with given capacity *************** *** 1532,1535 **** --- 1543,1556 ---- end + new_constraint_actual_parameter_comma (a_parameter: ET_CONSTRAINT_ACTUAL_PARAMETER; a_comma: ET_SYMBOL): ET_CONSTRAINT_ACTUAL_PARAMETER_ITEM is + -- New constraint_actual_parameter-comma + do + if a_comma = Void then + Result := a_parameter + elseif a_parameter /= Void then + create {ET_CONSTRAINT_ACTUAL_PARAMETER_COMMA} Result.make (a_parameter, a_comma) + end + end + new_constraint_actual_parameters (a_left, a_right: ET_SYMBOL; nb: INTEGER): ET_CONSTRAINT_ACTUAL_PARAMETER_LIST is -- New constraint actual generic parameter list with given capacity *************** *** 1553,1566 **** if an_end /= Void then Result.set_end_keyword (an_end) - end - end - - new_constraint_type_comma (a_type: ET_CONSTRAINT_TYPE; a_comma: ET_SYMBOL): ET_CONSTRAINT_TYPE_ITEM is - -- New constraint_type-comma - do - if a_comma = Void then - Result := a_type - elseif a_type /= Void then - create {ET_CONSTRAINT_TYPE_COMMA} Result.make (a_type, a_comma) end end --- 1574,1577 ---- Index: et_eiffel_parser.y =================================================================== RCS file: /cvsroot/gobo-eiffel/gobo/library/tools/eiffel/parser/et_eiffel_parser.y,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -r1.33 -r1.34 *** et_eiffel_parser.y 21 Oct 2003 16:44:16 -0000 1.33 --- et_eiffel_parser.y 25 Nov 2003 21:11:04 -0000 1.34 *************** *** 90,94 **** %type <ET_ACTUAL_ARGUMENT_LIST> Actuals_opt Actuals_expression_list ! %type <ET_ACTUAL_PARAMETER_LIST> Actual_parameters_opt Type_list Actual_parameters %type <ET_AGENT_ACTUAL_ARGUMENT> Agent_actual %type <ET_AGENT_ACTUAL_ARGUMENT_ITEM> Agent_actual_comma --- 90,96 ---- %type <ET_ACTUAL_ARGUMENT_LIST> Actuals_opt Actuals_expression_list ! %type <ET_ACTUAL_PARAMETER> Actual_parameter ! %type <ET_ACTUAL_PARAMETER_ITEM> Actual_parameter_comma ! %type <ET_ACTUAL_PARAMETER_LIST> Actual_parameters_opt Actual_parameter_list Actual_parameters %type <ET_AGENT_ACTUAL_ARGUMENT> Agent_actual %type <ET_AGENT_ACTUAL_ARGUMENT_ITEM> Agent_actual_comma *************** *** 109,116 **** %type <ET_COMPOUND> Else_compound Rescue_compound From_compound Loop_compound %type <ET_CONSTANT> Manifest_constant ! %type <ET_CONSTRAINT_ACTUAL_PARAMETER_LIST> Constraint_actual_parameters_opt Constraint_type_list %type <ET_CONSTRAINT_CREATOR> Constraint_create Constraint_create_procedure_list %type <ET_CONSTRAINT_TYPE> Constraint_type - %type <ET_CONSTRAINT_TYPE_ITEM> Constraint_type_comma %type <ET_CONVERT_FEATURE> Convert_feature %type <ET_CONVERT_FEATURE_ITEM> Convert_feature_comma --- 111,119 ---- %type <ET_COMPOUND> Else_compound Rescue_compound From_compound Loop_compound %type <ET_CONSTANT> Manifest_constant ! %type <ET_CONSTRAINT_ACTUAL_PARAMETER> Constraint_actual_parameter ! %type <ET_CONSTRAINT_ACTUAL_PARAMETER_ITEM> Constraint_actual_parameter_comma ! %type <ET_CONSTRAINT_ACTUAL_PARAMETER_LIST> Constraint_actual_parameters_opt Constraint_actual_parameter_list %type <ET_CONSTRAINT_CREATOR> Constraint_create Constraint_create_procedure_list %type <ET_CONSTRAINT_TYPE> Constraint_type %type <ET_CONVERT_FEATURE> Convert_feature %type <ET_CONVERT_FEATURE_ITEM> Convert_feature_comma *************** *** 527,531 **** Formal_parameter: Identifier { ! $$ := ast_factory.new_formal_parameter ($1) if $$ /= Void then register_constraint (Void) --- 530,534 ---- Formal_parameter: Identifier { ! $$ := new_formal_parameter ($1) if $$ /= Void then register_constraint (Void) *************** *** 534,538 **** | Identifier E_ARROW Constraint_type { ! $$ := ast_factory.new_constrained_formal_parameter ($1, $2, dummy_constraint ($3), Void) if $$ /= Void then register_constraint ($3) --- 537,541 ---- | Identifier E_ARROW Constraint_type { ! $$ := new_constrained_formal_parameter ($1, $2, dummy_constraint ($3), Void) if $$ /= Void then register_constraint ($3) *************** *** 541,545 **** | Identifier E_ARROW Constraint_type Constraint_create { ! $$ := ast_factory.new_constrained_formal_parameter ($1, $2, dummy_constraint ($3), $4) if $$ /= Void then register_constraint ($3) --- 544,548 ---- | Identifier E_ARROW Constraint_type Constraint_create { ! $$ := new_constrained_formal_parameter ($1, $2, dummy_constraint ($3), $4) if $$ /= Void then register_constraint ($3) *************** *** 619,623 **** add_counter } ! Constraint_type_list { $$ := $3 --- 622,626 ---- add_counter } ! Constraint_actual_parameter_list { $$ := $3 *************** *** 627,631 **** ; ! Constraint_type_list: Constraint_type ']' { if $1 /= Void then --- 630,634 ---- ; ! Constraint_actual_parameter_list: Constraint_actual_parameter ']' { if $1 /= Void then *************** *** 638,642 **** end } ! | Constraint_type_comma Constraint_type_list { $$ := $2 --- 641,645 ---- end } ! | Constraint_actual_parameter_comma Constraint_actual_parameter_list { $$ := $2 *************** *** 647,653 **** ; ! Constraint_type_comma: Constraint_type ',' { ! $$ := ast_factory.new_constraint_type_comma ($1, $2) if $$ /= Void then increment_counter --- 650,660 ---- ; ! Constraint_actual_parameter: Constraint_type ! { $$ := new_constraint_actual_parameter ($1) } ! ; ! ! Constraint_actual_parameter_comma: Constraint_actual_parameter ',' { ! $$ := ast_factory.new_constraint_actual_parameter_comma ($1, $2) if $$ /= Void then increment_counter *************** *** 1389,1392 **** --- 1396,1408 ---- ; + Type_comma: Type ',' + { + $$ := ast_factory.new_type_comma ($1, $2) + if $$ /= Void then + increment_counter + end + } + ; + -------------------------------------------------------------------------------- *************** *** 1976,1980 **** add_counter } ! Type_list { $$ := $3 --- 1992,1996 ---- add_counter } ! Actual_parameter_list { $$ := $3 *************** *** 1984,1988 **** ; ! Type_list: Type ']' { if $1 /= Void then --- 2000,2004 ---- ; ! Actual_parameter_list: Actual_parameter ']' { if $1 /= Void then *************** *** 1995,1999 **** end } ! | Type_comma Type_list { $$ := $2 --- 2011,2015 ---- end } ! | Actual_parameter_comma Actual_parameter_list { $$ := $2 *************** *** 2004,2010 **** ; ! Type_comma: Type ',' { ! $$ := ast_factory.new_type_comma ($1, $2) if $$ /= Void then increment_counter --- 2020,2030 ---- ; ! Actual_parameter: Type ! { $$ := new_actual_parameter ($1) } ! ; ! ! Actual_parameter_comma: Actual_parameter ',' { ! $$ := ast_factory.new_actual_parameter_comma ($1, $2) if $$ /= Void then increment_counter Index: et_eiffel_parser_skeleton.e =================================================================== RCS file: /cvsroot/gobo-eiffel/gobo/library/tools/eiffel/parser/et_eiffel_parser_skeleton.e,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -r1.31 -r1.32 *** et_eiffel_parser_skeleton.e 21 Oct 2003 16:46:02 -0000 1.31 --- et_eiffel_parser_skeleton.e 25 Nov 2003 21:11:04 -0000 1.32 *************** *** 355,360 **** --- 355,546 ---- end + feature {ET_CONSTRAINT_ACTUAL_PARAMETER_ITEM, ET_CONSTRAINT_ACTUAL_PARAMETER_LIST} -- Generic constraints + + resolved_constraint_actual_parameter_comma (a_constraint: ET_CONSTRAINT_ACTUAL_PARAMETER_COMMA; + a_formals: ET_FORMAL_PARAMETER_LIST): ET_ACTUAL_PARAMETER_ITEM is + -- Version of `a_constraint', appearing in the constraint + -- of one of the formal generic parameters in `a_formals', where + -- class names and formal generic parameter names have been + -- resolved (i.e. replaced by the corresponding Class_type, + -- Tuple_type and Formal_parameter_type) + require + a_constraint_not_void: a_constraint /= Void + a_formals_not_void: a_formals /= Void + local + a_parameter: ET_ACTUAL_PARAMETER + do + a_parameter := a_constraint.actual_parameter.resolved_syntactical_constraint (a_formals, Current) + if a_parameter /= Void then + Result := ast_factory.new_actual_parameter_comma (a_parameter, a_constraint.comma) + end + end + + resolved_constraint_qualified_actual_parameter (a_constraint: ET_CONSTRAINT_QUALIFIED_ACTUAL_PARAMETER; + a_formals: ET_FORMAL_PARAMETER_LIST): ET_ACTUAL_PARAMETER is + -- Version of `a_constraint', appearing in the constraint + -- of one of the formal generic parameters in `a_formals', where + -- class names and formal generic parameter names have been + -- resolved (i.e. replaced by the corresponding Class_type, + -- Tuple_type and Formal_parameter_type) + require + a_constraint_not_void: a_constraint /= Void + a_formals_not_void: a_formals /= Void + local + a_type: ET_TYPE + a_qualified_parameter: ET_QUALIFIED_ACTUAL_PARAMETER + do + a_type := a_constraint.type.resolved_syntactical_constraint (a_formals, Current) + if a_type /= Void then + create a_qualified_parameter.make (a_type) + a_qualified_parameter.set_cat_keyword (a_constraint.cat_keyword) + Result := a_qualified_parameter + end + end + + resolved_constraint_named_type (a_constraint: ET_CONSTRAINT_NAMED_TYPE; + a_formals: ET_FORMAL_PARAMETER_LIST): ET_TYPE is + -- Version of `a_constraint', appearing in the constraint of + -- one of the formal generic parameters in `a_formals', where + -- class names and formal generic parameter names have been + -- resolved (i.e. replaced by the corresponding Class_type, + -- Tuple_type and Formal_parameter_type) + require + a_constraint_not_void: a_constraint /= Void + a_formals_not_void: a_formals /= Void + local + a_name: ET_IDENTIFIER + a_formal: ET_FORMAL_PARAMETER + a_type_mark: ET_KEYWORD + a_base_class: ET_CLASS + a_class_type: ET_CLASS_TYPE + do + a_name := a_constraint.name + a_type_mark := a_constraint.type_mark + a_formal := a_formals.formal_parameter_by_name (a_name) + if a_formal /= Void then + if a_type_mark /= Void then + -- A formal parameter cannot be prefixed by + -- 'expanded' or 'reference'. + report_syntax_error (a_type_mark.position) + end + Result := ast_factory.new_formal_parameter_type (a_name, a_formal.index) + else + a_base_class := universe.eiffel_class (a_name) + if a_base_class = universe.tuple_class then + if a_type_mark /= Void then + -- A TUPLE type is not a class type. It cannot + -- be prefixed by 'expanded' or 'reference'. + report_syntax_error (a_type_mark.position) + end + Result := ast_factory.new_tuple_type (a_name, Void) + else + a_base_class.set_in_system (True) + a_class_type := ast_factory.new_class_type (a_type_mark, a_name, a_base_class) + if universe.cat_enabled and a_class_type /= Void and then not a_class_type.is_expanded then + a_class_type.set_cat_keyword (tokens.cat_keyword) + end + Result := a_class_type + end + end + end + + resolved_constraint_generic_named_type (a_constraint: ET_CONSTRAINT_GENERIC_NAMED_TYPE; + a_formals: ET_FORMAL_PARAMETER_LIST): ET_TYPE is + -- Version `a_constraint', appearing in the constraint of + -- one of the formal generic parameters in `a_formals', where + -- class names and formal generic parameter names have been + -- resolved (i.e. replaced by the corresponding Class_type, + -- Tuple_type and Formal_parameter_type) + require + a_constraint_not_void: a_constraint /= Void + a_formals_not_void: a_formals /= Void + local + a_name: ET_IDENTIFIER + a_type_mark: ET_KEYWORD + a_formal: ET_FORMAL_PARAMETER + a_base_class: ET_CLASS + a_parameters: ET_ACTUAL_PARAMETER_LIST + a_class_type: ET_CLASS_TYPE + do + a_name := a_constraint.name + a_type_mark := a_constraint.type_mark + a_formal := a_formals.formal_parameter_by_name (a_name) + if a_formal /= Void then + if a_type_mark /= Void then + -- A formal parameter cannot be prefixed by + -- 'expanded' or 'reference'. + report_syntax_error (a_type_mark.position) + end + -- A formal parameter cannot have actual generic parameters. + report_syntax_error (a_constraint.actual_parameters.position) + Result := ast_factory.new_formal_parameter_type (a_name, a_formal.index) + else + a_base_class := universe.eiffel_class (a_name) + a_parameters := a_constraint.actual_parameters.resolved_syntactical_constraint (a_formals, Current) + if a_parameters /= Void then + if a_base_class = universe.tuple_class then + if a_type_mark /= Void then + -- A TUPLE type is not a class type. It cannot + -- be prefixed by 'expanded' or 'reference'. + report_syntax_error (a_type_mark.position) + end + Result := ast_factory.new_tuple_type (a_name, a_parameters) + else + a_base_class.set_in_system (True) + a_class_type := ast_factory.new_generic_class_type (a_type_mark, a_name, a_parameters, a_base_class) + if universe.cat_enabled and a_class_type /= Void and then not a_class_type.is_expanded then + a_class_type.set_cat_keyword (tokens.cat_keyword) + end + Result := a_class_type + end + end + end + end + + resolved_constraint_actual_parameter_list (a_constraint: ET_CONSTRAINT_ACTUAL_PARAMETER_LIST; + a_formals: ET_FORMAL_PARAMETER_LIST): ET_ACTUAL_PARAMETER_LIST is + -- Version of `a_constraint', appearing in the constraint of + -- one of the formal generic parameters in `a_formals', where + -- class names and formal generic parameter names have been + -- resolved (i.e. replaced by the corresponding Class_type, + -- Tuple_type and Formal_parameter_type) + require + a_constraint_not_void: a_constraint /= Void + a_formals_not_void: a_formals /= Void + local + i, nb: INTEGER + a_parameter: ET_ACTUAL_PARAMETER_ITEM + do + nb := a_constraint.count + Result := ast_factory.new_actual_parameters (a_constraint.left_bracket, a_constraint.right_bracket, nb) + if Result /= Void then + from i := nb until i < 1 loop + a_parameter := a_constraint.item (i).resolved_syntactical_constraint (a_formals, Current) + if a_parameter /= Void then + Result.put_first (a_parameter) + end + i := i - 1 + end + end + end + feature {NONE} -- AST factory + new_actual_parameter (a_type: ET_TYPE): ET_ACTUAL_PARAMETER is + -- New actual parameter + local + a_qualified_parameter: ET_QUALIFIED_ACTUAL_PARAMETER + do + if universe.cat_enabled then + if a_type /= Void then + create a_qualified_parameter.make (a_type) + a_qualified_parameter.set_cat_keyword (tokens.cat_keyword) + Result := a_qualified_parameter + end + else + Result := ast_factory.new_actual_parameter (a_type) + end + end + new_bit_n (a_bit: ET_IDENTIFIER; an_int: ET_INTEGER_CONSTANT): ET_BIT_N is -- New 'BIT N' type *************** *** 401,404 **** --- 587,618 ---- end + new_constraint_actual_parameter (a_type: ET_CONSTRAINT_TYPE): ET_CONSTRAINT_ACTUAL_PARAMETER is + -- New actual parameter appearing in a generic constraint + local + a_qualified_parameter: ET_CONSTRAINT_QUALIFIED_ACTUAL_PARAMETER + do + if universe.cat_enabled then + if a_type /= Void then + create a_qualified_parameter.make (a_type) + a_qualified_parameter.set_cat_keyword (tokens.cat_keyword) + Result := a_qualified_parameter + end + else + Result := ast_factory.new_constraint_actual_parameter (a_type) + end + end + + new_constrained_formal_parameter (a_name: ET_IDENTIFIER; an_arrow: ET_SYMBOL; a_constraint: ET_TYPE; + a_creation: ET_CONSTRAINT_CREATOR): ET_CONSTRAINED_FORMAL_PARAMETER is + -- New constrained formal generic parameter + do + Result := ast_factory.new_constrained_formal_parameter (a_name, an_arrow, a_constraint, a_creation) + if Result /= Void then + if universe.cat_enabled then + Result.set_cat_keyword (tokens.cat_keyword) + end + end + end + new_constraint_named_type (a_type_mark: ET_KEYWORD; a_name: ET_IDENTIFIER; a_parameters: ET_CONSTRAINT_ACTUAL_PARAMETER_LIST): ET_CONSTRAINT_NAMED_TYPE is *************** *** 410,413 **** --- 624,638 ---- else Result := ast_factory.new_constraint_named_type (a_type_mark, a_name) + end + end + + new_formal_parameter (a_name: ET_IDENTIFIER): ET_FORMAL_PARAMETER is + -- New formal generic parameter + do + Result := ast_factory.new_formal_parameter (a_name) + if Result /= Void then + if universe.cat_enabled then + Result.set_cat_keyword (tokens.cat_keyword) + end end end |