#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 ')'