Комментарии к select_function
proc_func_call узел в грамматике - давно пора
This commit is contained in:
parent
a54d2c5b63
commit
19999eb0ca
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%MINOR%=8
|
||||
%REVISION%=3269
|
||||
%COREVERSION%=3
|
||||
%REVISION%=3270
|
||||
%MINOR%=8
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -362,5 +362,6 @@ script=
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.8.3.3269
|
||||
3.8.3.3270
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.8.3.3269'
|
||||
!define VERSION '3.8.3.3270'
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue