Комментарии к select_function

proc_func_call узел в грамматике - давно пора
This commit is contained in:
Mikhalkovich Stanislav 2023-05-03 23:25:59 +03:00
parent a54d2c5b63
commit 19999eb0ca
9 changed files with 2638 additions and 2608 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "8";
public const string Build = "3";
public const string Revision = "3269";
public const string Revision = "3270";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=8
%REVISION%=3269
%COREVERSION%=3
%REVISION%=3270
%MINOR%=8
%MAJOR%=3

View file

@ -2,7 +2,7 @@
// This CSharp output file generated by Gardens Point LEX
// Version: 1.1.3.301
// Machine: DESKTOP-G8V08V4
// DateTime: 02.05.2023 10:57:47
// DateTime: 03.05.2023 20:40:49
// UserName: ?????????
// GPLEX input file <ABCPascal.lex>
// GPLEX frame file <embedded resource>

View file

@ -90,7 +90,7 @@
%type <stn> enumeration_id_list
%type <ex> const_simple_expr term term1 typed_const typed_const_plus typed_var_init_expression expr expr_with_func_decl_lambda expr_with_func_decl_lambda_ass const_expr const_relop_expr elem range_expr const_elem array_const factor factor_without_unary_op relop_expr expr_dq
%type <ex> lambda_unpacked_params expr_l1 expr_l1_or_unpacked expr_l1_func_decl_lambda expr_l1_for_lambda simple_expr range_term range_factor
%type <ex> external_directive_ident init_const_expr case_label variable var_reference /*optional_write_expr*/ optional_read_expr simple_expr_or_nothing var_question_point expr_l1_for_question_expr expr_l1_for_new_question_expr
%type <ex> external_directive_ident init_const_expr case_label variable proc_func_call var_reference /*optional_write_expr*/ optional_read_expr simple_expr_or_nothing var_question_point expr_l1_for_question_expr expr_l1_for_new_question_expr
%type <ob> for_cycle_type
%type <ex> format_expr format_const_expr const_expr_or_nothing /* simple_expr_with_deref_or_nothing simple_expr_with_deref expr_l1_for_indexer*/
%type <stn> foreach_stmt
@ -1463,7 +1463,7 @@ range_factor
}
| literal
{ $$ = $1; }
| range_factor tkRoundOpen const_elem_list tkRoundClose
| range_factor tkRoundOpen const_elem_list tkRoundClose // f(1)..f(2) - ñòðàííî - âûçîâû ôóíêöèé òóò âðîäå çàïðåùåíû
{
$$ = new method_call($1 as addressed_value, $3 as expression_list, @$);
}
@ -4254,7 +4254,16 @@ var_with_init_for_expr_with_let_list
$$ = $1;
}
;
proc_func_call
: variable tkRoundOpen optional_expr_list_func_param tkRoundClose
{
if ($1 is index)
parsertools.AddErrorFromResource("UNEXPECTED_SYMBOL{0}", @1, "^");
$$ = new method_call($1 as addressed_value,$3 as expression_list, @$);
}
;
variable
: identifier
{ $$ = $1; }
@ -4352,12 +4361,8 @@ variable
{
$$ = new array_const_new($2 as expression_list, @$);
}
| variable tkRoundOpen optional_expr_list_func_param tkRoundClose
{
if ($1 is index)
parsertools.AddErrorFromResource("UNEXPECTED_SYMBOL{0}", @1, "^");
$$ = new method_call($1 as addressed_value,$3 as expression_list, @$);
}
| proc_func_call
{ $$ = $1; }
| variable tkPoint identifier_keyword_operatorname
{
if ($1 is index)

File diff suppressed because it is too large Load diff

View file

@ -362,5 +362,6 @@ script=

View file

@ -1 +1 @@
3.8.3.3269
3.8.3.3270

View file

@ -1 +1 @@
!define VERSION '3.8.3.3269'
!define VERSION '3.8.3.3270'

View file

@ -2886,6 +2886,24 @@ namespace PascalABCCompiler.TreeConverter
if (err_out != null)
return AddError<function_node>(err_out);
return list[0];
// для именованных параметров последовательность может быть такая
// Если именованных параметров при вызове нет, то - этот алгоритм. Если есть, то
// 1. Оставить только неименованные параметры и вызвать select_function_helper
// Если не найдено ни одной функции, то ошибка и выход
// Если найдена одна функция и это ошибка, то её и кинуть - выход
// Если найдена одна функция и ошибки нет или найдено две и более функций (с ошибкой разумеется), то
// 2. Ищем среди найденных функций только те, в которых среди оставшихся после основных параметрах по умолчанию
// есть параметры по умолчанию ровно с такими же именами как и именованные параметры при вызове
// Повторяющиеся именованные параметры при вызове отсекать ранее
// 3. Думаю, так: если не осталось ни одной функции, то - ошибка
// Если осталось более одной функции, то - ошибка.
// Если осталась ровно одна функция, то
// 4. Сформировать вызов такой функции с полными семантическими параметрами. Вместо параметров по умолчанию
// подставить их значнеия, именованных параметров подставить ИХ значения.
// И вызвать select_function_helper. И либо он вернет ошибку либо единственную правильную функцию
// Основная проблема: parameters - это параметры при вызове, в них нет имён, это семантика
// Взять недостающие значения по умолчанию из functions[0] и заменить именованные их значениями
// В parameters как-то по особому хранить именованные и первый раз не учитывать
}
private int get_type_distance(type_node from, type_node to)