From 4efb0de050d1a8e88e39b7315467bea25ee3f210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Tue, 18 Sep 2018 20:45:24 +0200 Subject: [PATCH] fix #1127 fix #1210 --- TreeConverter/OpenMP/OpenMP.cs | 174 ++++++++++--------- TreeConverter/TreeConversion/LambdaHelper.cs | 2 +- TreeConverter/TreeRealization/location.cs | 7 + 3 files changed, 98 insertions(+), 85 deletions(-) diff --git a/TreeConverter/OpenMP/OpenMP.cs b/TreeConverter/OpenMP/OpenMP.cs index 250377acf..39f8b4ec2 100644 --- a/TreeConverter/OpenMP/OpenMP.cs +++ b/TreeConverter/OpenMP/OpenMP.cs @@ -1231,107 +1231,113 @@ namespace PascalABCCompiler.TreeConverter else if (sem_type.type_special_kind == SemanticTree.type_special_kind.none_kind || sem_type.type_special_kind == SemanticTree.type_special_kind.record || sem_type.type_special_kind == SemanticTree.type_special_kind.text_file) + { + if (sem_type.is_generic_type_instance)// это шаблонный тип { - if (sem_type.is_generic_type_instance)// это шаблонный тип - { - SyntaxTree.template_type_reference ttr = new PascalABCCompiler.SyntaxTree.template_type_reference(); - SyntaxTree.named_type_reference ntr = new PascalABCCompiler.SyntaxTree.named_type_reference(); - ttr.name = ntr; - ntr.names.AddRange(get_idents_from_generic_type(sem_type)); - SyntaxTree.template_param_list tpl = new PascalABCCompiler.SyntaxTree.template_param_list(); - ttr.params_list = tpl; - foreach (type_node tn in sem_type.instance_params) - tpl.params_list.Add(ConvertToSyntaxType(tn)); + SyntaxTree.template_type_reference ttr = new PascalABCCompiler.SyntaxTree.template_type_reference(); + SyntaxTree.named_type_reference ntr = new PascalABCCompiler.SyntaxTree.named_type_reference(); + ttr.name = ntr; + ntr.names.AddRange(get_idents_from_generic_type(sem_type)); + SyntaxTree.template_param_list tpl = new PascalABCCompiler.SyntaxTree.template_param_list(); + ttr.params_list = tpl; + foreach (type_node tn in sem_type.instance_params) + tpl.params_list.Add(ConvertToSyntaxType(tn)); - return ttr; - } - else if (sem_type.IsEnum) - return new PascalABCCompiler.SyntaxTree.named_type_reference(get_idents_from_dot_string(sem_type.name)); - else - return new PascalABCCompiler.SyntaxTree.named_type_reference(get_idents_from_dot_string(sem_type.PrintableName)); + return ttr; } - else if (sem_type.type_special_kind == SemanticTree.type_special_kind.array_kind || sem_type.type_special_kind == SemanticTree.type_special_kind.array_wrapper) + else if (sem_type.IsEnum) + return new PascalABCCompiler.SyntaxTree.named_type_reference(get_idents_from_dot_string(sem_type.name)); + else + return new PascalABCCompiler.SyntaxTree.named_type_reference(get_idents_from_dot_string(sem_type.PrintableName), + new SyntaxTree.SourceContext(sem_type.location.begin_line_num, sem_type.location.begin_column_num, sem_type.location.end_line_num, sem_type.location.end_column_num, sem_type.location.document.file_name)); + } + else if (sem_type.type_special_kind == SemanticTree.type_special_kind.array_kind || sem_type.type_special_kind == SemanticTree.type_special_kind.array_wrapper) + { + //значит тип-это массив + SyntaxTree.array_type arr_t = new PascalABCCompiler.SyntaxTree.array_type(); + arr_t.source_context = sem_type.location; + // Cоздаем индексер для массива + SyntaxTree.indexers_types indt = new PascalABCCompiler.SyntaxTree.indexers_types(); + indt.source_context = arr_t.source_context; + if (sem_type is common_type_node) { - //значит тип-это массив - SyntaxTree.array_type arr_t = new PascalABCCompiler.SyntaxTree.array_type(); - arr_t.source_context = new PascalABCCompiler.SyntaxTree.SourceContext(0xFFFFFF, 0, 0xFFFFFF, 0); - // Cоздаем индексер для массива - SyntaxTree.indexers_types indt = new PascalABCCompiler.SyntaxTree.indexers_types(); - if (sem_type is common_type_node) + SyntaxTree.diapason diap = new PascalABCCompiler.SyntaxTree.diapason(); + + common_type_node ctn = sem_type as common_type_node; + if (ctn.constants.Length > 1) { - SyntaxTree.diapason diap = new PascalABCCompiler.SyntaxTree.diapason(); - common_type_node ctn = sem_type as common_type_node; - if (ctn.constants.Length > 1) - { - diap.left = ConvertConstant(ctn.constants[0].constant_value); - diap.right = ConvertConstant(ctn.constants[1].constant_value); - indt.indexers.Add(diap); - } + diap.left = ConvertConstant(ctn.constants[0].constant_value); + diap.right = ConvertConstant(ctn.constants[1].constant_value); + indt.indexers.Add(diap); + } + else + { + if (ctn.rank == 1) + indt = null; else - { for (int i = 0; i < ctn.rank; i++) indt.indexers.Add(null); - } + } + arr_t.indexers = indt; + } + else if (sem_type is compiled_type_node) + { + compiled_type_node ctn = sem_type as compiled_type_node; + if (ctn.rank > 1) + { + for (int i = 0; i < ctn.rank; i++) + indt.indexers.Add(null); arr_t.indexers = indt; } - else if (sem_type is compiled_type_node) - { - compiled_type_node ctn = sem_type as compiled_type_node; - if (ctn.rank > 1) - { - for (int i = 0; i < ctn.rank; i++) - indt.indexers.Add(null); - arr_t.indexers = indt; - } - //Получаем индексеры из строки - //string ind_str = sem_type.PrintableName; - //ind_str = get_indexer_string(ind_str); + //Получаем индексеры из строки + //string ind_str = sem_type.PrintableName; + //ind_str = get_indexer_string(ind_str); - //if (ind_str.Length != 0) - //{ - // indt.indexers.AddRange(get_diapasons(ind_str).ToArray()); - // arr_t.indexers = indt; - //} - } - //проверяем тип элементов массива - if (sem_type.element_type != null) - { - arr_t.elements_type = ConvertToSyntaxType(sem_type.element_type); - } - return arr_t; + //if (ind_str.Length != 0) + //{ + // indt.indexers.AddRange(get_diapasons(ind_str).ToArray()); + // arr_t.indexers = indt; + //} } - else if (sem_type.type_special_kind == SemanticTree.type_special_kind.typed_file || sem_type.type_special_kind == SemanticTree.type_special_kind.binary_file) + //проверяем тип элементов массива + if (sem_type.element_type != null) { - SyntaxTree.file_type ft = new PascalABCCompiler.SyntaxTree.file_type(); - if (sem_type.element_type != null) - ft.file_of_type = ConvertToSyntaxType(sem_type.element_type); - //SyntaxTree.named_type_reference ntr = null; - //if (sem_type.element_type!= null) - // ntr= new PascalABCCompiler.SyntaxTree.named_type_reference(get_idents_from_dot_string(sem_type.element_type.name)); - //ft.file_of_type = ntr; - return ft; + arr_t.elements_type = ConvertToSyntaxType(sem_type.element_type); } - else if (sem_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.short_string) - { - SyntaxTree.string_num_definition snd = new PascalABCCompiler.SyntaxTree.string_num_definition(); - snd.name = new SyntaxTree.ident(sem_type.name.Substring(0, sem_type.name.IndexOf('['))); - snd.num_of_symbols = new SyntaxTree.int32_const(Int32.Parse(get_indexer_string(sem_type.PrintableName))); - return snd; - } - else if (sem_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.set_type) - { - SyntaxTree.set_type_definition std = new PascalABCCompiler.SyntaxTree.set_type_definition(); - if (sem_type.element_type != null) - std.of_type = ConvertToSyntaxType(sem_type.element_type); - return std; - } - else if (sem_type.type_special_kind == SemanticTree.type_special_kind.diap_type) - { - return get_diapason(sem_type); + return arr_t; + } + else if (sem_type.type_special_kind == SemanticTree.type_special_kind.typed_file || sem_type.type_special_kind == SemanticTree.type_special_kind.binary_file) + { + SyntaxTree.file_type ft = new PascalABCCompiler.SyntaxTree.file_type(); + if (sem_type.element_type != null) + ft.file_of_type = ConvertToSyntaxType(sem_type.element_type); + //SyntaxTree.named_type_reference ntr = null; + //if (sem_type.element_type!= null) + // ntr= new PascalABCCompiler.SyntaxTree.named_type_reference(get_idents_from_dot_string(sem_type.element_type.name)); + //ft.file_of_type = ntr; + return ft; + } + else if (sem_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.short_string) + { + SyntaxTree.string_num_definition snd = new PascalABCCompiler.SyntaxTree.string_num_definition(); + snd.name = new SyntaxTree.ident(sem_type.name.Substring(0, sem_type.name.IndexOf('['))); + snd.num_of_symbols = new SyntaxTree.int32_const(Int32.Parse(get_indexer_string(sem_type.PrintableName))); + return snd; + } + else if (sem_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.set_type) + { + SyntaxTree.set_type_definition std = new PascalABCCompiler.SyntaxTree.set_type_definition(); + if (sem_type.element_type != null) + std.of_type = ConvertToSyntaxType(sem_type.element_type); + return std; + } + else if (sem_type.type_special_kind == SemanticTree.type_special_kind.diap_type) + { + return get_diapason(sem_type); - } + } return null; } diff --git a/TreeConverter/TreeConversion/LambdaHelper.cs b/TreeConverter/TreeConversion/LambdaHelper.cs index 10b79fe4f..399129e97 100644 --- a/TreeConverter/TreeConversion/LambdaHelper.cs +++ b/TreeConverter/TreeConversion/LambdaHelper.cs @@ -363,7 +363,7 @@ namespace PascalABCCompiler.TreeConverter { procedure_definition procDef = null; if (functionLambdaDef.return_type == null) - procDef = SyntaxTreeNodesConstructor.CreateProcedureDefinitionNode(new method_name(null,null, new ident(functionLambdaDef.lambda_name), null), + procDef = SyntaxTreeNodesConstructor.CreateProcedureDefinitionNode(new method_name(null,null, new ident(functionLambdaDef.lambda_name, functionLambdaDef.source_context), null), functionLambdaDef.formal_parameters, false, false, diff --git a/TreeConverter/TreeRealization/location.cs b/TreeConverter/TreeRealization/location.cs index e101cda42..6c58e2357 100644 --- a/TreeConverter/TreeRealization/location.cs +++ b/TreeConverter/TreeRealization/location.cs @@ -138,6 +138,13 @@ namespace PascalABCCompiler.TreeRealization } } + public static implicit operator SyntaxTree.SourceContext(location loc) + { + if (loc == null) + return null; + return new SyntaxTree.SourceContext(loc.begin_line_num, loc.begin_column_num, loc.end_line_num, loc.end_column_num, loc.document != null ? loc.document.file_name : null); + } + public override string ToString() { string res="File: "+doc.ToString();