function ReadInteger2(message: string): (integer,integer);

и
вынос повторяющихся вычислений в ?.
This commit is contained in:
miks1965 2017-06-17 00:47:08 +03:00
parent 18447ac9d9
commit be24727b97
11 changed files with 181 additions and 21 deletions

View file

@ -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;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=1483
%MINOR%=2
%REVISION%=1486
%COREVERSION%=0
%MAJOR%=3

Binary file not shown.

View file

@ -1 +1 @@
!define VERSION '3.2.0.1483'
!define VERSION '3.2.0.1486'

View file

@ -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<statement>();
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);
}
}*/
}
}

View file

@ -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

Binary file not shown.

View file

@ -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

View file

@ -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

View file

@ -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=Оператор ?. может применяться только к ссылочным типам
OPERATOR_DQ_MUST_BE_USED_WITH_A_REFERENCE_TYPE_VALUETYPE=Левый операнд операции ?. должен иметь ссылочный тип

Binary file not shown.