BNF is a notation for giving a precise definition of the syntax of a programming language, as well how programs in that language are structured.

BNF does not tell everything about which programs are acceptable because it ignores issues such as type checking and whether variables that are used have been declared. It also does not say what programs mean, or what they do when you run them.