From d185cd8de669db20eaba4eccb263ea4d6a0667d6 Mon Sep 17 00:00:00 2001 From: miks1965 Date: Sat, 30 Dec 2017 11:39:02 +0300 Subject: [PATCH] bug fix #613 --- Parsers/PascalABCParserNewSaushkin/ABCPascal.y | 10 +++++----- Parsers/PascalABCParserNewSaushkin/PABC.ymc | 1 + Parsers/PascalABCParserNewSaushkin/SemanticRules.cs | 7 ++++++- .../TreeConversion/convertion_data_and_alghoritms.cs | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y index e382f67c8..b4133ee18 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y @@ -1946,8 +1946,8 @@ typed_var_init_expression | identifier tkArrow lambda_function_body { var idList = new ident_list($1, @1); - var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null), parametr_kind.none, null, @1), @1); - $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null), $3 as statement_list, @$); + var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), parametr_kind.none, null, @1), @1); + $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), $3 as statement_list, @$); } | tkRoundOpen tkRoundClose lambda_type_ref tkArrow lambda_function_body { @@ -1968,7 +1968,7 @@ typed_var_init_expression idList.idents.Add(el.expressions[j] as ident); } - var any = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); + var any = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @2); var formalPars = new formal_parameters(new typed_parameters(idList, any, parametr_kind.none, null, @2), @2); $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, any, $5 as statement_list, @$); @@ -3643,8 +3643,8 @@ func_decl_lambda : identifier tkArrow lambda_function_body { var idList = new ident_list($1, @1); - var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null), parametr_kind.none, null, @1), @1); - $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null), $3 as statement_list, @$); + var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), parametr_kind.none, null, @1), @1); + $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), $3 as statement_list, @$); } | tkRoundOpen tkRoundClose lambda_type_ref_noproctype tkArrow lambda_function_body { diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc index a436394b4..9b6434b4e 100644 --- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc +++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc @@ -183,5 +183,6 @@ script= + diff --git a/Parsers/PascalABCParserNewSaushkin/SemanticRules.cs b/Parsers/PascalABCParserNewSaushkin/SemanticRules.cs index 72e7f313c..6a0708c0b 100644 --- a/Parsers/PascalABCParserNewSaushkin/SemanticRules.cs +++ b/Parsers/PascalABCParserNewSaushkin/SemanticRules.cs @@ -400,7 +400,12 @@ namespace GPPGParserScanner var op = new op_type_node(Operators.Assignment); //_op_type_node.source_context = parsertools.GetTokenSourceContext(); var ass = new assign(id, expr_l1, op.type); - parsertools.create_source_context(ass, id, expr_l1); + parsertools.create_source_context(ass, id, expr_l1); // дурацкая функция - если хотя бы у одного sc=null, то возвращает null + if (ass.source_context == null) + if (expr_l1.source_context != null) + ass.source_context = expr_l1.source_context; + else if (id.source_context != null) + ass.source_context = id.source_context; sl.subnodes.Add(ass); sl.source_context = loc; return sl; diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index 088d7b127..df2b1a965 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -1811,7 +1811,7 @@ namespace PascalABCCompiler.TreeConverter if (set_of_possible_functions.Count == 0 && indefinits.Count == 0) { - return AddError(new NoFunctionWithSameParametresNum(loc, is_alone_method_defined, first_function)); + return AddError(new NoFunctionWithSameArguments(loc, is_alone_method_defined)); } //(ssyy) Инициализируем is_alone_defined