public expression_node visit(SyntaxTree.expression expr) { expr.visit(syntax_tree_visitor); /*addressed_expression ad = ret_semantic as addressed_expression; * if (ad != null && ad.is_addressed) * { * if (convertion_data_and_alghoritms.check_for_constant(ad)) * ad.is_addressed = false; * }*/ //Надеюсь, это сильно не скажется на производительности, хотя в другом случае этот же код просто будет разбросан по всем метдам syntax_tree_visitor-а. base_function_call bfc = ret_semantic as base_function_call; if (bfc != null) { if (bfc.simple_function_node.compile_time_executor != null) { expression_node ex = bfc.simple_function_node.compile_time_executor(bfc.location, bfc.parameters.ToArray()); if (ex != null) { return(ex); } } } return(ret_semantic as expression_node); }
public void semantic_check_loop_stmt(SyntaxTree.expression ex) { var sem_ex = convert_strong(ex); var b = convertion_data_and_alghoritms.can_convert_type(sem_ex, SystemLibrary.SystemLibrary.integer_type); if (!b) { AddError(sem_ex.location, "INTEGER_VALUE_EXPECTED"); } }
void semantic_check_for_indices(SyntaxTree.expression expr) { // Надо проверить, что expr - это одноразмерный массив или список. Эта проверка была в visit(foreach) var semexpr = convert_strong(expr); var Is1DArr = Is1DArray(semexpr); var il = IsIList(semexpr); if (!Is1DArr && !il) { AddError(get_location(expr), "ONE_DIM_ARRAY_OR_LIST_EXPECTED"); } }
void semantic_check_for_indices(SyntaxTree.expression expr) { // Надо проверить, что expr - это одноразмерный массив или список. Эта проверка была в visit(foreach) var semexpr = convert_strong(expr); var Is1DArr = Is1DArray(semexpr); var il = IsIList(semexpr); // Тут может быть другая ситуация - Indices может быть членом semexpr - и тогда нельзя преобразовывать if (!Is1DArr && !il) { AddError(get_location(expr), "ONE_DIM_ARRAY_OR_LIST_EXPECTED"); } }
public void semantic_check_slice_assignment_types(SyntaxTree.expression expr1, SyntaxTree.expression expr2, method_call mc) { var slice = expr1 as slice_expr; var leftValue = convert_strong(slice.v); var leftType = leftValue.type; var rightValue = convert_strong(expr2); var rightType = rightValue.type; var v = slice.v; var from = mc.parameters.expressions[2] as expression; var to = mc.parameters.expressions[3] as expression; expression step = mc.parameters.expressions.Count > 4 ? mc.parameters.expressions[4] : null; var semvar = convert_strong(v); if (semvar is typed_expression) { semvar = convert_typed_expression_to_function_call(semvar as typed_expression); } var IsSlicedType = 0; // проверим, является ли semvar.type динамическим массивом, списком List или строкой if (semvar.type.type_special_kind == SemanticTree.type_special_kind.array_kind) { IsSlicedType = 1; } if (IsSlicedType == 0) { var t = ConvertSemanticTypeNodeToNETType(semvar.type); // не работает для array of T // semvar.type должен быть array of T, List<T> или string if (t == null) { IsSlicedType = 0; // можно ничего не присваивать :) } // else if (t.IsArray) // IsSlicedType = 1; else if (t == typeof(System.String)) { IsSlicedType = 2; } else if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(System.Collections.Generic.List <>)) { IsSlicedType = 3; } } if (IsSlicedType == 0) { AddError(get_location(v), "BAD_SLICE_OBJECT"); } var semfrom = convert_strong(from); var fromIsIndex = (semfrom is common_constructor_call fromCall) && fromCall.common_type.comprehensive_namespace.namespace_full_name.Equals("PABCSystem") && fromCall.common_type.PrintableName.Equals("SystemIndex"); var b = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.integer_type); if (!b && !fromIsIndex) { AddError(get_location(from), "INTEGER_VALUE_EXPECTED"); } var semto = convert_strong(to); var toIsIndex = (semto is common_constructor_call toCall) && toCall.common_type.comprehensive_namespace.namespace_full_name.Equals("PABCSystem") && toCall.common_type.PrintableName.Equals("SystemIndex"); b = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.integer_type); if (!b && !toIsIndex) { AddError(get_location(to), "INTEGER_VALUE_EXPECTED"); } if (step != null) { var semstep = convert_strong(step); b = convertion_data_and_alghoritms.can_convert_type(semstep, SystemLibrary.SystemLibrary.integer_type); if (!b) { AddError(get_location(step), "INTEGER_VALUE_EXPECTED"); } } if (!AreTheSameType(leftType, rightType)) { AddError(get_location(expr2), "EXPRESSION_OF_TYPE_{0}_CANNOT_BE_ASSIGNED_TO_SLICE_OF_TYPE_{1}", rightType.PrintableName, leftType.PrintableName); } }