diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 7e6970c98..8d2a5d2db 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "2"; public const string Build = "0"; - public const string Revision = "1483"; + public const string Revision = "1486"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 6ba260d62..d64d7606b 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=0 -%REVISION%=1483 %MINOR%=2 +%REVISION%=1486 +%COREVERSION%=0 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index 5f475bef3..2950c4c02 100644 Binary files a/Localization/DefaultLang.resources and b/Localization/DefaultLang.resources differ diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index f2ab121ad..0c9d35374 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.2.0.1483' +!define VERSION '3.2.0.1486' diff --git a/SyntaxVisitors/SugarVisitors/QuestionPointDesugarVisitor.cs b/SyntaxVisitors/SugarVisitors/QuestionPointDesugarVisitor.cs index 30d65e7ad..df60cf60f 100644 --- a/SyntaxVisitors/SugarVisitors/QuestionPointDesugarVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/QuestionPointDesugarVisitor.cs @@ -60,20 +60,6 @@ namespace SyntaxVisitors.SugarVisitors return q; } - public question_colon_expression ConvertToQCE1(dot_question_node dqn) - { - addressed_value left = dqn.left; - addressed_value right = dqn.right; - - var eq = new bin_expr(left, new nil_const(), Operators.Equal, left.source_context); - - var nr = Into(left, right); - - var q = new question_colon_expression(eq, new nil_const(), nr, dqn.source_context); - nr.Parent = q; - return q; - } - public addressed_value Into(addressed_value x, addressed_value v) // При возникновении новой конструкции в грамматике variable добавить обработку сюда { if (v.GetType() == typeof(dot_question_node)) @@ -131,12 +117,68 @@ namespace SyntaxVisitors.SugarVisitors } } + private int num = 0; + + public string UniqueNumStr() + { + num++; + return num.ToString(); + } + + + /*public question_colon_expression ConvertToQCE1(dot_question_node dqn) + { + addressed_value left = dqn.left; + addressed_value right = dqn.right; + + var eq = new bin_expr(left, new nil_const(), Operators.Equal, left.source_context); + + var nr = Into(left, right); + + var q = new question_colon_expression(eq, new nil_const(), nr, dqn.source_context); + nr.Parent = q; + return q; + }*/ + + public question_colon_expression ConvertToQCE1(dot_question_node dqn, string name) + { + addressed_value right = dqn.right; + + var eq = new bin_expr(new ident(name), new nil_const(), Operators.Equal, dqn.left.source_context); + + var nr = Into(new ident(name), right); + + var q = new question_colon_expression(eq, new nil_const(), nr, dqn.source_context); + nr.Parent = q; + return q; + } + public override void visit(dot_question_node dqn) + { + var st = dqn.Parent; + while (!(st is statement)) + st = st.Parent; + var tname = "#dqn_temp" + UniqueNumStr(); + var tt = new var_statement(new ident(tname), dqn.left); + tt.var_def.Parent = tt; + var l = new List(); + l.Add(tt); + l.Add(st as statement); + + var qce = ConvertToQCE1(dqn, tname); + var sug = sugared_addressed_value.NewP(dqn, qce, dqn.source_context); + ReplaceUsingParent(dqn, sug); + visit(qce); + + ReplaceStatementUsingParent(st as statement, l); + visit(tt); + } + /*public override void visit(dot_question_node dqn) { var qce = ConvertToQCE1(dqn); var sug = sugared_addressed_value.NewP(dqn, qce, dqn.source_context); ReplaceUsingParent(dqn, sug); visit(qce); - } + }*/ } } diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 47001aeea..ff96171a5 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -590,15 +590,57 @@ function ReadlnChar2: (char,char); /// Возвращает кортеж из двух значений типа string, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnString2: (string,string); +/// Возвращает кортеж из трёх значений типа integer, введенных с клавиатуры function ReadInteger3: (integer,integer,integer); +/// Возвращает кортеж из трёх значений типа real, введенных с клавиатуры function ReadReal3: (real,real,real); +/// Возвращает кортеж из трёх значений типа char, введенных с клавиатуры function ReadChar3: (char,char,char); +/// Возвращает кортеж из трёх значений типа string, введенных с клавиатуры function ReadString3: (string,string,string); +/// Возвращает кортеж из двух значений типа integer, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnInteger3: (integer,integer,integer); +/// Возвращает кортеж из двух значений типа real, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnReal3: (real,real,real); +/// Возвращает кортеж из двух значений типа char, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnChar3: (char,char,char); +/// Возвращает кортеж из двух значений типа string, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnString3: (string,string,string); +/// Возвращает кортеж из двух значений типа integer, введенных с клавиатуры +function ReadInteger2(message: string): (integer,integer); +/// Возвращает кортеж из двух значений типа real, введенных с клавиатуры +function ReadReal2(message: string): (real,real); +/// Возвращает кортеж из двух значений типа char, введенных с клавиатуры +function ReadChar2(message: string): (char,char); +/// Возвращает кортеж из двух значений типа string, введенных с клавиатуры +function ReadString2(message: string): (string,string); +/// Возвращает кортеж из двух значений типа integer, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnInteger2(message: string): (integer,integer); +/// Возвращает кортеж из двух значений типа real, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnReal2(message: string): (real,real); +/// Возвращает кортеж из двух значений типа char, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnChar2(message: string): (char,char); +/// Возвращает кортеж из двух значений типа string, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnString2(message: string): (string,string); + +/// Возвращает кортеж из трёх значений типа integer, введенных с клавиатуры +function ReadInteger3(message: string): (integer,integer,integer); +/// Возвращает кортеж из трёх значений типа real, введенных с клавиатуры +function ReadReal3(message: string): (real,real,real); +/// Возвращает кортеж из трёх значений типа char, введенных с клавиатуры +function ReadChar3(message: string): (char,char,char); +/// Возвращает кортеж из трёх значений типа string, введенных с клавиатуры +function ReadString3(message: string): (string,string,string); +/// Возвращает кортеж из двух значений типа integer, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnInteger3(message: string): (integer,integer,integer); +/// Возвращает кортеж из двух значений типа real, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnReal3(message: string): (real,real,real); +/// Возвращает кортеж из двух значений типа char, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnChar3(message: string): (char,char,char); +/// Возвращает кортеж из двух значений типа string, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnString3(message: string): (string,string,string); + /// Выводит приглашение к вводу и возвращает значение типа integer, введенное с клавиатуры function ReadInteger(prompt: string): integer; @@ -4647,6 +4689,23 @@ function ReadlnReal3 := (ReadReal,ReadReal,ReadlnReal); function ReadlnChar3 := (ReadChar,ReadChar,ReadlnChar); function ReadlnString3 := (ReadString,ReadString,ReadlnString); +function ReadInteger2(message: string) := (ReadInteger(message),ReadInteger); +function ReadReal2(message: string) := (ReadReal(message),ReadReal); +function ReadChar2(message: string) := (ReadChar(message),ReadChar); +function ReadString2(message: string) := (ReadString(message),ReadString); +function ReadlnInteger2(message: string) := (ReadInteger(message),ReadlnInteger); +function ReadlnReal2(message: string) := (ReadReal(message),ReadlnReal); +function ReadlnChar2(message: string) := (ReadChar(message),ReadlnChar); +function ReadlnString2(message: string) := (ReadString(message),ReadlnString); +function ReadInteger3(message: string) := (ReadInteger(message),ReadInteger,ReadInteger); +function ReadReal3(message: string) := (ReadReal(message),ReadReal,ReadReal); +function ReadChar3(message: string) := (ReadChar(message),ReadChar,ReadChar); +function ReadString3(message: string) := (ReadString(message),ReadString,ReadString); +function ReadlnInteger3(message: string) := (ReadInteger(message),ReadInteger,ReadlnInteger); +function ReadlnReal3(message: string) := (ReadReal(message),ReadReal,ReadlnReal); +function ReadlnChar3(message: string) := (ReadChar(message),ReadChar,ReadlnChar); +function ReadlnString3(message: string) := (ReadString(message),ReadString,ReadlnString); + // Read with prompt diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index 1fd4c920a..198eead25 100644 Binary files a/bin/Lib/PABCRtl.dll and b/bin/Lib/PABCRtl.dll differ diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 47001aeea..ff96171a5 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -590,15 +590,57 @@ function ReadlnChar2: (char,char); /// Возвращает кортеж из двух значений типа string, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnString2: (string,string); +/// Возвращает кортеж из трёх значений типа integer, введенных с клавиатуры function ReadInteger3: (integer,integer,integer); +/// Возвращает кортеж из трёх значений типа real, введенных с клавиатуры function ReadReal3: (real,real,real); +/// Возвращает кортеж из трёх значений типа char, введенных с клавиатуры function ReadChar3: (char,char,char); +/// Возвращает кортеж из трёх значений типа string, введенных с клавиатуры function ReadString3: (string,string,string); +/// Возвращает кортеж из двух значений типа integer, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnInteger3: (integer,integer,integer); +/// Возвращает кортеж из двух значений типа real, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnReal3: (real,real,real); +/// Возвращает кортеж из двух значений типа char, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnChar3: (char,char,char); +/// Возвращает кортеж из двух значений типа string, введенных с клавиатуры, и переходит на следующую строку ввода function ReadlnString3: (string,string,string); +/// Возвращает кортеж из двух значений типа integer, введенных с клавиатуры +function ReadInteger2(message: string): (integer,integer); +/// Возвращает кортеж из двух значений типа real, введенных с клавиатуры +function ReadReal2(message: string): (real,real); +/// Возвращает кортеж из двух значений типа char, введенных с клавиатуры +function ReadChar2(message: string): (char,char); +/// Возвращает кортеж из двух значений типа string, введенных с клавиатуры +function ReadString2(message: string): (string,string); +/// Возвращает кортеж из двух значений типа integer, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnInteger2(message: string): (integer,integer); +/// Возвращает кортеж из двух значений типа real, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnReal2(message: string): (real,real); +/// Возвращает кортеж из двух значений типа char, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnChar2(message: string): (char,char); +/// Возвращает кортеж из двух значений типа string, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnString2(message: string): (string,string); + +/// Возвращает кортеж из трёх значений типа integer, введенных с клавиатуры +function ReadInteger3(message: string): (integer,integer,integer); +/// Возвращает кортеж из трёх значений типа real, введенных с клавиатуры +function ReadReal3(message: string): (real,real,real); +/// Возвращает кортеж из трёх значений типа char, введенных с клавиатуры +function ReadChar3(message: string): (char,char,char); +/// Возвращает кортеж из трёх значений типа string, введенных с клавиатуры +function ReadString3(message: string): (string,string,string); +/// Возвращает кортеж из двух значений типа integer, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnInteger3(message: string): (integer,integer,integer); +/// Возвращает кортеж из двух значений типа real, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnReal3(message: string): (real,real,real); +/// Возвращает кортеж из двух значений типа char, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnChar3(message: string): (char,char,char); +/// Возвращает кортеж из двух значений типа string, введенных с клавиатуры, и переходит на следующую строку ввода +function ReadlnString3(message: string): (string,string,string); + /// Выводит приглашение к вводу и возвращает значение типа integer, введенное с клавиатуры function ReadInteger(prompt: string): integer; @@ -4647,6 +4689,23 @@ function ReadlnReal3 := (ReadReal,ReadReal,ReadlnReal); function ReadlnChar3 := (ReadChar,ReadChar,ReadlnChar); function ReadlnString3 := (ReadString,ReadString,ReadlnString); +function ReadInteger2(message: string) := (ReadInteger(message),ReadInteger); +function ReadReal2(message: string) := (ReadReal(message),ReadReal); +function ReadChar2(message: string) := (ReadChar(message),ReadChar); +function ReadString2(message: string) := (ReadString(message),ReadString); +function ReadlnInteger2(message: string) := (ReadInteger(message),ReadlnInteger); +function ReadlnReal2(message: string) := (ReadReal(message),ReadlnReal); +function ReadlnChar2(message: string) := (ReadChar(message),ReadlnChar); +function ReadlnString2(message: string) := (ReadString(message),ReadlnString); +function ReadInteger3(message: string) := (ReadInteger(message),ReadInteger,ReadInteger); +function ReadReal3(message: string) := (ReadReal(message),ReadReal,ReadReal); +function ReadChar3(message: string) := (ReadChar(message),ReadChar,ReadChar); +function ReadString3(message: string) := (ReadString(message),ReadString,ReadString); +function ReadlnInteger3(message: string) := (ReadInteger(message),ReadInteger,ReadlnInteger); +function ReadlnReal3(message: string) := (ReadReal(message),ReadReal,ReadlnReal); +function ReadlnChar3(message: string) := (ReadChar(message),ReadChar,ReadlnChar); +function ReadlnString3(message: string) := (ReadString(message),ReadString,ReadlnString); + // Read with prompt diff --git a/bin/Lng/Eng/SemanticErrors_ms.dat b/bin/Lng/Eng/SemanticErrors_ms.dat index 44871ca1e..c21b23f34 100644 --- a/bin/Lng/Eng/SemanticErrors_ms.dat +++ b/bin/Lng/Eng/SemanticErrors_ms.dat @@ -11,4 +11,4 @@ ONE_TKIDENTIFIER=Type here must be identifier SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR=Sugared node {0} must not be visited in syntax_tree_visitor MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}=Missed semantic check for sugared node {0} TUPLE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Count of Tuple elements must be <=7 - +OPERATOR_DQ_MUST_BE_USED_WITH_A_REFERENCE_TYPE_VALUETYPE=Left operand of ?. operation must have reference type diff --git a/bin/Lng/Rus/SemanticErrors_ms.dat b/bin/Lng/Rus/SemanticErrors_ms.dat index c177a3118..68abbbf14 100644 --- a/bin/Lng/Rus/SemanticErrors_ms.dat +++ b/bin/Lng/Rus/SemanticErrors_ms.dat @@ -11,4 +11,4 @@ ONE_TKIDENTIFIER=В качестве типа ожидался идентифи SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR=Сахарный узел {0} не должен обходиться в syntax_tree_visitor. Обратитесь к разработчикам PascalABC.NET MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}=Отсутствует семантическая проверка для сахарного узла {0} TUPLE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Количество элементов кортежа не должно быть больше 7 -OPERATOR_DQ_MUST_BE_USED_WITH_A_REFERENCE_TYPE_VALUETYPE=Оператор ?. может применяться только к ссылочным типам \ No newline at end of file +OPERATOR_DQ_MUST_BE_USED_WITH_A_REFERENCE_TYPE_VALUETYPE=Левый операнд операции ?. должен иметь ссылочный тип \ No newline at end of file diff --git a/bin/PascalABCNET.chm b/bin/PascalABCNET.chm index 7c6136456..eb2675864 100644 Binary files a/bin/PascalABCNET.chm and b/bin/PascalABCNET.chm differ