public override constant_node get_constant_copy(location loc) { array_const ac = new array_const(this._element_values, loc); ac.type = this.type; return(ac); }
public override void visit(SyntaxTree.array_const _array_const) { if (_array_const.elements != null) { List<constant_node> elements = new List<constant_node>(); List<expression_node> exprs = new List<expression_node>(); foreach (SyntaxTree.expression expr in _array_const.elements.expressions) { if (is_typed_const_def) elements.Add(convert_strong_to_constant_node(expr)); else exprs.Add(convert_strong(expr)); } if (is_typed_const_def) { array_const arrc = new array_const(elements, get_location(_array_const)); arrc.SetType(new ArrayConstType(elements[0].type, elements.Count, arrc.location)); return_value(arrc); } else { array_initializer arrc = new array_initializer(exprs, get_location(_array_const)); arrc.type = new ArrayConstType(exprs[0].type, exprs.Count, arrc.location); return_value(arrc); } } else { //это пустой инициализатор записи record_constant rc = new record_constant(new List<PascalABCCompiler.SyntaxTree.record_const_definition>(), get_location(_array_const)); rc.SetType(new RecordConstType(get_location(_array_const))); return_value(rc); } }
private array_const ConvertArrayConst(type_node tn, array_const constant) { type_node element_type = null; if (IsBoundedArray(tn)) { bounded_array_interface bai = tn.get_internal_interface(internal_interface_kind.bounded_array_interface) as bounded_array_interface; element_type = bai.element_type; ordinal_type_interface oti_indexer = bai.ordinal_type_interface; int arr_length = oti_indexer.ordinal_type_to_int(oti_indexer.upper_value) - oti_indexer.ordinal_type_to_int(oti_indexer.lower_value) + 1; if (arr_length != constant.element_values.Count) AddError(constant.location, "ARRAY_CONST_{0}_ELEMENTS_EXPECTED", arr_length); } else if (IsUnsizedArray(tn)) { array_internal_interface aii = tn.get_internal_interface(internal_interface_kind.unsized_array_interface) as array_internal_interface; element_type = aii.element_type; if (aii.rank > 1) { array_const cnst = ConvertNDimArrayConst(tn,1,element_type,constant); cnst.SetType(tn); return cnst; } } else throw new CompilerInternalError("Unexpected array type"); for (int i = 0; i < constant.element_values.Count; i++) constant.element_values[i] = convert_strong_to_constant_node(constant.element_values[i], element_type); constant.SetType(tn); return constant; }
private array_const ConvertNDimArrayConst(type_node tn, int cur_rank, type_node element_type, array_const constant) { array_internal_interface aii = tn.get_internal_interface(internal_interface_kind.unsized_array_interface) as array_internal_interface; int rank = aii.rank; for (int i=0; i<constant.element_values.Count; i++) { expression_node e = constant.element_values[i]; if (e is array_const) { if (cur_rank>=rank) constant.element_values[i] = ConvertArrayConst(tn.element_type,e as array_const); //AddError(new CanNotConvertTypes(e,e.type,tn.element_type,e.location)); else constant.element_values[i] = ConvertNDimArrayConst(tn,cur_rank+1,element_type,e as array_const); } else if (e is record_constant) { if (element_type is common_type_node) constant.element_values[i] = ConvertRecordConst(element_type as common_type_node, e as record_constant); else AddError(new NotSupportedError(constant.element_values[i].location)); } else { if (cur_rank != rank) AddError(constant.location, "RANK_MISMATCH_IN_INITILIALIZER"); constant.element_values[i] = convert_strong_to_constant_node(constant.element_values[i], element_type); } } constant.SetType(tn); return constant; }