Проблема не должна возникать, пока вы не увидите identifier ( identifier
с прогнозом ,
или )
.В этот момент парсер должен решить, уменьшать ли второй идентификатор как function_definition_argument
или expression
(чтобы стать function_argument
).
Вы можете решите это чисто в грамматике грубой силой, но это приведет вас в лабиринт нетерминалов, таких как expression_not_naked_identifier
и ambiguous_begining_of_function_defn_or_call
, с результирующим безудержным дублированием семантических действий.
Вероятно, было бы большесопровождаемые (и приводящие к более понятным сообщениям об ошибках синтаксиса), чтобы написать что-то вроде
definition_or_call_start: identifier '(' generic_argument_list ')'
generic_argument_list: generic_argument
| generic_argument_list ',' generic_argument
generic_argument: expression
| function_argument_core
| ...
function_call: definition_or_call_start ';';
function_definition : definition_or_call_start '{' '}';
и затем проверить как семантическое ограничение в действии для двух последних производств, что фактический generic_arguments
, который вы проанализировали, соответствуетиспользовать их.