Это похоже на то, что аргументы вызова функции определены в грамматике BNF?

#c #bnf #compiler-construction

#c #bnf #компилятор-конструкция

Вопрос:

Читая грамматику BNF этого C, я не понял, какая часть этого:

 | postfix_exp '(' argument_exp_list ')'
| postfix_exp '('           ')'
  

обрабатывает также вызов функции, подобный id(exp, exp) and id() . Это единственная комбинация, допустимая в синтаксисе C, или я что-то упускаю? если да, то почему бы просто:

 | id '(' argument_exp_list ')'
| id '('            ')' 
  

Комментарии:

1. Вы можете вызвать функцию через указатель на функцию, который может быть произвольно сложным выражением, а не просто «id».

Ответ №1:

Грамматика BNF id '(' argument_exp_list ')' фактически эквивалентна postfix_exp '(' argument_exp_list ')' where postfix_exp может быть a primary_exp , как указано в его l-значении.

 postfix_exp     : primary_exp
                | postfix_exp '[' exp ']'
                | postfix_exp '(' argument_exp_list ')'
                | postfix_exp '('           ')'
                | postfix_exp '.' id
                | postfix_exp '->' id
                | postfix_exp '  '
                | postfix_exp '--'
  

где primary_exp :

 primary_exp     : id
                | const
                | string
                | '(' exp ')'