From 5b19c6a60a2a0ccaaa9d05eb88c370f7ce1f6a10 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: Mon, 14 Dec 2015 21:42:08 +0100 Subject: [PATCH] bug fix issue #16 --- TestSuite/CompilationSamples/PT4.pas | 240 +++++++++++++++++- TestSuite/callnoparams.pas | 4 + .../TreeConversion/syntax_tree_visitor.cs | 16 +- TreeConverter/TreeRealization/types.cs | 30 +++ 4 files changed, 274 insertions(+), 16 deletions(-) diff --git a/TestSuite/CompilationSamples/PT4.pas b/TestSuite/CompilationSamples/PT4.pas index 81df2655e..5225e983b 100644 --- a/TestSuite/CompilationSamples/PT4.pas +++ b/TestSuite/CompilationSamples/PT4.pas @@ -318,27 +318,27 @@ function ReadArrString(n: integer): array of string; /// Вводит n целых чисел /// и возвращает введенные числа в виде последовательности -function ReadSeqInteger(n: integer): System.Collections.Generic.IEnumerable; +function ReadSeqInteger(n: integer): sequence of integer; /// Вводит n вещественных чисел /// и возвращает введенные числа в виде последовательности -function ReadSeqReal(n: integer): System.Collections.Generic.IEnumerable; +function ReadSeqReal(n: integer): sequence of real; /// Вводит n строк /// и возвращает введенные строки в виде последовательности -function ReadSeqString(n: integer): System.Collections.Generic.IEnumerable; +function ReadSeqString(n: integer): sequence of string; /// Вводит размер набора целых чисел и его элементы /// и возвращает введенный набор в виде последовательности -function ReadSeqInteger(): System.Collections.Generic.IEnumerable; +function ReadSeqInteger(): sequence of integer; /// Вводит размер набора вещественных чисел и его элементы /// и возвращает введенный набор в виде последовательности -function ReadSeqReal(): System.Collections.Generic.IEnumerable; +function ReadSeqReal(): sequence of real; /// Вводит размер набора строк и его элементы /// и возвращает введенный набор в виде последовательности -function ReadSeqString(): System.Collections.Generic.IEnumerable; +function ReadSeqString(): sequence of string; /// Вводит размер набора целых чисел и его элементы /// и возвращает введенный набор в виде массива @@ -370,6 +370,48 @@ function ReadMatrString(m,n: integer): array [,] of string; /// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам function ReadMatrString(): array [,] of string; +procedure ReadMatr(var m, n: integer; var a: array [,] of integer); + +procedure ReadMatr(var m, n: integer; var a: array [,] of real); + +procedure ReadMatr(var m, n: integer; var a: array [,] of string); + +procedure ReadMatr(var m: integer; var a: array [,] of integer); + +procedure ReadMatr(var m: integer; var a: array [,] of real); + +procedure ReadMatr(var m: integer; var a: array [,] of string); + +procedure ReadMatr(var m, n: integer; var a: array of array of integer); + +procedure ReadMatr(var m, n: integer; var a: array of array of real); + +procedure ReadMatr(var m, n: integer; var a: array of array of string); + +procedure ReadMatr(var m: integer; var a: array of array of integer); + +procedure ReadMatr(var m: integer; var a: array of array of real); + +procedure ReadMatr(var m: integer; var a: array of array of string); + +procedure ReadMatr(var m, n: integer; var a: List>); + +procedure ReadMatr(var m, n: integer; var a: List>); + +procedure ReadMatr(var m, n: integer; var a: List>); + +procedure ReadMatr(var m: integer; var a: List>); + +procedure ReadMatr(var m: integer; var a: List>); + +procedure ReadMatr(var m: integer; var a: List>); + +procedure WriteMatr(a: array[,] of T); + +procedure WriteMatr(a: array of array of T); + +procedure WriteMatr(a: List>); + // == Конец дополнений к версии 4.14 == implementation @@ -1400,32 +1442,32 @@ end; // == Версия 4.14. Дополнения == -function ReadSeqInteger(): System.Collections.Generic.IEnumerable; +function ReadSeqInteger(): sequence of integer; begin result := Range(1, GetInteger()).Select(e -> GetInteger()).ToArray(); end; -function ReadSeqReal(): System.Collections.Generic.IEnumerable; +function ReadSeqReal(): sequence of real; begin result := Range(1, GetInteger()).Select(e -> GetReal()).ToArray(); end; -function ReadSeqString(): System.Collections.Generic.IEnumerable; +function ReadSeqString(): sequence of string; begin result := Range(1, GetInteger()).Select(e -> GetString()).ToArray(); end; -function ReadSeqInteger(n: integer): System.Collections.Generic.IEnumerable; +function ReadSeqInteger(n: integer): sequence of integer; begin result := Range(1, n).Select(e -> GetInteger()).ToArray(); end; -function ReadSeqReal(n: integer): System.Collections.Generic.IEnumerable; +function ReadSeqReal(n: integer): sequence of real; begin result := Range(1, n).Select(e -> GetReal()).ToArray(); end; -function ReadSeqString(n: integer): System.Collections.Generic.IEnumerable; +function ReadSeqString(n: integer): sequence of string; begin result := Range(1, n).Select(e -> GetString()).ToArray(); end; @@ -1499,9 +1541,179 @@ begin result := ReadMatrString(ReadInteger,ReadInteger); end; +procedure ReadMatr(var m, n: integer; var a: array [,] of integer); +begin + read(m); read(n); + a := new integer[m, n]; + for var i := 0 to m - 1 do + for var j := 0 to n - 1 do + read(a[i,j]); +end; + +procedure ReadMatr(var m, n: integer; var a: array [,] of real); +begin + read(m); read(n); + a := new real[m, n]; + for var i := 0 to m - 1 do + for var j := 0 to n - 1 do + read(a[i,j]); +end; + +procedure ReadMatr(var m, n: integer; var a: array [,] of string); +begin + read(m); read(n); + a := new string[m, n]; + for var i := 0 to m - 1 do + for var j := 0 to n - 1 do + read(a[i,j]); +end; + +procedure ReadMatr(var m: integer; var a: array [,] of integer); +begin + read(m); + a := new integer[m, m]; + for var i := 0 to m - 1 do + for var j := 0 to m - 1 do + read(a[i,j]); +end; + +procedure ReadMatr(var m: integer; var a: array [,] of real); +begin + read(m); + a := new real[m, m]; + for var i := 0 to m - 1 do + for var j := 0 to m - 1 do + read(a[i,j]); +end; + +procedure ReadMatr(var m: integer; var a: array [,] of string); +begin + read(m); + a := new string[m, m]; + for var i := 0 to m - 1 do + for var j := 0 to m - 1 do + read(a[i,j]); +end; + +procedure ReadMatr(var m, n: integer; var a: array of array of integer); +begin + read(m); read(n); + SetLength(a, m); + for var i := 0 to m - 1 do + a[i] := ReadArrInteger(n); +end; + +procedure ReadMatr(var m, n: integer; var a: array of array of real); +begin + read(m); read(n); + SetLength(a, m); + for var i := 0 to m - 1 do + a[i] := ReadArrReal(n); +end; + +procedure ReadMatr(var m, n: integer; var a: array of array of string); +begin + read(m); read(n); + SetLength(a, m); + for var i := 0 to m - 1 do + a[i] := ReadArrString(n); +end; + +procedure ReadMatr(var m: integer; var a: array of array of integer); +begin + read(m); + SetLength(a, m); + for var i := 0 to m - 1 do + a[i] := ReadArrInteger(m); +end; + +procedure ReadMatr(var m: integer; var a: array of array of real); +begin + read(m); + SetLength(a, m); + for var i := 0 to m - 1 do + a[i] := ReadArrReal(m); +end; + +procedure ReadMatr(var m: integer; var a: array of array of string); +begin + read(m); + SetLength(a, m); + for var i := 0 to m - 1 do + a[i] := ReadArrString(m); +end; + +procedure ReadMatr(var m, n: integer; var a: List>); +begin + read(m); read(n); + a := new List>(m); + for var i := 0 to m - 1 do + a.Add(ReadSeqInteger(n).ToList); +end; + +procedure ReadMatr(var m, n: integer; var a: List>); +begin + read(m); read(n); + a := new List>(m); + for var i := 0 to m - 1 do + a.Add(ReadSeqReal(n).ToList); +end; + +procedure ReadMatr(var m, n: integer; var a: List>); +begin + read(m); read(n); + a := new List>(m); + for var i := 0 to m - 1 do + a.Add(ReadSeqString(n).ToList); +end; + +procedure ReadMatr(var m: integer; var a: List>); +begin + read(m); + a := new List>(m); + for var i := 0 to m - 1 do + a.Add(ReadSeqInteger(m).ToList); +end; + +procedure ReadMatr(var m: integer; var a: List>); +begin + read(m); + a := new List>(m); + for var i := 0 to m - 1 do + a.Add(ReadSeqReal(m).ToList); +end; + +procedure ReadMatr(var m: integer; var a: List>); +begin + read(m); + a := new List>(m); + for var i := 0 to m - 1 do + a.Add(ReadSeqString(m).ToList); +end; + +procedure WriteMatr(a: array[,] of T); +begin + for var i := 0 to a.GetLength(0)-1 do + for var j := 0 to a.GetLength(1)-1 do + write(a[i,j]); +end; + +procedure WriteMatr(a: array of array of T); +begin + for var i := 0 to a.Length-1 do + for var j := 0 to a[i].Length-1 do + write(a[i][j]); +end; + +procedure WriteMatr(a: List>); +begin + for var i := 0 to a.Count-1 do + for var j := 0 to a[i].Count-1 do + write(a[i][j]); +end; /// Выводит размер и элементы последовательности -procedure System.Collections.Generic.IEnumerable.WriteAll(); +procedure WriteAll(self: sequence of T); extensionmethod; begin var b := self.ToArray(); PT4.Put(b.Length); @@ -1510,7 +1722,7 @@ begin end; /// Выводит элементы последовательности -procedure System.Collections.Generic.IEnumerable.Write(); +procedure Write(self: sequence of T); extensionmethod; begin var b := self.ToArray(); foreach e : T in b do diff --git a/TestSuite/callnoparams.pas b/TestSuite/callnoparams.pas index b3e1d3ea5..12dc8ded9 100644 --- a/TestSuite/callnoparams.pas +++ b/TestSuite/callnoparams.pas @@ -11,4 +11,8 @@ begin assert(s.Count = s.Length); var j := s.Count; assert(j = s.Count); + s := 'abcdef'; + var q1 := s.Min; + assert(q1 = 'a'); + assert(s.Min = 'a'); end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index bb5cfbb1d..9f042540b 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -1567,6 +1567,10 @@ namespace PascalABCCompiler.TreeConverter else fnl.AddElement(fn); } + } + else + { + } si = si.Next; } @@ -8445,16 +8449,24 @@ namespace PascalABCCompiler.TreeConverter } else { + function_node[] empty_param_methods = dm.empty_param_methods; + SymbolInfo si = new SymbolInfo(empty_param_methods[0]); + SymbolInfo root_si = si; + for (int i = 1; i < empty_param_methods.Length; i++) + { + si.Next = new SymbolInfo(empty_param_methods[i]); + si = si.Next; + } compiled_function_node cfn = fn as compiled_function_node; if ((fn.parameters.Count == 1 || cfn != null && fn.parameters.Count == 2 && cfn.ConnectedToType != null) && (fn.parameters[fn.parameters.Count - 1].is_params || fn.parameters[fn.parameters.Count - 1].default_value != null)) { - fn = convertion_data_and_alghoritms.select_function(bfc.parameters, new SymbolInfo(fn), bfc.location); + fn = convertion_data_and_alghoritms.select_function(bfc.parameters, root_si, bfc.location); bfc = create_static_method_call_with_params(fn, bfc.location, fn.return_value_type, true, bfc.parameters); } else if (fn.parameters.Count == 1 && cfn != null && cfn.ConnectedToType != null) { - fn = convertion_data_and_alghoritms.select_function(bfc.parameters, new SymbolInfo(fn), bfc.location); + fn = convertion_data_and_alghoritms.select_function(bfc.parameters, root_si, bfc.location); bfc = create_static_method_call_with_params(fn, bfc.location, fn.return_value_type, true, bfc.parameters); } } diff --git a/TreeConverter/TreeRealization/types.cs b/TreeConverter/TreeRealization/types.cs index c7e2b9ce7..31c5b50b4 100644 --- a/TreeConverter/TreeRealization/types.cs +++ b/TreeConverter/TreeRealization/types.cs @@ -3871,6 +3871,36 @@ namespace PascalABCCompiler.TreeRealization } } + public function_node[] empty_param_methods + { + get + { + List funcs = new List(); + foreach (base_function_call bfc in _proper_methods) + { + if (bfc.simple_function_node.parameters.Count == 0 || bfc.simple_function_node.parameters.Count == 1 && (bfc.simple_function_node.parameters[0].default_value != null || bfc.simple_function_node.parameters[0].is_params)) + { + funcs.Add(bfc.simple_function_node); + } + else if (bfc.function is common_namespace_function_node) + { + common_namespace_function_node cnfn = bfc.function as common_namespace_function_node; + if (cnfn.ConnectedToType != null && (bfc.simple_function_node.parameters.Count == 1 || bfc.simple_function_node.parameters.Count == 2 && (bfc.simple_function_node.parameters[1].is_params || bfc.simple_function_node.parameters[1].default_value != null))) + { + funcs.Add(bfc.simple_function_node); + } + } + else if (bfc.function is compiled_function_node) + { + compiled_function_node cfn = bfc.function as compiled_function_node; + if (cfn.ConnectedToType != null && (bfc.simple_function_node.parameters.Count == 1 || bfc.simple_function_node.parameters.Count == 2 && (bfc.simple_function_node.parameters[1].is_params || bfc.simple_function_node.parameters[1].default_value != null))) + funcs.Add(bfc.simple_function_node); + } + } + return funcs.ToArray(); + } + } + public base_function_call empty_param_method { get