package fr.umlv.tatoo.plugin;

import java.util.Map;
import java.util.EnumMap;

import fr.umlv.ocelet.compiler.parser.ProductionEnum;

public class PluginUtils {
  private PluginUtils() {
    // helper class
  }
  
  /** Return a map that associates a production to its number of terminals.
   * @return a map that associates a production to its number of terminals.
   */
  public static Map<ProductionEnum,Integer> createNumberOfTerminalMap() {
    EnumMap<ProductionEnum,Integer> map=
      new EnumMap<ProductionEnum,Integer>(ProductionEnum.class);
    map.put(ProductionEnum.primitive_type_boolean, 1);   
    map.put(ProductionEnum.primitive_type_int, 1);   
    map.put(ProductionEnum.primitive_type_real, 1);   
    map.put(ProductionEnum.type_plus_0_element, 0);   
    map.put(ProductionEnum.type_plus_0_rec, 1);   
    map.put(ProductionEnum.relation_type, 3);   
    map.put(ProductionEnum.group_type, 3);   
    map.put(ProductionEnum.text_type, 1);   
    map.put(ProductionEnum.type_id, 1);   
    map.put(ProductionEnum.type_primitive, 0);   
    map.put(ProductionEnum.type_relation, 0);   
    map.put(ProductionEnum.type_group, 0);   
    map.put(ProductionEnum.type_text, 0);   
    map.put(ProductionEnum.script_member_star_1_empty, 0);   
    map.put(ProductionEnum.script_member_star_1_rec, 0);   
    map.put(ProductionEnum.start, 0);   
    map.put(ProductionEnum.script_member_const_def, 0);   
    map.put(ProductionEnum.script_valuetype_def, 0);   
    map.put(ProductionEnum.script_datafacer_def, 0);   
    map.put(ProductionEnum.script_member_entity_def, 0);   
    map.put(ProductionEnum.script_member_relation_def, 0);   
    map.put(ProductionEnum.script_member_scenario_def, 0);   
    map.put(ProductionEnum.script_member_uses_def, 0);   
    map.put(ProductionEnum.id_plus_2_element, 1);   
    map.put(ProductionEnum.id_plus_2_rec, 2);   
    map.put(ProductionEnum.uses_def, 2);   
    map.put(ProductionEnum.id_plus_3_element, 1);   
    map.put(ProductionEnum.id_plus_3_rec, 2);   
    map.put(ProductionEnum.datafacer_import_def, 2);   
    map.put(ProductionEnum.datafacer_member_star_4_empty, 0);   
    map.put(ProductionEnum.datafacer_member_star_4_rec, 0);   
    map.put(ProductionEnum.datafacer_member_def, 4);   
    map.put(ProductionEnum.datafacer_member_service_def, 0);   
    map.put(ProductionEnum.datafacer_member_error, 1);   
    map.put(ProductionEnum.valuetype_member_star_5_empty, 0);   
    map.put(ProductionEnum.valuetype_member_star_5_rec, 0);   
    map.put(ProductionEnum.valuetype_def, 4);   
    map.put(ProductionEnum.valuetype_member_property_def, 0);   
    map.put(ProductionEnum.valuetype_member_error, 1);   
    map.put(ProductionEnum.entity_member_star_6_empty, 0);   
    map.put(ProductionEnum.entity_member_star_6_rec, 0);   
    map.put(ProductionEnum.entity_def, 4);   
    map.put(ProductionEnum.entity_member_property_def, 0);   
    map.put(ProductionEnum.entity_member_service_def, 0);   
    map.put(ProductionEnum.entity_member_error, 1);   
    map.put(ProductionEnum.property_init_optional_7_empty, 0);   
    map.put(ProductionEnum.property_init_optional_7_property_init, 0);   
    map.put(ProductionEnum.property_def_type, 3);   
    map.put(ProductionEnum.id_plus_8_element, 1);   
    map.put(ProductionEnum.id_plus_8_rec, 2);   
    map.put(ProductionEnum.property_def_enum, 8);   
    map.put(ProductionEnum.property_init, 1);   
    map.put(ProductionEnum.id_plus_9_element, 1);   
    map.put(ProductionEnum.id_plus_9_rec, 2);   
    map.put(ProductionEnum.relation_member_star_10_empty, 0);   
    map.put(ProductionEnum.relation_member_star_10_rec, 0);   
    map.put(ProductionEnum.relation_def, 6);   
    map.put(ProductionEnum.relation_member_service_def, 0);   
    map.put(ProductionEnum.relation_member_error, 1);   
    map.put(ProductionEnum.service_def_void, 4);   
    map.put(ProductionEnum.service_def_returntype, 4);   
    map.put(ProductionEnum.abstract_or_block_block, 0);   
    map.put(ProductionEnum.abstract_or_block_semicolon, 1);   
    map.put(ProductionEnum.parameter_def_star_11_element, 0);   
    map.put(ProductionEnum.parameter_def_star_11_rec, 1);   
    map.put(ProductionEnum.parameter_def_star_11_empty, 0);   
    map.put(ProductionEnum.parameter_def_star_11_through, 0);   
    map.put(ProductionEnum.parameters, 0);   
    map.put(ProductionEnum.parameter_def, 1);   
    map.put(ProductionEnum.scenario_def, 2);   
    map.put(ProductionEnum.const_def, 4);   
    map.put(ProductionEnum.instr_star_12_empty, 0);   
    map.put(ProductionEnum.instr_star_12_rec, 0);   
    map.put(ProductionEnum.block, 2);   
    map.put(ProductionEnum.instr_declaration, 1);   
    map.put(ProductionEnum.instr_assignation, 1);   
    map.put(ProductionEnum.instr_funcall, 1);   
    map.put(ProductionEnum.instr_print, 2);   
    map.put(ProductionEnum.instr_conditional, 0);   
    map.put(ProductionEnum.loop_label_optional_13_empty, 0);   
    map.put(ProductionEnum.loop_label_optional_13_loop_label, 0);   
    map.put(ProductionEnum.instr_loop, 0);   
    map.put(ProductionEnum.id_optional_14_empty, 0);   
    map.put(ProductionEnum.id_optional_14_id, 1);   
    map.put(ProductionEnum.instr_break, 2);   
    map.put(ProductionEnum.id_optional_15_empty, 0);   
    map.put(ProductionEnum.id_optional_15_id, 1);   
    map.put(ProductionEnum.instr_continue, 2);   
    map.put(ProductionEnum.expr_optional_16_empty, 0);   
    map.put(ProductionEnum.expr_optional_16_expr, 0);   
    map.put(ProductionEnum.instr_return, 2);   
    map.put(ProductionEnum.instr_block, 0);   
    map.put(ProductionEnum.instr_error, 2);   
    map.put(ProductionEnum.declaration_id, 1);   
    map.put(ProductionEnum.declaration_id_init, 2);   
    map.put(ProductionEnum.declaration_global, 3);   
    map.put(ProductionEnum.funcall_id, 3);   
    map.put(ProductionEnum.funcall_select, 5);   
    map.put(ProductionEnum.funcall_primary, 4);   
    map.put(ProductionEnum.funcall_error_id, 4);   
    map.put(ProductionEnum.funcall_error_select, 6);   
    map.put(ProductionEnum.funcall_error_primary, 5);   
    map.put(ProductionEnum.argument_star_17_element, 0);   
    map.put(ProductionEnum.argument_star_17_rec, 1);   
    map.put(ProductionEnum.argument_star_17_empty, 0);   
    map.put(ProductionEnum.argument_star_17_through, 0);   
    map.put(ProductionEnum.arguments, 0);   
    map.put(ProductionEnum.argument_expr, 0);   
    map.put(ProductionEnum.argument_none, 1);   
    map.put(ProductionEnum.conditional_if, 3);   
    map.put(ProductionEnum.conditional_if_else, 4);   
    map.put(ProductionEnum.conditional_error_if, 4);   
    map.put(ProductionEnum.conditional_error_if_else, 5);   
    map.put(ProductionEnum.loop_while, 3);   
    map.put(ProductionEnum.loop_dowhile, 4);   
    map.put(ProductionEnum.for_loop_init_optional_18_empty, 0);   
    map.put(ProductionEnum.for_loop_init_optional_18_for_loop_init, 0);   
    map.put(ProductionEnum.expr_optional_19_empty, 0);   
    map.put(ProductionEnum.expr_optional_19_expr, 0);   
    map.put(ProductionEnum.for_loop_incr_optional_20_empty, 0);   
    map.put(ProductionEnum.for_loop_incr_optional_20_for_loop_incr, 0);   
    map.put(ProductionEnum.loop_for, 5);   
    map.put(ProductionEnum.loop_foreach, 5);   
    map.put(ProductionEnum.loop_error_while, 4);   
    map.put(ProductionEnum.loop_error_dowhile, 5);   
    map.put(ProductionEnum.loop_error_for, 4);   
    map.put(ProductionEnum.for_loop_init_declaration, 0);   
    map.put(ProductionEnum.for_loop_init_assignation, 0);   
    map.put(ProductionEnum.for_loop_init_funcall, 0);   
    map.put(ProductionEnum.for_loop_incr_assignation, 0);   
    map.put(ProductionEnum.for_loop_incr_funcall, 0);   
    map.put(ProductionEnum.loop_label, 2);   
    map.put(ProductionEnum.assignation, 1);   
    map.put(ProductionEnum.lhs_id, 1);   
    map.put(ProductionEnum.lhs_field_access, 0);   
    map.put(ProductionEnum.primary_field_access, 0);   
    map.put(ProductionEnum.primary_this, 1);   
    map.put(ProductionEnum.primary_parens, 2);   
    map.put(ProductionEnum.alloc_init_star_21_empty, 0);   
    map.put(ProductionEnum.alloc_init_star_21_rec, 0);   
    map.put(ProductionEnum.primary_allocation, 3);   
    map.put(ProductionEnum.primary_group, 0);   
    map.put(ProductionEnum.primary_relation, 0);   
    map.put(ProductionEnum.primary_funcall, 0);   
    map.put(ProductionEnum.primary_error_parens, 3);   
    map.put(ProductionEnum.primary_error_allocation, 4);   
    map.put(ProductionEnum.primary_error_group, 4);   
    map.put(ProductionEnum.primary_error_relation, 4);   
    map.put(ProductionEnum.alloc_init, 3);   
    map.put(ProductionEnum.field_access_id, 3);   
    map.put(ProductionEnum.field_access_primary, 2);   
    map.put(ProductionEnum.expr_boolean_literal, 1);   
    map.put(ProductionEnum.expr_value_literal, 1);   
    map.put(ProductionEnum.expr_id, 1);   
    map.put(ProductionEnum.expr_primary, 0);   
    map.put(ProductionEnum.expr_range, 1);   
    map.put(ProductionEnum.expr_text_value, 1);   
    map.put(ProductionEnum.expr_unary_not, 1);   
    map.put(ProductionEnum.expr_unary_plus, 1);   
    map.put(ProductionEnum.expr_unary_minus, 1);   
    map.put(ProductionEnum.expr_eq, 1);   
    map.put(ProductionEnum.expr_ne, 1);   
    map.put(ProductionEnum.expr_lt, 1);   
    map.put(ProductionEnum.expr_le, 1);   
    map.put(ProductionEnum.expr_gt, 1);   
    map.put(ProductionEnum.expr_ge, 1);   
    map.put(ProductionEnum.expr_band, 1);   
    map.put(ProductionEnum.expr_bor, 1);   
    map.put(ProductionEnum.expr_plus, 1);   
    map.put(ProductionEnum.expr_minus, 1);   
    map.put(ProductionEnum.expr_star, 1);   
    map.put(ProductionEnum.expr_slash, 1);   
    map.put(ProductionEnum.expr_mod, 1);   
    return map;
  }
}