Regardez la grammaire pour le langage C. Il a énuméré, dans son intégralité, dans l'Annexe A de la norme. La façon dont cela fonctionne est que vous pouvez parcourir chaque jeton dans un programme C et de les relier à l'élément suivant dans la grammaire. À chaque étape, vous avez seulement un nombre limité d'options, de sorte que l'interprétation d'un personnage donné dépendra du contexte dans lequel il apparaît. À l'intérieur de chaque règle de la grammaire, chaque ligne donne une alternative valable pour le programme de match.
Plus précisément, si vous recherchez parameter-list
, vous verrez qu'il contient explicite d'une virgule. Par conséquent, chaque fois que le compilateur C de l'analyseur est dans "paramètres-liste" mode, des virgules qu'il trouve seront considérés comme des séparateurs de paramètre, non pas comme des virgules opérateurs. Le même est vrai pour les crochets (qui peut également se produire dans des expressions).
Cela fonctionne parce que l' parameter-list
règle est prudent d'utiliser assignment-expression
règles, plutôt que de simplement la plaine expression
règle. Un expression
peut contenir des virgules, alors qu'un assignment-expression
ne le peuvent pas. Si ce n'était pas le cas de la grammaire d'être ambigu, et le compilateur ne sais pas quoi faire quand il a rencontré une virgule à l'intérieur d'une liste de paramètres.
Cependant, un crochet ouvrant, par exemple, qui n'est pas partie de la définition d'une fonction/d'appel, ou un if
, while
ou for
déclaration, sera interprétée comme une partie d'une expression (car il n'y a pas d'autre option, mais seulement si le début d'une expression est un choix valide à ce point), puis, entre parenthèses, le expression
règles de syntaxe s'applique, et qui permet à virgule opérateurs.