How does the compiler know that the comma in a function call is not a comma operator?

c, comma-operator, compiler-construction, function

Solution

Look at the grammar for the C language. It's listed, in full, in Appendix A of the standard. The way it works is that you can step through each token in a C program and match them up with the next item in the grammar. At each step you have only a limited number of options, so the interpretation of any given character will depend on the context in which it appears. Inside each rule in the grammar, each line gives a valid alternative for the program to match.

Specifically, if you look for `parameter-list`, you will see that it contains an explicit comma. Therefore, whenever the compiler's C parser is in "parameter-list" mode, commas that it finds will be understood as parameter separators, not as comma operators. The same is true for brackets (that can also occur in expressions).

This works because the `parameter-list` rule is careful to use `assignment-expression` rules, rather than just the plain `expression` rule. An `expression` can contain commas, whereas an `assignment-expression` cannot. If this were not the case the grammar would be ambiguous, and the compiler would not know what to do when it encountered a comma inside a parameter list.

However, an opening bracket, for example, that is not part of a function definition/call, or an `if`, `while`, or `for` statement, will be interpreted as part of an expression (because there's no other option, but only if the start of an expression is a valid choice at that point), and then, inside the brackets, the `expression` syntax rules will apply, and that allows comma operators.

Problem

Consider the function call (calling `int sum(int, int)`) ``` printf("%d", sum(a,b)); ``` How does the compiler decide that the `,` used in the function call `sum(int, int)` is not a comma operator? NOTE: I didn't want to actually use the comma operator in the function call. I just wanted to know how the compiler knows that it is not a comma operator.

Original source

Related problems